2017-03-02 130 views
1

私は自分の3D OpenGL/C++ゲームエンジンでASSIMPを使用してモデルをインポートするために骨格アニメーションを実装しようとしています。ASSIMPを使用したスケルトンアニメーション

私は、それらをアイデンティティに割り当てるとメッシュがそのバインドポーズでロードされるので、シェーダ内の一様な変数として読み込まれた骨マトリックスの計算によって問題が発生したと考えます。

これらは、私は準備ができて、骨の行列を初期化し、計算に使用する関数は、以下のとおりです。

void Joint::AddToSceneGraph(GameObject* root) 
    { 
     GameObject* parent = root->FindChild(m_name); 
     //m_globalInverseMatrix = inverse(root->GetTransform().GetMatrix()); 
     parent->AddComponent(this); 
     while (parent->GetParent() != root) 
      parent = parent->GetParent(); 

     parent->GetTransform().SetParent(NULL); (1) 
    } 

    mat4 Joint::GetMatrix() 
    { 
     mat4 ans = /*m_globalInverseMatrix*/GetTransform().GetMatrix()*m_offsetMatrix; 
     return ans; 
    } 

私はそのバインドでモデルをレンダリングしようとしていますので、私は文句を言わないあなたにアニメーション行列を計算するコードを供給もたらします。

いくつかの説明 - 私は、Transform * parentを持ち、GetMatrix()メソッドが親のものから行列を計算し、vec3sとrotation quaternionをスケーリングして変換するように、親と子の関係を考慮に入れます。私は親のルートジョイントの変換が(1)の目的である行列の同一性、したがってNULLでなければならないと仮定します。私はこの前提についてはわかりませんが、スケルトンの根とノードを含むノードがメッシュを含むことは兄弟であると確信しています。

また、私は天気が良くないと私はm_globalInverseMatrixを使用し、さらにその目的が正確であるべきです。

一般的に、私の主な問題は、ASSIMPがoffset matrixをどのように計算しているかを誤解しているか、またはinverse bind pose matrixと呼ばれ、その効果を逆転させる方法です。それ自体が「詰め」モデル探しで、この問題の結果:

this is maybe the most famous md5 model

答えて

2

Assimpでのドキュメントからは、骨のオフセット行列は、骨の空間にメッシュ空間から変換されます。

あなたが似ている階層のバインドposをレンダリングすることができました(私が誤解していない場合は、ルートノードに2人の子供、1つはスケルトン階層を生成し、もう1人はメッシュを生成します)。あなたがしなければならないのは、m_globalInverseMatrixをメッシュを含むノードの逆変換に設定することです。その後、各ボーンの変換は次のとおりです。

boneTransform = m_globalInverseMatrix * boneHierarchyTransforms * boneOffsetMatrix

boneHierarchyTransformは、各骨のノードまでのツリーをトラバースから来ているとboneOffsetMatrixはあなたが言及一つであり、私が最初の段落に言及しました。

関連する問題