Assimpをモデル インポート ライブラリとして使用して、 OpenGLでスケルトン アニメーションを実行しようとしています。
offsetMatrix
ボーンの変数を使用するには、正確に何が必要ですか? 何を掛ける必要がありますか?
たとえば、私が作業したゲームでキャラクターをアニメーション化するために使用したこのコードを見てみましょう。私も Assimp を使用してボーン情報をロードし、Nico がすでに指摘した OGL チュートリアルを読みました。
glm::mat4 getParentTransform()
{
if (this->parent)
return parent->nodeTransform;
else
return glm::mat4(1.0f);
}
void updateSkeleton(Bone* bone = NULL)
{
bone->nodeTransform = bone->getParentTransform() // This retrieve the transformation one level above in the tree
* bone->transform //bone->transform is the assimp matrix assimp_node->mTransformation
* bone->localTransform; //this is your T * R matrix
bone->finalTransform = inverseGlobal // which is scene->mRootNode->mTransformation from assimp
* bone->nodeTransform //defined above
* bone->boneOffset; //which is ai_mesh->mBones[i]->mOffsetMatrix
for (int i = 0; i < bone->children.size(); i++) {
updateSkeleton (&bone->children[i]);
}
}
基本的に、Assimp を使用GlobalTransform
したチュートリアル Skeletal Animation で参照されているように、ルート ノードのトランスフォームは、ローカル空間からグローバル空間へのトランスフォームです。例を挙げると、3D モデラー (たとえば、Blender を選びましょう) でメッシュを作成するか、キャラクターをロードすると、通常 (デフォルトで) デカルト平面の原点に配置され、その回転は恒等四元数。scene->mRootNode->mTransformation
ただし、メッシュ/キャラクターを原点から別の場所に移動/回転させて(0,0,0)
、1 つのシーンに異なる位置の複数のメッシュを含めることもできます。それらをロードするとき、特に骨格アニメーションを行う場合は、それらをローカル空間に戻す(つまり、原点に戻す)ことが必須で0,0,0
あり、これがすべてを で乗算する必要がある理由ですInverseGlobal
(メッシュをローカルに戻します)スペース)。
その後、parentTransform
(ツリーの 1 レベル上の変換、これは全体的な変換です) の乗算であるノード変換でそれを乗算する必要がありますtransform
(以前はassimp_node->mTransformation
、ノードの親に対する骨の変換にすぎません)。 ) および適用するローカル変換 (任意の T * R): フォワード キネマティック、インバース キネマティック、またはキー フレーム補間。
ai_mesh->mBones[i]->mOffsetMatrix
ドキュメントに記載されているように、バインド ポーズでメッシュ空間からボーン空間に変換する boneOffset ( ) が最終的に存在します。
私の Skeleton クラスのコード全体を見たい場合は、ここにGitHubへのリンクがあります。
それが役に立てば幸い。
オフセット マトリックスは、頂点をメッシュ空間で変換し、それを「ボーン」空間に変換する変換 (移動、スケール、回転) を定義します。例として、次の頂点と次のプロパティを持つボーンを考えてみましょう。
Vertex Position<0, 1, 2>
Bone Position<10, 2, 4>
Bone Rotation<0,0,0,1> // Note - no rotation
Bone Scale<1, 1, 1>
この場合、頂点にオフセット マトリックスを掛けると、<-10, -1, 2> の頂点位置が得られます。
これをどのように使用しますか?この行列の使用方法には 2 つのオプションがあります。これは、頂点バッファーに頂点データを格納する方法にまで及びます。オプションは次のとおりです。
1) メッシュ頂点をメッシュ空間に保存する 2) メッシュ頂点をボーン空間に保存する
#1 の場合、offsetMatrix を取得し、頂点バッファーを作成する際にボーンの影響を受ける頂点に適用します。そして、メッシュをアニメートするときに、後でそのボーンにアニメートされたマトリックスを適用します。
#2 の場合、頂点バッファーに格納されている頂点を変換するときに、offsetMatrix をそのボーンのアニメーション マトリックスと組み合わせて使用します。したがって、次のようになります (注: ここで行列の連結を切り替える必要がある場合があります);
anim_vertex = (offset_matrix * anim_matrix) * mesh_vertex
これは役に立ちますか?