C++ API を使用してプログラムで Maya に読み込みたい人間の二足歩行アニメーション ファイル フォーマットがあります。
アニメーション ファイルのフォーマットは、 Open Asset Importer のノードごとのアニメーション構造に似ています。
各ジョイントには、最大 60 個の 3D ベクトル キー (ジョイントの移動を記述するため) と 60 個のクォータニオン キー (ジョイントの回転を記述するため) があります。すべてのジョイントは、同じ数のキーを持つ (またはキーをまったく持たない) ことが保証されます。
アニメーションの長さ (秒単位) を指定または変更できます (たとえば、30 FPS アニメーションで 60 個のキーが 2 秒間にわたって発生するように設定できます)。
ジョイントの移動と回転はフレームごとにスケルトン ツリーに伝播し、アニメーションを生成します。
これがサンプルです。データ構造に関する追加の注釈は、ロギング機能によって追加されます。簡潔にするためにキーを切り捨てました。
Bone Bip01
Parent null
60 Position Keys
0 0.000000 4.903561 99.240829 -0.000000
1 0.033333 4.541568 99.346550 -2.809127
2 0.066667 4.182590 99.490318 -5.616183
... (truncated)
57 1.366667 5.049816 99.042770 -116.122604
58 1.400000 4.902135 99.241692 -118.754120
59 1.400000 4.902135 99.241692 -118.754120
60 Rotation Keys
0 0.000000 -0.045869 0.777062 0.063631 0.624470
1 0.033333 -0.043855 0.775018 0.061495 0.627400
2 0.066667 -0.038545 0.769311 0.055818 0.635212
... (truncated)
57 1.366667 -0.048372 0.777612 0.065493 0.623402
58 1.400000 -0.045869 0.777062 0.063631 0.624470
59 1.400000 -0.045869 0.777062 0.063631 0.624470
Bone Bip01_Spine
Parent Bip01
60 Position Keys
...
60 Rotation Keys
...
C++ では、私が現在持っているデータ構造はこれに対応しています。
std::unordered_map<string, std::vector<Vector3>> TranslationKeyTrack
一連の平行移動ベクトルを対応するボーンにマップするために使用されます。
std::unordered_map<string, std::vector<Quaternion>> RotationKeyTrack
一連の回転クォータニオンを対応するボーンにマップするために使用されます。
追加メモ: 親ボーンに対して相対的に移動しないボーンがいくつかあります。これらのボーンにはキーがまったくありません (ただし、キーが 0 のエントリがあります)。回転のみ、または位置キーのみを持つボーンもあります。スケルトン データは別のファイルに保存されており、MFnIkJoint を使用して Maya に読み込むことができます。
アニメーション ファイルで指定されたボーンは、そのスケルトン データのボーンに対して 1:1 です。
このアニメーション データを Maya にインポートします。ただし、 C++ API を介してアニメーション データを受け入れる Maya の方法がわかりません。
特に、MFnAnimCurve 関数は、時間キーに関連付けられた単一の浮動小数点値のみを設定addKeyFrame
またはaddKey
受け入れますが、ベクトルとクォータニオンのリストがあります。MFnAnimCurve は「接線」も受け入れます。ドキュメントを読んだ後でも、持っているデータをこれらの接線に変換する方法がわかりません。
私の質問は、持っているデータを Maya が理解できるものに変換するにはどうすればよいですか?
例でよく理解できるので、いくつかのサンプル コードが役に立ちます。