SLERP&骨骼动画插值帮助!

时间:2011-04-28 02:05:25

标签: c++ animation matrix quaternions

我的程序中的骨骼动画工作得很好,但是我在线性方式之间在每个骨架之间存储的 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;
}

哪个是O.K.除非矩阵中存在大量旋转 - 模型在关键帧之间略微压扁。

所以,我做了一个单独的插值算法,而不是将 4x4 矩阵的旋转部分转换为四元数,执行SLERP,并替换旋转部分仅具有四元数矩阵版本的矩阵。对于矩阵的平移部分,我只是以线性方式对其进行插值。

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

如果你非常了解这一切(与我不同),你可能会想“不!那不是你怎么做的!” - 如果是的话,请告诉我我做错了什么!!

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

任何帮助都将非常感谢!!!!

1 个答案:

答案 0 :(得分:2)

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