キーフレームの代わりにトラック(カーブ)を使用して、スケルタルアニメーションシステムを最適化しようとしています。各曲線は特定のコンポーネントを処理し、(今のところ)値を線形補間します。私の骨の位置はうまく機能しますが、クォータニオンコンポーネント補間の「ジャジー」を取り除くのに苦労しています...
基本的に、各ボーンクォータニオンの各コンポーネント(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;
代わりに、または線形補間すると、すべてが正常です...したがって、データは明らかに正しいです...私は困惑しています...
[ 編集 ]
さらに調査した結果、問題はフレームデータに起因することがわかりました...つまり、次のようになりました。
Frame0:quat.x = 0.950497
フレーム1:quat.x = -0.952190
フレーム2:quat.x = 0.953192
これが反転とジャギーの原因です...私はこのケースを検出してデータの符号を反転しようとしましたが、一部のフレームが(描画時に視覚的に)単に奇妙に見えるため、問題を完全に修正することはできません。
曲線を適切に修正する方法はありますか?