2017-07-08 15 views
0

私は2つの異なる骨格フォーマットの間で変換しようとしています。私には階層的なスケルトンがあります。3Dスケルトンシステム間の変換

今一つのフォーマットで、与えられたノードの行列は(DirectXの)により算出される(matScale/matRotate/matTranslationFromParentがどこrecurively、底ノードから は、先頭に、その特定のノードSRT):

appliedMatrices = appliedMatrices * matScale * matRotate * matTranslationFromParent;

しかし、translationInが(ParentPos - EndPartPos)のベクトル減算であり、変換が(EndPartPos - ParentPos)であり、andmatScale/matRotate/matTranslationFromParentがそうであるところで、(再帰的に、下位ノードから上へ、translInを使用するフォーマットに変換する必要があります。特定のノードSRT):

appliedMatrices = appliedMatrices * matScale * matTranslationOut * matRotate * matTranslationIn * matTranslationFromParent;

第1のフォーマットから第2のスケルトンフォーマット(およびその逆)に変換するにはどうすればよいですか?

+0

翻訳の翻訳を制御できますか?これらは互いに逆です(減算が示すように)?これらの翻訳をIDに設定すると、フォーマット1からフォーマット2に変換できます。 –

+0

これらは逆ですが、残念ながら私はスケルトンを制御できません。だから私はそれらを取り除くことはできません(骨格ノードを動かすだけです)。 –

答えて

0

我々は2つのバージョンを比較した場合、我々は、次の2つの部分が一致する必要があることを参照してください。

matRotate1 * matTranslationFromParent1 
      = matTranslationOut * matRotate2 * matTranslationIn * matTranslationFromParent2 

matRotate1matRotate2だけ回転しているので、これら二つは同じでなければなりません。だから、これは単純です:

matRotate1 = matRotate2 

次に、2つの変換のために、一つだけの未知が残っている:

//conversion 1 -> 2 
matTranslationFromParent2 = (matTranslationOut * matRotate2 * matTranslationIn)^-1 * matRotate1 * matTranslationFromParent1 
//conversion 2 -> 1 
matTranslationFromParent1 = matRotate1^-1 * matTranslationOut * matRotate2 * matTranslationIn * matTranslationFromParent2 

パフォーマンスが重要な場合は、あなただけの並進ベクトルではなく上でこれらの計算を行うことができます行列全体。