我的程序中的骨骼动画运行良好,但我在为帧之间的每个骨骼存储的 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 矩阵之间来回转换的资源。 p>
任何帮助将不胜感激!!!!
最佳答案
你应该可以将矩阵的平移分量转换为 vector ,然后对它们进行线性插值,然后将旋转分量转换为四元数,并对它们进行slerp(或lerp,或nlerp),然后重新组合结果 vector 和四元数返回矩阵。
关于c++ - SLERP & 骨骼动画插值帮助!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5812797/