c++ - SLERP & 骨骼动画插值帮助!

标签 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;
}

没关系。除非矩阵中存在大量旋转 - 模型在关键帧之间变得轻微挤压。

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

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

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

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

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

最佳答案

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

关于c++ - SLERP & 骨骼动画插值帮助!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5812797/

相关文章:

jquery - 使用动画更改 Logo

java - 如何创造更真实的爆炸

javascript - 使用 GreenSock (GSAP) 的 float 输入标签

javascript - 使用react显示多维数组/矩阵

c - 如何在C中的while循环中存储数组索引的值

c++ - 当我为我的代码使用 ICC 时链接到 GCC 构建的库

c++ - VS2012 C++ 中奇怪的正则表达式行为

c++ - 在构造函数/解构函数的情况下,“对 vtable 的 undefined reference ”

c++ - dlopen 在具有相同名称的新二进制文件上返回旧句柄

python - 使用 Python 和 NumPy 的非常大的矩阵