私は Android の OpenGL ES2 で骨格アニメーションを実装しようとしています。私は io_three を使用して Blender からエクスポートされた JSON モデルを持っています。このファイルから読み取ることができます。それぞれのボーン配列には、3 つの float 配列として位置があり、4 つの float 配列とスケールとして四元数回転があります。親である整数、フレームごとに各ボーンマトリックスを処理する階層リストを持つアニメーションもあります。各階層には親とキーのリストがあり、各キーにはボーンと同じコンポーネントがあるため、多くのチュートリアルを読んで作成しました何度も試みましたが、残念ながら成功しませんでした。ロジックを簡単に説明する必要があります。だから私はボーンクラスを持っていて、それぞれがベクトルを持ち、各ボーンの相対行列を取得し、それを親の絶対行列で乗算してボーンの絶対行列を取得し、それを逆にして逆行列を取得できます。各キーに対して同じ計算を行うことはできますが、それらをバインドすることはできません。ボーンと各フレームの関係を理解する必要があります。私の問題はコードではなくロジックにあります。
1 に答える
アニメーション全体の開始時間と終了時間の間にあるアニメーションの一部t
で、アニメーション化されたスケルトンを計算する方法を説明しようとします。t
このファイルのボーン配列から読み取ることができます。それぞれのボーン配列には、3 つの float 配列として位置があり、4 つの float 配列とスケールとしてクォータニオン回転があります。
上記のタイミング データも必要です。つまり、アニメーションに 17 フレームある場合、各フレームの時間情報です。これを持っているか、 からこのデータを取得できると仮定するとio_three
、アニメーション マトリックスを計算できます。より詳細な手順は次のとおりです。
- 時間の位置データを見つけます。つまり、次のような時間で
t
2 つのフレームを見つけます。これで、補間された平行移動行列を計算できます。t1
t2
t1 < t < t2
- 1 と同様に、補間された回転行列とスケール行列を計算します。
- 次に、計算したばかりの T、R、S 行列からローカル アニメーション行列 A を見つけます。
- 次に、ローカル アニメーション マトリックスにボーンの逆バインド変換を掛けます。
- ここで、親マトリックスを乗算して、累積的なアニメーション マトリックスを作成します。
この種の計算のサンプルをここで見ることができます: Assimpを使用して、ObjectiveC にあることに注意してください。
スケルトンの各ボーンに対してステップ 1 から 4 を実行し、スケルトンのルートからずっと下までトラバースします。これにより、各ボーンに対して累積的なアニメーション マトリックスが確実に得られます。IdentityMatrix
を親マトリックスとして開始します。
スケルトンのルートから始める必要があるため、そのルートも知っておく必要があります。データがスケルトンのルートを提供するか、スケルトン ルートを派生させる必要があります。ボーン ノードのツリーがある場合、深さが最も低いノードがルートになります。
各ボーンのアニメーション マトリックスを取得したら、各頂点に影響を与えるボーンの数とその影響の重み付けも知る必要があります。その後、CPU または GPU で変形した頂点を計算できます。どちらにも長所と短所があることに注意してください。
骨格アニメーションのより良い説明ですが、Assimp ライブラリを使用した説明は、この投稿のトップの回答に記載されています。
全体として、骨格アニメーションの全体的なロジックは単純ですが、難しい部分は、すべてのデータを含むデータ構造のナビゲーションと正しいアニメーション マトリックスの構築、スケルトンのルート ノードの識別、頂点からボーン/アニメーション データへのマッピングです。