OpenGL坐标系,如下图:

opengl的坐标和glFrustumf的设定及参数相关意义

opengl的坐标和glFrustumf的设定及参数相关意义


我们需要将这个坐标系和我们的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和坐标系之间的映射关系。它是以透视投影的方式来进行映射的。


透视投影的意思见下图:

 opengl的坐标和glFrustumf的设定及参数相关意义opengl的坐标和glFrustumf的设定及参数相关意义

 
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代表的屏幕宽度
 
 

相关文章:

  • 2022-02-13
  • 2021-07-11
  • 2021-05-21
  • 2022-12-23
  • 2021-12-27
  • 2021-08-04
猜你喜欢
  • 2021-07-26
  • 2021-07-18
  • 2021-11-08
  • 2022-12-23
  • 2021-05-21
  • 2021-07-28
  • 2021-04-05
相关资源
相似解决方案