繪圖對象的座標映射
在Android裝置上顯示圖形中的基本問題之一就是它們的螢幕可能是各種尺寸和形狀的。OpenGL會假設一個方形地區,統一的座標地區,並且在預設情況下,在一些方形的螢幕能夠像在方形地區一樣,完美的繪製這些座標。
圖1. 預設的OpenGL座標系統(左)被映射到一個典型的Android裝置螢幕(右)。
上面的插圖示範了如何把左邊的OpenGL的統一座標系統映射到右邊橫屏裝置的實際座標上。使用GpenGL的投影模式,可以解決這個問題,並且照相視圖(Camera View)會變換座標,以便繪圖物件能夠按照正確的比例來顯示圖形。
為了應用投影和照相視圖,就要建立一個投影矩陣和一個照相視圖矩陣,並且把它們應用到OpenGL的呈現管道。投影矩陣會重新計算圖形的座標,以便讓圖形能夠正確的映射到Android裝置的螢幕上。照相視圖矩陣會從一個特殊的視角來建立一個要呈現的對象的變換。
在OpenGL ES 1.0中的投影和照相視圖
在ES 1.0 API中,要分別建立投影和照相視圖,並把它們添加到OpenGL的環境中。
1. 投影矩陣---為了重新計算繪圖物件的座標以便讓它們能夠按照正確的比例來繪製,就要使用裝置螢幕的幾何形狀來建立一個投影矩陣。下面的範例程式碼示範了如何編輯GLSurfaceView.Renderer的onSurfaceChanged()方法,來實現基於螢幕的外觀比率的投影矩陣的建立,並且把這個投影矩陣應用給OpenGL的呈現環境:
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
// make adjustments for screen ratio
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION); // set matrix to projection mode
gl.glLoadIdentity(); // reset the matrix to its default state
gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // apply the projection matrix
}
2. 照相變換矩陣---一旦使用一個投影矩陣調整了座標系統,就必須要使用一個照相視圖。下面的代碼顯示如何使用GLSurfaceView.Renderer的onDrawFrame()方法來實現一個模型視圖,並且使用GLU.gluLookAt()工具來建立一個類比照相機視角的視圖變換:
publicvoid onDrawFrame(GL10 gl){
...
// Set GL_MODELVIEW transformation mode
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity(); // reset the matrix to its default state
// When using GL_MODELVIEW, you must set the camera view
GLU.gluLookAt(gl,0,0,-5,0f,0f,0f,0f,1.0f,0.0f);
...
}
關於如何使用OpenGL ES 1.0投影和照相視圖的完整的例子,請看OpenGL ES 1.0指南(http://developer.android.com/training/graphics/opengl/index.html)