私は自分の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
と呼ばれ、その効果を逆転させる方法です。それ自体が「詰め」モデル探しで、この問題の結果: