2

スケルトンの最終的なボーン マトリックスを見つけるのに苦労しています。

私は自分のバインド ポーズ マトリックスが機能することを知っており、変換マトリックスが機能することを知っていますが、それらを乗算 (複合マトリックスと呼んでいます) してから、それらをその親の複合マトリックス (次にその親の親など) で乗算すると、正しいマトリックスを取得してください。

gl-matrix.js をベクター/マトリックス数学ライブラリとして使用していることに注意してください。そのマトリックス数学は逆に機能し、PositionMatrix * RotationMatrix * ScaleMatrix を必要とするワールド マトリックスを取得します。注文が混み合っているかもしれませんが、

バインド ポーズ マトリックスとボーン変換マトリックスの乗算順序、および最終マトリックスと親マトリックスの順序を変更しようとしましたが、今は気が遠くなりました。

とにかく、この質問をお辞儀で締めくくります。すべての頂点がその相対ボーン空間に事前に変換されているメッシュを考えると、各ボーンはポーズ マトリックスをバインドし、フレームごとの各ボーンはマトリックスを変換します。どうすれば最終的なボーン マトリックスを見つけることができますか?

編集:

まだ問題がありますが、現時点で私がどこにいるのかを言うのに役立つかもしれません.次の疑似コードは、モデルを完全にバインドポーズにします.

finalBones = []
foreach bone in bones
    mat = bone.poseMatrix
    parent = bone
    while (parent.parent != null)
        parent = parent.parent
        mat *= parent.poseMatrix
    finalBones.push(mat)

上記のスニペストは、行列関数を説明する必要なく、まさに何が起こっているかを示しています (その JavaScript は、mat4.copy や mat4.mul などの関数を介して行われます)。

私は次のようなことをしたかどうか考えました

finalBones = []
foreach bone in bones
    mat = bone.poseMatrix
    mat *= bone.transformMatrix
    parent = bone
    while (parent.parent != null)
        parent = parent.parent
        mat *= parent.poseMatrix
        mat *= parent.transformMatrix
    finalBones.push(mat)

私は最終的な行列を取得します (そして、poseMatrices の前に transformMatrices を使用しようとしました) が、脊椎が壊れ、脚が裏返しになっているモデルしか取得できません。

編集2:

さらに詳しく調べてみると、アイドル フレームのボーン変換行列の中央の 2 行が反転していませんか? 奇妙ですが、今それらを元に戻すとどうなるかを調べています

4

1 に答える 1