OpenGL にはユーティリティライブラリとして gluLookAt() が定義されています。 この関数を使用することで、カメラ位置・注視点から視点変換行列を取得することが可能でした。 M3Gでこの関数と同様の機能を実現する場合、 M3G の API を用いて適当なメソッドを作成する必要があります。ここでは一例として、 gluLookAt() と同様の機能を提供する setLookAtImmediate() メソッドを紹介します
。
このメソッドは gluLookAt() と同様、カメラ位置座標・注視点座標・視点ベクトルの法線ベクトルを引数として取り、視点変換行列を返します。
以下にこのメソッドの使用例を挙げます。
/**
* private float [] camPos ;
* private float [] camLook ;
* private float [] camUp ;
* private Transform camLookTrans ;
* private Transform camTrans ;
* camPos はカメラ位置、
* camLook は注視点、
* camUp は視線ベクトルの法線ベクトル
*/
/* 視点行列の生成 */
camPos [ 0 ] = 0.f ;
camPos [ 1 ] = 3.f ;
camPos [ 2 ] = 10.f ;
camLook [ 0 ] = 0.f ;
camLook [ 1 ] = -2.f ;
camLook [ 2 ] = -10.f ;
camUp [ 0 ] = 0.f ;
camUp [ 1 ] = 1.f ;
camUp [ 2 ] = 0.f ;
camLookTrans = setLookAtImmediate ( camPos, camLook, camUp );
camTrans.set ( camLookTrans );
/* Graphics3D オブジェクトにカメラを登録 */
g3d.setCamera ( camera, camTrans );
* private float [] camPos ;
* private float [] camLook ;
* private float [] camUp ;
* private Transform camLookTrans ;
* private Transform camTrans ;
* camPos はカメラ位置、
* camLook は注視点、
* camUp は視線ベクトルの法線ベクトル
*/
/* 視点行列の生成 */
camPos [ 0 ] = 0.f ;
camPos [ 1 ] = 3.f ;
camPos [ 2 ] = 10.f ;
camLook [ 0 ] = 0.f ;
camLook [ 1 ] = -2.f ;
camLook [ 2 ] = -10.f ;
camUp [ 0 ] = 0.f ;
camUp [ 1 ] = 1.f ;
camUp [ 2 ] = 0.f ;
camLookTrans = setLookAtImmediate ( camPos, camLook, camUp );
camTrans.set ( camLookTrans );
/* Graphics3D オブジェクトにカメラを登録 */
g3d.setCamera ( camera, camTrans );
このメソッドによって取得される変換行列は、カメラ自身の座標系をワールド座標系へ変換する行列で、以下の行列Mです。
この行列を設定することで、カメラが適切に Graphics3D オブジェクト内に設定されます。

描画結果

