SLERP 和骨骼动画插值帮助!
SLERP & skeletal animation interpolation help!
我在我的程序中有骨骼动画工作得很好,但我在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矩阵之间来回转换的资源。
任何帮助将不胜感激!!!!
您应该能够将矩阵的平移分量转换为向量,然后对它们进行线性插值,然后将旋转分量转换为四元数,并对它们进行slerp(或lerp,或nlerp),然后将结果向量和四元数重新组合回矩阵。
旋转矩阵是行列式为1的正交矩阵。
对于两个变换矩阵之间的值进行朴素插值,不能保证结果矩阵的旋转值是正交的。这意味着,中间转换将不是刚性信息。将应用某种缩放。
附加:示例代码不包含终止递归的基大小写。
相关文章:
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 将使用太多的纹理插值器 - 带旋转的着色器
- 升压插值条件变量可以虚假唤醒吗?
- 如何获得插值极坐标?
- 如何线性插值到不恒定的目的地
- 向心Catmull-Rom样条曲线插值alpha参数
- 使用 OpenGL 插值数据缓冲区?
- 缩放和插值数组
- 骨骼动画:变换矩阵(collada)之间的插值
- 从一组点C++平面插值
- 从 C++14 到 C++98 的端口字符串插值
- 将矢量的数据扩展到指定大小(插值)
- 双线性插值实现的错误
- 如何避免线性插值"trap"?
- 使用 DirectX 11 插值背景颜色?
- OpenGL 缺陷 - 不需要的插值
- 如何在三角形曲面细分评估着色器中插值 UV 映射坐标?
- 将 N 个公式替换为一个(字符串插值)
- C++ - 处理几何插值中的浮点误差
- SLERP 和骨骼动画插值帮助!