1

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 が理解できるものに変換するにはどうすればよいですか?

例でよく理解できるので、いくつかのサンプル コードが役に立ちます。

4

1 に答える 1