2016-12-25 12 views
0

私はAndroidのOpenGL ES2で骨格アニメーションを実装しようとしていますが、io_threeを使ってBlenderからJSONモデルをエクスポートしています。このファイルから読み取ることができますBones配列はそれぞれ3つの浮動小数点配列、 4つの浮動小数点配列とスケールと親である整数として、私は理解したように階層リストを持つアニメーションも持っています。各骨組みはフレームごとに処理され、各階層には親とキーのリストがあり、だから私は多くのチュートリアルを読んでたくさんの試みをしましたが、残念ながら私は成功しませんでした。 私は骨のクラスを持っているので、それぞれにベクトルがあります。そして、各骨の相対的な行列を得ることができます。そして、それを親の絶対行列と掛け合わせて、骨の絶対行列を求め、逆行列を逆行列にします。 各キーの計算は同じですが結合できないので、骨と各フレームの関係を理解する必要があります。 私の問題はコードではなくロジックである。OpenGL骨格アニメーションロジック

答えて

2

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

Iはそれぞれが3台のフロートアレイ、4台のフロートアレイとスケールとしてクォータニオン回転などの位置を有するこのファイル骨アレイから読み取ることができる

またすなわち、もし上記のタイミングデータを有するされなければなりませんあなたのアニメーションには、各フレームの時間情報である17個のフレームがあります。あなたがこれを持っていると仮定するか、io_threeからこのデータを得ることができます、あなたはアニメーションマトリックスを計算することができます。よりきめ細かな手順は以下のとおりです。t1 < t < t2

  1. は、あなたが時間t1t2ようにとの2つのフレームを見つけ、すなわち時間tのための位置データを検索します。これで、補間された変換行列を計算できます。
  2. 1と同様に、補間された回転行列とスケール行列を計算します。
  3. ここでローカルアニメーションマトリックス:Aを計算したばかりのT、R、S行列から求めます。
  4. 次に、ローカルのアニメーションマトリックスに骨の逆バインド変換を掛けます。
  5. ここで、累積アニメーションマトリックスを持つように、親マトリックスを掛けます。

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

スケルトンの各ボーンに対してステップ1〜4を実行し、スケルトンのルートから完全に下に移動します。これにより、各ボーンに対して累積アニメーションマトリックスが確保されます。あなたはIdentityMatrixを親マトリックスとして始めます。

スケルトンのルートから始める必要があるので、ルートも知っている必要があります。データがスケルトンのルートを提供するか、スケルトンルートを導出する必要があります。ボーンノードのツリーがある場合、最も深いノードがルートになります!

各ボーンのアニメーションマトリックスを取得したら、各頂点に影響を与えるボーンの数とその影響の重みを知る必要があります。次に、変形された頂点をCPUまたはGPUで計算することができます。 both have their pros and consに注意してください。

骨格アニメーションの方がはるかに優れていますが、Assimpライブラリの説明はpost's top answerに記載されています。

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

+0

清潔で明確な説明、ありがとう – Mohamed

関連する問題