.x形式を使用してBlenderからモデルをエクスポートすると、メッシュ、アーマチュア、アニメーションをロードできます。ゲームでメッシュを生成してモデルを表示しても問題はありません。さらに、アニメーションとアーマチュアが適切なデータ構造に適切に読み込まれています。
私の問題は、アニメーションをモデルに適切に適用することです。モデルを適用するためのフレームワークと、アニメーションを選択してフレームをステップ実行するためのコードがあります。
私が理解していることからAnimationKey
、AnimationSet
サプライ内のは、バインドポーズをアニメーションフレーム内のポーズに変換する変換を提供します。小さな例として:
Animation {
{Armature_001_Bone}
AnimationKey {
2; //Position
121; //number of frames
0;3; 0.000000, 0.000000, 0.000000;;,
1;3; 0.000000, 0.000000, 0.005524;;,
2;3; 0.000000, 0.000000, 0.022217;;,
...
}
AnimationKey {
0; //Quaternion Rotation
121;
0;4; -0.707107, 0.707107, 0.000000, 0.000000;;,
1;4; -0.697332, 0.697332, 0.015710, 0.015710;;,
2;4; -0.684805, 0.684805, 0.035442, 0.035442;;,
...
}
AnimationKey {
1; //Scale
121;
0;3; 1.000000, 1.000000, 1.000000;;,
1;3; 1.000000, 1.000000, 1.000000;;,
2;3; 1.000000, 1.000000, 1.000000;;,
...
}
}
したがって、フレーム2を適用するには、フレーム2から位置、回転、スケールを取得し、Transform_A
それらから変換行列(と呼びます)を作成し、その行列をArmature_001_Bone
重みで制御される頂点に適用します。だから私はTransformA
私のシェーダーに詰め込み、頂点を変換します。何かのようなもの:
vertexPos = vertexPos * bones[ int(bfs_BoneIndices.x) ] * bfs_BoneWeights.x;
どこbfs_BoneIndices
とbfs_BoneWeights
現在の頂点に固有の値です。
メッシュの頂点をロードするときに、rootTransform
とによってそれらを変換しますmeshTransform
。これにより、バインドポーズを表示するために、向きとスケーリングが正しく行われます。
問題は、その変換マトリックスを(アニメーションの位置、回転、スケールを使用して)作成すると、頂点が適切に変換されないことです。アニメーションデータを使用するだけではありません。また、ボーントランスフォーム階層を適用しようとしましたが、まだダイスはありません。基本的に私はいくつかのねじれたモデルになってしまいます。また、私はopenGLで作業しているため、適用する必要がある可能性のある行列の転置についても検討する必要があります。
.xアニメーションをモデルに適用するために、どのデータが必要で、どのように組み合わせるのですか?
これが役立つ場合に備えて、これがどのように見えるかをいくつかモックアップしました。
最初に翻訳をテストしたかったのですが、これはボブヘッドで、Blenderでは次のようになります。
http://i.stack.imgur.com/NAc4B.gif
そして、それはゲームでどのように見えるか(色を気にしないでください):
http://i.stack.imgur.com/nj2du.gif
次に、回転だけの場合、アニメーションは頭が垂直軸を中心に360度回転します。これはゲームでは次のようになります。
http://i.stack.imgur.com/gVyUW.gif
チルトはなく、メリーゴーランドのような回転のみであることに注意してください。
更新
アニメーションの翻訳部分を動かしています。しかし、それは一種のハックに感じられ、ローテーションに適用する方法がわかりません。
翻訳は次の手順で機能します。
- アニメーションフレームから位置を取得し
y
、z
値を入れ替えます - 変更された位置で変換行列を変換します
- 変換行列を転置する
- 頂点に変換行列を適用する
それがそれがどのように機能するかですが、位置、スケール、回転に対して一般的にどのように機能するはずですか?