具有平移和缩放功能的 2D 相机插值

Interpolation of 2D camera with pan and zoom

我正在开发一个带有 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。这会导致指数插值,其中比例变化随着放大而减慢,这看起来不错,因为场景中的对象随后以恒定速率增长。这是有道理的,因为场景中的对象按比例乘以,而对象按位置添加,因此比例插值必须是乘法的。这是通过在插值之前获取日志来实现的。位置仍然像以前一样是线性的。现在的问题是线两侧的图像部分呈曲线移动。好像不太对(看塔顶)

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

那么有没有标准的方法来做到这一点?

这是 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;

以及由此产生的缩放。