AndroidでOpenGLのカメラ設定

3Dの座標変換

XYZの3次元座標で管理されるデータを2次元のモニタに表示する為、座標変換が行われる。

そのプロセスは以下の通り。


1.モデル変換  ・・・ モデリングしたデータをどの位置に置くか

2.ビュー変換  ・・・ カメラがどの位置にあって、どこを見ているか

3.投影変換   ・・・ 遠近感を表現する変換

4.ビューポート ・・・ モニタの解像度に合わせる変換


それぞれの座標変換はMatrix(4x4の変換行列)を使って管理される。



OpenGLでのMatrixの扱い

OpenGLでは、内部でいくつかのMatrixが用意されている

GL10クラスのglMatrixModeメソッドによってカレントとなるMatrixが指定され、

Matrixを扱う各メソッドは、カレントのMatrixに対して処理を行う。




ビューポートを設定する

GL10クラスのglVewportメソッドを使う。


投影変換を設定する

GL10クラスのglMatrixModeメソッドで「GL_PROJECTION」を設定し、

GL10クラスのglLoadIdentityメソッドで初期化してから、

GLUクラスのgluPerspectiveメソッドを使う。


ビューの変換行列を作る

GL10クラスのglMatrixModeメソッドで「GL_MODELVIEW」を設定し、

GL10クラスのglLoadIdentityメソッドで初期化してから、

GLUクラスのgluLookatメソッドを使う。



サンプル

public class GLTestRenderer implements GLSurfaceView.Renderer {
        public GLTestRenderer() {
        }

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        }

        @Override
        public void onSurfaceChanged(GL10 gl, int w, int h) {
                gl.glViewport(0, 0, w, h);
                gl.glMatrixMode(GL10.GL_PROJECTION);
                gl.glLoadIdentity();
                GLU.gluPerspective(gl, 45.0f, (float) w / (float) h, 0.1f, 100.0f);
        }

        @Override
        public void onDrawFrame(GL10 gl) {
                gl.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
                gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

                gl.glMatrixMode(GL10.GL_MODELVIEW);
                gl.glLoadIdentity();
                GLU.gluLookAt(gl, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
        }
}

ビューとモデルの変換は1つのMatrixで管理されるので注意。

モデルを動かす場合、GL_MODELVIEWのMatrixに掛け合わせる事になる為、描画の度に適切なビュー変換を作る必要がある。