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

行列の平行移動コンポーネントをベクトルに変換し、線形補間してから、回転コンポーネントをクォータニオンに変換し、それらをスラープ(またはlerp、またはnlerp)して、結果のベクトルとクォータリオンを再結合できるはずです。マトリックスに戻ります。

于 2011-04-28T05:40:37.660 に答える
0

回転行列は、行列式が1の直交行列です。

2つの変換行列間の値の素朴な補間は、結果の行列の回転値が直交することを保証しません。つまり、中間変換は厳密な情報ではありません。ある種のスケーリングが適用されます。

プラス:サンプルコードには、再帰を終了するベースケースが含まれていません。

于 2021-09-03T11:53:39.987 に答える