我的程序中的骨骼动画工作得很好,但是我在线性方式之间在每个骨架之间存储的 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 矩阵之间来回转换的资源。
任何帮助都将非常感谢!!!!
答案 0 :(得分:2)
您应该能够将矩阵的平移分量转换为向量,然后对它们进行线性插值,然后将旋转分量转换为四元数,并将slerp(或lerp或nlerp)转换为它们,然后重新生成结果矢量和quaterion回到矩阵。