【Csharp】XNAでスキンメッシュアニメーションのリターゲティング

前回の記事で立てた予測は妥当だったようで、いちおうリターゲティングは成功した。

つまり、ベースとなるFBXファイルからモデルとボーンを取得し、アニメーションさせるためのフレーム毎の変換行列は別ファイルから読み込んできたものを使用する。

今回は、BlenderでベースとなるモデルとボーンをFBXでエクスポートし、異なるアニメーションをつけてBVH形式でエクスポートした。

つまり、モデルとボーンはFBX、アニメーションはBVHファイルで構成されている。

BVH形式もフレーム毎のボーンローカル座標系で回転情報(もしくは移動情報)が入っているため、FKの算出方法は同じである。

あくまで概念的な計算式だけれども、だいたいこんな感じ。

スキンメッシュ用FXファイルに送る座標変換行列 = 初期姿勢の逆行列 * (フレームの回転情報 * 親のワールド変換行列)

このフレームの回転情報の部分を BVH からとってきたものに差し替えるだけだ。

ただ、BlenderでBVHを出力する際に、Blenderのバグなのか仕様なのかわからないんだけれども、Y軸に対する回転情報とZ軸に対する回転情報があべこべに出力されていた。

というか、Blenderでボーンを組む際には、鉛直はZ軸上向きなのに対して、BVHで出力するとY軸上向きに変換されて出力される(たぶん)のにたいして、フレーム単位の回転情報は元の鉛直のまま格納されているのではないかと予想される。

そのため、フレームの回転情報の行列を作成する際に、Z回転とY回転の値を入れ替えてやると、欲しい動きになってくれた。

さて、IK実装どうしようか。お仕事のプログラミングの方が結構立て込んできたのである。

いちおう、スキンメッシュと、アニメーションのリターゲティングという当初の目標は達成できたので、IK計算の実装については、ちょっとずつ勉強しながら取り組んでいくとしよう。

ああ、これやらないフラグ。

4年前

コメントを残す

メールアドレスが公開されることはありません。