BlenderでIKを入れたシンプルな関節のスキンメッシュを作成し、FBXに出力した。
XNAで表示して、IK計算を自分でやってみようと思ったのである。
BlenderでFBXに出力した時点か、XNAのインポーターがFBXを読み込んだ時点かわからないんだけれども(おそらく前者)、XNAで読み込んだ時点では、すでに全フレーム分のポーズが計算されていて、もちろんIK計算も適用済みだった。
XNAで単純に再生した動画がこちら。
これを自力で計算して同じ結果を出したい、というのが狙い。
今日は調査まで。
とりあえず、以下、メモ書き。いじった上での推論なので正しいとは限らないのでご注意ください。
XNAのインポータで読み込んだ時点では、以下の情報が構築済みである。
・各ボーンの初期ポーズのトランスフォーム(おそらくボーンローカル座標)
・上記の逆行列
・キーフレーム毎のボーンのトランスフォーム(おそらくボーンローカル座標で、IK適用済み)
上記の値から、スキンメッシュ用の座標変換行列を計算して、スキンメッシュ用のFXファイルに送っている模様。
スキンメッシュ用の座標変換行列の計算は、下記の内容になっているみたいだ。
1.まずボーンの座標変換行列(おそらく親ボーンを原点としたボーンローカル座標)を算出する。といってもこれは、KeyFrameに入っているTransformで上書きしただけ。
2.1の行列に親のワールド座標変換行列をかけて、自分自身のワールド座標変換行列を算出する。
3.初期ポーズの逆行列に2のワールド座標変換行列をかけて、スキンメッシュ用の座標変換行列を作成する。
スキンメッシュ用のFXファイルに送る行列は3で求めたものとなる。
1と2の計算は、どういうマトリックスを作ろうとしているのか想像が出来るのだけれども、3の計算が何を意味しているのかいまいちイメージできない。
ただ、自分でボーンの関節の動きを算出するのに大事なのは、おそらく1と2の計算過程。
ここを別ファイルからとってきたアニメーション情報で独自に算出してやれば、アニメーションのリターゲティングが出来るものと予想される。
次回は、このへんに取り掛かってみようと思う。ただし、IK計算は次の段階になりそう。