SLERP 和骨骼动画插值帮助!

SLERP & skeletal animation interpolation help!

本文关键字:插值 帮助 动画 SLERP      更新时间:2023-10-16

我在我的程序中有骨骼动画工作得很好,但我在4x4矩阵之间插值,以线性的方式为帧之间的每个骨骼存储,即


bMatrix bMathbMathInterpolate(bMatrix const * const p_a,bMatrix const * const p_b, float p_delta)
{
    bMatrix l_mat;
   for(unsigned char i = 0;i lessthan (edit: sorry less than symbol break it) 16;i++)
         l_mat.m_values[i] = bMathInterpolate(p_a->m_values[i], p_b->m_values[i], p_delta);
   return l_mat;
}

这是可以的,除非在矩阵中有大量的旋转——模型在关键帧之间会稍微被压扁。

因此,我制作了一个单独的插值算法,将4x4矩阵的旋转部分仅转换为四元数,执行SLERP,并将矩阵的旋转部分仅替换为四元数的矩阵版本。对于矩阵的平移部分,我只是用线性插值。

看看结果,这显然是错误的!!:"(

如果你非常了解这一切(不像我自己),你可能会想"不!你不是这样做的!"-如果是这样,请告诉我我做错了什么!!

我不知道如何处理矩阵的平移部分,因为我只能找到告诉你如何在四元数和3x3矩阵之间来回转换的资源。

任何帮助将不胜感激!!!!

您应该能够将矩阵的平移分量转换为向量,然后对它们进行线性插值,然后将旋转分量转换为四元数,并对它们进行slerp(或lerp,或nlerp),然后将结果向量和四元数重新组合回矩阵。

旋转矩阵是行列式为1的正交矩阵。

对于两个变换矩阵之间的值进行朴素插值,不能保证结果矩阵的旋转值是正交的。这意味着,中间转换将不是刚性信息。将应用某种缩放。

附加:示例代码不包含终止递归的基大小写。