OpenGL坐標系,如下圖:
我們需要將這個坐標系和我們的GLSurfaceView里的Surface做一個映射關系。
glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
//設置視角大小,注釋如下:
gl.glFrustumf(-400, 400, -240, 240, 0.3f, 100);
glMatrixMode(GL10.GL_PROJECTION); 是說我們現在改變的是坐標系與Surface的映射關系(投影矩陣)。
下一句 gl.glLoadIdentity(); 是將以前的改變都清掉(之前對投影矩陣的任何改變)。
glFrustumf (float left, float right, float bottom, float top, float zNear, float zFar) 這個函數非常Powerful。它實現了Surface和坐標系之間的映射關系。它是以透視投影的方式來進行映射的。
透視投影的意思見下圖:
public void onSurfaceChanged(GL10 gl, int width, int height)
{
float ratio = (float) width / height;
//設置OpenGL場景的大小
gl.glViewport(0, 0, width, height);
//設置投影矩陣
gl.glMatrixMode(GL10.GL_PROJECTION);
//重置投影矩陣
gl.glLoadIdentity();
// 設置視口的大小
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
// 選擇模型觀察矩陣
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置模型觀察矩陣
gl.glLoadIdentity();
}
我們一般不直接設置視口大小,而是利用glviewport 設置場景大小,再利用glFrustumf來設定大小(這里還不是很清楚)
// 當為folat類型數據時候,1代表的屏幕寬度