m3dTransformable クラスの操作
ここでは m3dTransformable クラスに対する操作について解説します。
目次
1. m3dTransformable クラスとは
m3dTransformable クラスとは、ノードとテクスチャの変換メソッドを定義する m3dNodeとm3dTexture2D の抽象基底クラスです。オブジェクトの変換行列を内部に持ち、それを操作するメソッドを提供します。これにより、各ノードに変換行列を設定することが可能となり、回転や移動といった操作を直接行うことができます。
m3dTransformable オブジェクトが持つ変換行列は、リテインモードの描画を行う場合にワールドに対する各モデルの配置を計算するために用いられます。
2. m3dTransformable クラスの操作
m3dTransformable クラスは、内部的に平行移動 ( T )、方向 ( R )、拡大縮小 ( S )、汎用 4×4 行列 ( M )の 4つの構成要素を持っています。最終的に得られる変換行列 ( C ) は、これらの要素を合わせた結果になります。
m3dTransformable クラスの操作は、これらの構成要素を設定したり、全体に変換行列を乗算することで行われます。 構成要素を設定するメソッドには、以下のものがあります。
平行移動要素を、座標 ( tx, ty, tz ) に設定します。
IMICRO3Dv4es_m3dTransformable_translate ( inst, transformable, tx, ty, tz )平行移動要素に、オフセット ( tx, ty, tz ) を加算します。
IMICRO3Dv4es_m3dTransformable_setOrientation ( inst, transformable, angle, ax, ay, az )方向要素を、角度 angle と回転軸 ( ax, ay, az ) で設定します。
IMICRO3Dv4es_m3dTransformable_setScale ( inst, transformable, angle, sx, sy, sz )拡大縮小倍率を ( sx, sy, sz ) で設定します。
IMICRO3Dv4es_m3dTransformable_scale ( inst, transformable, angle, sx, sy, sz )設定されている拡大縮小倍率に ( sx, sy, sz ) を乗算します。
IMICRO3Dv4es_m3dTransformable_setTransform ( inst, transformable, trans )汎用変換行列に trans を設定します。
また、全体に変換行列を乗算して操作を行うメソッドとして、以下のものがあります。
ベクトル ( ax, ay, az ) を軸として角度 angle だけ回転を行います。angle の単位は度 ( degree ) です。このとき回転行列は対象となる行列に対し右から掛けられます。すなわち、このメソッドが呼び出される前に設定された、他のメソッドによる演算が終了した後に回転が行われます。
IMICRO3Dv4es_m3dTransformable_preRotate ( inst, transformable, angle, ax, ay, az )ベクトル ( ax, ay, az ) を軸として角度 angle だけ回転を行います。angle の単位は度 ( degree ) です。このとき回転行列は対象となる行列に対し左から掛けられます。すなわち、このメソッドが呼び出される前に設定された、他のメソッドによる演算が開始する前に回転が行われます。
これらの操作を行うとき、構成要素の順番や変換行列が乗算される方向に注意する必要があります。
以下は、サンプルコードで、m3dTransformable のメソッドを使用し各オブジェクトに変換操作を行っている部分です。
pmc -> pBoxTrans = IMICRO3Dv4es_m3dTransform_create ( pMe -> pIM3D );
pmc -> pBoxTransInit = IMICRO3Dv4es_m3dTransform_create ( pMe -> pIM3D );
/* boxの変換行列の初期化 */
IMICRO3Dv4es_m3dTransformable_getTransform ( pMe -> pIM3D, ( m3dTransformable* ) pmc -> pBox, pmc -> pBoxTransInit );
( 中略 )
/* sphereを移動する */
IMICRO3Dv4es_m3dTransformable_translate ( pMe -> pIM3D, ( m3dTransformable* ) pmc -> pSphere, 0.f, movelen, 0.f );
/* coneを移動する */
IMICRO3Dv4es_m3dTransformable_preRotate ( pMe -> pIM3D,
IMICRO3Dv4es_m3dTransformable_translate ( pMe -> pIM3D, ( m3dTransformable* ) pmc -> pCone, movelen, 0.f, 0.f );
/* boxを移動する */
IMICRO3Dv4es_m3dTransform_set_tr ( pMe -> pIM3D, pmc -> pBoxTrans, pmc -> pBoxTransInit );
IMICRO3Dv4es_m3dTransform_postRotate ( pMe -> pIM3D, pmc -> pBoxTrans, pmc -> boxRot, 0.f, 1.f, 0.f );
IMICRO3Dv4es_m3dTransformable_setTransform ( pMe -> pIM3D, ( m3dTransformable* ) pmc -> pBox, pmc -> pBoxTrans );

描画結果

