M3G では変換行列を扱うクラスとして、 Transform クラスの他に Transformable クラスが存在します。
Transformable クラスは Node クラスと Texture2D クラスの抽象基底クラスで、変換行列としてTransform クラスを持ち、この内部的に持つ Transform クラスを操作するためのメソッドを持ちます。これにより Transformable クラスのサブクラスに対しては直接、回転や移動といった操作を行うことができ、 Node クラスや Texture2D クラスのオブジェクトに回転や移動といった操作を直接施すことが可能になっています。
ただし、イミディエイトモードによる描画を行う場合、Node クラスや Texture2D クラスのオブジェクトに直接設定された変換行列は無視されますのでご注意ください。
以下のサンプルコードは Camera オブジェクト及び Group オブジェクトに対して、直接回転や平行移動操作を施しているところです。
* private Group sphere;
* private Group cone;
* private float camRotation = 0.5f;
* private float camTranslation = 0.1f;
* private float translation = 0.05f;
* private float rotation = 3.f;
* private int moveCount = 0;
* private int keyState = 0;
* moveCount はモデルの移動方向を決定する
* keyState はキーイベントを取得する
*/
/* キー処理 */
if ( ( keyState & RIGHT_PRESSED ) != 0 ) {
if ( ( keyState & LEFT_PRESSED ) != 0 ) {
if ( ( keyState & UP_PRESSED ) != 0 ) {
if ( ( keyState & DOWN_PRESSED ) != 0 ) {
( 中略 )
/* モデルの移動 */
sphere.translate ( 0.f, ( float ) ( translation * moveCount ), 0.f );
cone.preRotate ( rotation, 1.f, 1.f, 0.f );
cone.translate ( ( float ) ( translation * moveCount ), 0.f, 0.f );
Transformable クラスが認める操作には rotate (回転)、 translate (平行移動)、 scale (拡大・縮小)があり、これらの操作は以下のメソッドにより実現されます。これらのメソッドは Transformable オブジェクトが持つ変換行列に、各操作を行う4×4の変換行列を掛けることで実現されています。それぞれのメソッドが掛ける変換行列の内容については javadoc の Transformable クラスの項をご参照ください。
対象となるモデルに対し、ベクトル ( ax, ay, az ) を軸として angle の分だけ回転を行います。 angle の単位は度 ( degree ) です。このとき回転行列は対象となる行列に対し右から掛けられます。すなわち、このメソッドが呼び出される前に設定された、他のメソッドによる演算が終了した後に回転が行われます。
preRotate ( float angle, float ax, float ay, float az )対象となるモデルに対し、ベクトル ( ax, ay, az ) を軸として angle の分だけ回転を行います。 angle の単位は度 ( degree ) です。このとき回転行列は対象となる行列に対し左から掛けられます。すなわち、このメソッドが呼び出される前に設定された、他のメソッドによる演算が開始される前に回転が行われます。
setTranslation ( float tx, float ty, float tz )対象となるモデルの座標を座標 ( tx, ty, tz ) の位置に設定します。
translate ( float tx, float ty, float tz )対象となるモデルを方向ベクトル ( tx, ty, tz ) の分だけ平行移動します。
setScale ( float sx, float sy, float sz )対象となるモデルの拡大率を与えられた各成分値に設定します。
scale ( float sx, float sy, float sz )対象となるモデルを各方向に各成分の値だけ拡大します。
また、 Transformable クラスに対して直接 Transform オブジェクトを設定することも可能です。この操作には Transformable クラスの getTransform() メソッドや setTransform() メソッドを使用します。
* private Group box;
* private Transform boxPos;
* private Transform boxTrans;
* private float boxRot;
* boxRot は毎描画フレームごとに
* rotation だけ増加
*/
/* モデル初期位置の取得 */
box.getTransform ( boxPos );
/* モデル用変換行列の初期化 */
boxTrans.setIdentity ();
( 中略 )
/* 初期化 */
boxTrans.set ( boxPos );
( 中略 )
/* モデルの移動 */
boxTrans.postRotate ( boxRot, 0.f, 1.f, 0.f );
box.setTransform ( boxTrans );

Transformable 実行画面

