opengl的坐標和glFrustumf的設定及參數相關意義


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來設定大小(這里還不是很清楚)

// 這里的GL10.GL_FIXED是整形數據,即one的大小是投影在第一層時候觀察的大小,顯示為整個openglsurfaceview的控件中寬的大小

// 當為folat類型數據時候,1代表的屏幕寬度
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM