14

Assimpをモデル インポート ライブラリとして使用して、 OpenGLでスケルトン アニメーションを実行しようとしています。

offsetMatrixボーンの変数を使用するには、正確に何が必要ですか? 何を掛ける必要がありますか?

4

3 に答える 3

10

たとえば、私が作業したゲームでキャラクターをアニメーション化するために使用したこのコードを見てみましょう。私も 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へのリンクがあります。

それが役に立てば幸い。

于 2015-04-18T20:02:10.003 に答える
1

オフセット マトリックスは、頂点をメッシュ空間で変換し、それを「ボーン」空間に変換する変換 (移動、スケール、回転) を定義します。例として、次の頂点と次のプロパティを持つボーンを考えてみましょう。

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

これは役に立ちますか?

于 2015-04-13T12:19:44.003 に答える