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代表的屏幕宽度
 
 
原文地址:https://www.cnblogs.com/bokeofzp/p/5967611.html