1

私は Android の OpenGL ES2 で骨格アニメーションを実装しようとしています。私は io_three を使用して Blender からエクスポートされた JSON モデルを持っています。このファイルから読み取ることができます。それぞれのボーン配列には、3 つの float 配列として位置があり、4 つの float 配列とスケールとして四元数回転があります。親である整数、フレームごとに各ボーンマトリックスを処理する階層リストを持つアニメーションもあります。各階層には親とキーのリストがあり、各キーにはボーンと同じコンポーネントがあるため、多くのチュートリアルを読んで作成しました何度も試みましたが、残念ながら成功しませんでした。ロジックを簡単に説明する必要があります。だから私はボーンクラスを持っていて、それぞれがベクトルを持ち、各ボーンの相対行列を取得し、それを親の絶対行列で乗算してボーンの絶対行列を取得し、それを逆にして逆行列を取得できます。各キーに対して同じ計算を行うことはできますが、それらをバインドすることはできません。ボーンと各フレームの関係を理解する必要があります。私の問題はコードではなくロジックにあります。

4

1 に答える 1

3

アニメーション全体の開始時間と終了時間の間にあるアニメーションの一部tで、アニメーション化されたスケルトンを計算する方法を説明しようとします。t

このファイルのボーン配列から読み取ることができます。それぞれのボーン配列には、3 つの float 配列として位置があり、4 つの float 配列とスケールとしてクォータニオン回転があります。

上記のタイミング データも必要です。つまり、アニメーションに 17 フレームある場合、各フレームの時間情報です。これを持っているか、 からこのデータを取得できると仮定するとio_three、アニメーション マトリックスを計算できます。より詳細な手順は次のとおりです。

  1. 時間の位置データを見つけます。つまり、次のような時間でt2 つのフレームを見つけます。これで、補間された平行移動行列を計算できます。t1t2t1 < t < t2
  2. 1 と同様に、補間された回転行列とスケール行列を計算します。
  3. 次に、計算したばかりの T、R​​、S 行列からローカル アニメーション行列 A を見つけます。
  4. 次に、ローカル アニメーション マトリックスにボーンの逆バインド変換を掛けます。
  5. ここで、親マトリックスを乗算して、累積的なアニメーション マトリックスを作成します。

この種の計算のサンプルをここで見ることができます: Assimpを使用して、ObjectiveC にあることに注意してください。

スケルトンの各ボーンに対してステップ 1 から 4 を実行し、スケルトンのルートからずっと下までトラバースします。これにより、各ボーンに対して累積的なアニメーション マトリックスが確実に得られます。IdentityMatrixを親マトリックスとして開始します。

スケルトンのルートから始める必要があるため、そのルートも知っておく必要があります。データがスケルトンのルートを提供するか、スケルトン ルートを派生させる必要があります。ボーン ノードのツリーがある場合、深さが最も低いノードがルートになります。

各ボーンのアニメーション マトリックスを取得したら、各頂点に影響を与えるボーンの数とその影響の重み付けも知る必要があります。その後、CPU または GPU で変形した頂点を計算できます。どちらにも長所と短所があることに注意してください。

骨格アニメーションのより良い説明ですが、Assimp ライブラリを使用した説明は、この投稿のトップの回答に記載されています。

全体として、骨格アニメーションの全体的なロジックは単純ですが、難しい部分は、すべてのデータを含むデータ構造のナビゲーションと正しいアニメーション マトリックスの構築、スケルトンのルート ノードの識別、頂点からボーン/アニメーション データへのマッピングです。

于 2016-12-26T07:01:23.747 に答える