我试图通过使用轨迹(曲线)而不是关键帧来优化我的骨骼动画系统。每条曲线都处理一个特定的组件,然后(现在)我线性插值这些值。适合我的骨骼位置,但是我很难摆脱四元数分量插值的“锯齿状”......
基本上,每个骨骼四元数的每个分量(XY 和 Z)都有 1 条曲线,我使用以下代码独立插入 XY 和 Z 曲线:
// Simple lerp... (f is always a value between 0.0f and 1.0f)
return ( curve->data_array[ currentframe ].value * ( 1.0f - f ) ) +
( curve->data_array[ nextframe ].value * f );
当我对四元数 XYZ 进行插值时,我使用以下代码在对其进行归一化之前重建四元数的 W 分量,并在绘制之前将其影响到我的骨骼:
Quaternion QuaternionW( const Quaternion q )
{
Quaternion t = { q.x, q.y, q.z };
float l = 1.0f - ( q.x * q.x ) - ( q.y * q.y ) - ( q.z * q.z );
t.w = ( l < 0.0f ) ? 0.0f : -sqrtf( l );
return t;
}
绘图看起来很好,只是骨头有时会变得很生涩,是不是因为浮点精度?还是重新计算 W 分量?或者我绝对没有办法以这种方式线性插值四元数的每个分量?
ps:附带说明一下,如果我将上面的代码替换为以下代码,则在我的曲线插值函数中:
return curve->data_array[ currentframe ].value;
相反或线性插值,一切都很好......所以数据显然是正确的......我很困惑......
[ 编辑 ]
经过更多研究,我发现问题来自帧数据......我得到了以下内容:
帧 0:quat.x = 0.950497
帧 1:quat.x = -0.952190
帧 2:quat.x = 0.953192
这就是导致反转和锯齿状的原因......我试图检测这种情况并反转数据的符号,但它仍然不能完全解决问题,因为某些帧现在看起来很奇怪(在绘图时视觉上)。
任何想法如何正确修复曲线?