2

我的程序中的骨骼动画工作正常,但是我在为每个骨骼存储的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矩阵之间来回转换的资源。

任何帮助都感激不尽!!!!

4

2 回答 2

2

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

于 2011-04-28T05:40:37.660 回答
0

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

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

加:示例代码不包含终止递归的基本情况。

于 2021-09-03T11:53:39.987 回答