【发布时间】: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