【问题标题】:Interpolation of 2D camera with pan and zoom使用平移和缩放对 2D 相机进行插值
【发布时间】:2021-05-06 19:04:12
【问题描述】:

我正在开发一个带有 2D 虚拟相机的动画应用程序。相机视口可以在关键帧中定位和缩放,然后进行插值以渲染最终动画。我正在寻找最好的方法来插入相机的 x,y 位置参数、缩放比例,以便相机转换的场景中的对象以恒定的速率改变大小,并且所有对象都沿直线行进。

从相机的角度渲染场景的变换矩阵是从位置和比例计算如下,其中DimX,DimY是场景图像的维度,Pos和Scale是场景图像的位置和比例相机(我要插值的变量)。

  LCen := PointF(DimX*0.5, DimY*0.5);
  CamTransformInv := TMatrix.CreateTranslation(-(Pos.X + LCen.X), -(Pos.Y + LCen.Y));
  LScaleInv := 1 / Scale;
  CamTransformInv := CamTransformInv * TMatrix.CreateScaling(LScaleInv, LScaleInv);
  CamTransformInv := CamTransformInv * TMatrix.CreateTranslation(LCen.X, LCen.Y);

这是一个通过线性插值比例和位置创建的动画。黑线从第一位置的视口中心延伸到第二位置的视口中心。您可以看到它在放大时似乎加速的效果,我想避免这种情况。从好的方面来说,场景中的所有对象都沿直线移动。我做了动画循环,让加速效果更明显。

所以我修改了我的代码以线性插值比例的 Ln 并获取结果的 Exp。这会导致指数插值,随着缩放的比例变化减慢,这看起来不错,因为场景中的对象随后以恒定速率增长。这是有道理的,因为场景中的对象是按比例相乘的,而对象是按位置相加的,所以比例的插值必须是乘法的。这是通过在插值之前获取日志来实现的。位置仍然像以前一样是线性的。现在的问题是图像的部分到线的两侧以曲线移动。它看起来不正确(参见塔顶)。

我突然想到问题是因为我在非线性插值比例和线性位置。如果我让位置以与秤减速相同的方式减速,那么它看起来是正确的。但是,我想不出这将如何计算,因为位置和比例以复杂的方式耦合在一起。如果没有尺度变化,那么位置应该是线性变化的,但是尺度变化越大,位置的非线性应该越大。

那么有没有标准的方法呢?

【问题讨论】:

    标签: animation math graphics interpolation graphics2d


    【解决方案1】:

    这是answered for me elsewhere。这是我的工作代码。

      CamT.Scale := Exp(LinearInterpolate(Ln(Cam1.Scale), Ln(Cam2.Scale), k));
      if abs(Cam2.Scale - Cam1.Scale) > 0.001 then begin
        r := Cam2.Scale / Cam1.Scale
        w := (Power(r, k) - 1) / (r - 1);
        CamT.Pos.X := LinearInterpolate(Cam1.Pos.X, Cam2.Pos.X, w);
        CamT.Pos.Y := LinearInterpolate(Cam1.Pos.Y, Cam2.Pos.Y, w);
      end else begin
        CamT.Pos.X := LinearInterpolate(Cam1.Pos.X, Cam2.Pos.X, k);
        CamT.Pos.Y := LinearInterpolate(Cam1.Pos.Y, Cam2.Pos.Y, k);
      end;
    

    以及由此产生的缩放。

    【讨论】:

    • 请举一个完整的例子
    • 抱歉,包括我如何制作动画在内的完整示例将需要很长时间,因为我无法分享我的完整代码。这主要是一道数学题,所以我认为我的回答就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多