插值matrix

道歉,如果我失去了一些非常明显的东西(可能!),但是在两个matrix之间进行插值有什么错误:

float d = (float)(targetTime.Ticks - keyframe_start.ticks) / (float)(keyframe_end.ticks - keyframe_start.ticks); return ((keyframe_start.Transform * (1 - d)) + (keyframe_end.Transform * d)); 

正如在我的应用程序中,当我尝试使用这个在两个关键帧之间进行插值时,模型开始“缩小” – 根据目标时间在两个关键帧之间有多远的严重程度; 当变换分裂为〜50/50时最差。

简而言之,matrix的线性插值并不总是一个好主意。 如果您正在尝试完成一个animation,而且您正在使用matrix处理骨骼旋转,则不能只是将它们进行线性组合。 您需要使用slerp,提取旋转轴并插入角度并重新计算旋转matrix,否则您只需要使用四元数。 平移是线性的,旋转不是(小角度θ除外)。

这是一个matrix和3D应用程序的好书面

像这样插入matrix不会给出有用的结果,特别是对于涉及旋转的任何事情。 理想情况下,您想要将animation分解为其他格式(例如旋转的四元数),然后在构建matrix之前插入该格式。

下面是我在OP问题的评论部分写的评论中的一个图解例子。 当代表d值的刻度从一个向量到另一个向量均匀进行时,角度变化(红线)不均匀。 序列中间附近的变化比末端附近的变化更大。 所以插值向量的animation将慢慢开始,在中间加速,然后慢慢地结束。 如果开始和结束之间的角度不是很大,则可能不明显。

插值向量的不同长度(红线)是模型缩小的原因,因为它们会将模型缩放到其长度。

如果使用四元数,则蓝线将从vec A到vec B,每个tick将引起相等的角度变化以及沿着圆弧的相等距离​​。 在这里输入图像描述