3Dプログラミング応用 1-0

~モーション再生の基礎概念、フレームとはなにか? について~

0.概説

1.フレームとは座標系のことである

2.フレームには親子関係がある

3.親フレームは子フレームに影響を与える、子フレームは親フレームに影響を与えない


以下、なぜそうなるのかを解説する

▲TOP

1.データ構造


フレームは、プログラム上では D3DXFRAME構造体 として実装されている。

メンバは以下のとおり

フレーム構造体

[ Name ]

→ フレームごとに付けられた一意な識別名 フレームは通し番号などは振られていないので、基本的に名前で検索する

[ TransformationMatrix ]

→ そのフレームの座標系を親フレームの座標系に変換する行列

[ pMeshContainer ]

→ そのフレームに付随する描画情報 NULLの場合もある

[ pFrameSibling ]

→ 兄弟フレームへのポインタ

[ pFrameFirstChild ]

→ 子フレームへのポインタ

▲TOP

2.親子関係、兄弟関係


D3DXLoadMeshHierarchyFromX 関数によって読み込まれたフレーム群は 木構造を作っている。

これらの関係性はメンバ変数の pFrameSibling,pFrameFirstChild によって定義されている。

親・兄弟関係の図

ポインタで親(例:胴体)から直接リンクされているのは第一子(例:右上腕)だけだが、

親子関係としてみた場合、第一子だけでなく、それらの兄弟フレーム(例:左上腕、右上腿…)も

全て第一子と同じ親を持つことになる。

3.行列演算


行列演算の図

フレームにメッシュ情報が含まれていた場合、そのメッシュを描画するわけだが、

メッシュ中の頂点位置情報は、そのフレームのローカル座標系で記述されており、

そのまま描画することはできない。

位置情報をローカル座標系による記述からワールド座標系よる記述に翻訳する必要がある。


各フレームの座標系は親フレームの座標系との相対関係として

TransformationMatrix に格納されている。


最上位フレーム緑、緑の子フレーム赤、赤の子フレーム青が存在するとする


このとき、

青フレームには 青座標系→赤座標系 の変換行列

赤フレームには 赤座標系→緑座標系 の変換行列

緑フレームには 緑座標系→ワールド座標系 の変換行列 が格納されている


青座標系上にある点Abをワールド座標上に描画する場合

まず、青フレームに格納されている行列で Ab を変換し、赤座標でどの位置にあるかを求める


Ar = Ab x MatBtoR


つぎに、赤フレームに格納されている行列で Ar が緑座標でどの位置にあるかを求める


Ag = Ar x MatRtoG


同様に、緑フレームに格納されている行列で Ag がワールド座標でどの位置にあるかを求める


Aw = Ag x MatGtoW


Aw = Ab x MatBtoR x MatRtoG x MatGtoW

このように「フレーム上の点をワールド座標系に変換する」には、フレームの変換行列を祖先方向にたどっていって、順に積をとっていけば良い。

逆に言うと「子孫フレームからワールド座標系に変換する」には、すべての祖先フレームの変換行列が必要になる。

▲TOP

>「1-1A スキン非対応のxfileの表示」へ続く