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に掛け合わせる事になる為、描画の度に適切なビュー変換を作る必要がある。
コメントをお書きください