3Dモデル
-階層-
■階層モデル
階層モデルとは複数の3Dモデルに対し親子関係を持たせて
それらを1つのモデルとして扱っている3Dモデルのことです。
階層メッシュとも呼ばれています。
●階層モデルの特性
階層モデルの特性は親子関係にあります。
親の移動や、回転、拡大に対する影響を子供が受けます。
例として下のSSのモデルで説明したいと思います。
このモデルは立方体が親、リングが子の関係です。
親
子
立方体の位置をX軸回転したSSが下の内容です。
立方体の回転の影響が子のリングにも影響しているのが分かると思います。
基本的に子が移動や回転、拡縮を行ったとしても親はその影響を受けません。
以下のSSは先ほどのSSからリングのX軸回転を行った内容です。
立方体自体はそのままで、リングだけが回転しているのが分かると思います。
●階層モデルのプログラム的考え方
親から子へ座標などに関する影響を与えるには子には
親の座標、回転、拡縮情報(姿勢行列)を知らせる必要があります。
子は親の姿勢行列と自分の姿勢行列を掛け合わせることで
親の座標情報 + 自分の座標情報の結果を得ることができます。
■フレーム
階層モデルはフレームと呼ばれるコンテナ(入れ物)で管理を行っています。
このフレームは親の姿勢行列や、3Dモデルを表示するための
頂点や法線、マテリアルなどの情報、このフレームの子供にあたる
フレームの格納しています。
●フレームイメージ
●階層モデルイメージ
●フレームで管理している情報
行列:
親の相対姿勢行列
メッシュパーツ:
メッシュパーツとは頂点座標や、法線、マテリアルなどの
1つのモデルデータを構成する情報
子フレーム:
このフレームの子フレーム(複数設定可)
■階層モデルの内容(XFile)
階層モデルデータの内容ですが、頂点情報やマテリアルなどの
基本的な情報は変わりませんがそれらをまとめるフレームを追加します。
●事前準備
以下のファイルダウンロードして取得して下さい。
親用Xファイル
子用Xファイル
完成品
親のParent.xにChild.xを子供として追加します。
●フレーム追加
まずは以下Parent.x、Child.xの両方にフレームを追加します。
フレームはMeshを「Frame フレーム名 {}」で囲みます。
書式:
Frame フレーム名
{
}
具体例:
Frame FrameBox
{
Mesh
{
頂点情報
}
}
フレーム宣言から「{}」で囲み、その中にMesh情報を記述します。
※Meshにも以下のように名前を付けることができます。
書式:
Mesh メッシュ名
{
}
例:
Mesh BoxMesh
{
}
●相対姿勢行列追加
相対姿勢行列は親からの相対姿勢行列です。
この相対姿勢行列は最上位の親フレームにも追加可能となっていますので、
Parent.x、Child.xともに相対姿勢行列を追加します。
記述は「FrameTransformMatrix {}」となっており、
「Frame{}」の中に行います。
書式:
FrameTransformMatrix
{
4*4の相対姿勢行列
}
例:
Frame FrameBox
{
// 単位行列(移動、回転、拡縮なし)
FrameTransformMatrix
{
1.000000,0.000000,0.000000,0.000000,
0.000000,1.000000,0.000000,0.000000,
0.000000,0.000000,1.000000,0.000000,
0.000000,0.000000,0.000000,1.000000;;
}
}
●フレーム間の親子関係作成
フレーム間の親子関係を作成するには親のフレームの中に
子供のフレームを追加します。
Childの「Frame{}」部分をコピーしてParentの「Frame {}」の中に貼り付けます。
書式:
Frame 親フレーム名
{
相対的姿勢行列
{
}
Mesh 親メッシュ名
{
}
Frame 子フレーム名
{
相対的姿勢行列
{
}
Mesh 子メッシュ名
{
}
}
}
例:
Frame FrameBox
{
FrameTransformMatrix
{
}
Mesh Box
{
}
Frame FrameRing
{
FrameTransformMatrix
{
}
Mesh Ring
{
}
}
}
親子関係が作成され、階層モデルが完成しました。
●姿勢行列変更
親と子のフレームの相対姿勢行列を変更し、
親の変化で影響があることを確認します。
子フレームの相対姿勢行列を以下の値に変更して下さい。
FrameTransformMatrix
{
1.000000,0.000000,0.000000,0.000000,
0.000000,1.000000,0.000000,0.000000,
0.000000,0.000000,1.000000,0.000000,
0.000000,250.000000,0.000000,1.000000;;
}
親の姿勢行列(ローカル座標)を原点としてY軸方向に+250に
子フレームがあるとする内容です。
結果は以下のSSのようになります。