プロジェクトの完了に関しては、最終段階にありますが、アニメーションシステムを実装する直前です。
クライアントは「ボーンアニメーション」を選択することにしました。つまり、このアニメーション化されたオブジェクトが持つすべてのフレームとすべてのボーンに対して、各変換マトリックス(matrix4x4 rotation + translation)をエクスポートする必要があります。
ゲーム内のオブジェクトは3DS Max Physiqueモディファイヤでアニメーション化されているため、頂点ごとにボーン/ウェイトデータがあります。しかし、この件について少し理解するために、ここでは説明を簡略化します。
この投稿を2つのポイントに分割します。
すべてのフレームのボーンマトリックスのエクスポート
- 後のアニメーションの目的でボーンの位置をエクスポートする正しい方法について扱います。この場合、このボーンの影響を受けるすべての頂点をフレームXのボーンの位置に「移動」および「回転」する必要があります。
最終的な頂点位置の計算
- フレームXのボーン変換に従って新しい頂点位置を計算するために、適切な行列演算について扱います。
1.フレームごとにボーンマトリックスをエクスポートする
アニメーション化されたオブジェクトをエクスポートするときに、次のことを行う必要があることを正しく理解していますか?
フレーム0でBONE変換行列を取得し、この行列を反転します
FRAMExでBONE変換行列を取得
1 * 2を乗算して、FRAMExでのBONEの変換オフセットを取得します
[pseudocode]
// Animation export
// For each frame, export bone transformation offset
for(int iFrame = 0; iFrame < vFrames.size(); iFrame++)
{
// For every bone in the object
for(int iBone = 0; iBone < vBones.size(); iBone++)
{
// Grab transformation matrix for this bone at frame 0 and inverse it
Matrix3 matBoneMatrixAtStart = pNode->GetObjectTMAfterWSM( 0 );
matBoneMatrixAtStart.Inverse();
// Grab transformation matrix for this bone at frame iFrame
Matrix3 matBoneMatrixAtCurrentFrame = pNode->GetObjectTMAfterWSM( iFrame );
// Multiply Inversed Transformation Matrix of this bone at frame 0 - with
// current frame transformation matrix
Matrix3 matBoneTransformationOffset = matBoneMatrixAtStart
* matBoneMatrixAtCurrentFrame ;
// Save matBoneTransformationOffset - vertex will be multiplied by this
// matrix for animation purposes
fwrite(.....)
}
}
[/pseudocode]
それで十分でしょうか?または私がここで欠けているものはありますか?
2.新しい頂点の位置を計算する(フレームXでの最終的な頂点の位置)
後でレンダリングするとき、オブジェクトの頂点には、実際のアニメーションフレームのエクスポートされたボーン変換行列が乗算され、次にこのモデル全体の変換行列が乗算されて、オブジェクトがレベル内の正しい位置に配置されます。
[pseudocode]
Update()
{
// The model transformation matrix describing the position of
// the model in the level
matModelTransformationMatrix
// Calculate new vertex position according to it's bone transformation offset
NewVertexPosition = (OriginalVertexPosition * matBoneTransformationOffset[iFrame])
* matModelTransformationMatrix;
// Increment the frame for testing purposes
iFrame++;
}
[/pseudocode]
私はここで正しいと思いますか?したがって、フレームXのボーン変換オフセットがある場合、このボーンの影響を受けるすべての頂点にこのオフセットを掛けると、頂点はこのボーンのとおりに変換されますか?