导航

OpenGL ES 投影变换 Projection

Posted on 2012-04-27 15:24  蝈蝈俊  阅读(2066)  评论(0编辑  收藏  举报

下面代码设置当前Matrix模式为Projection投影矩阵:

gl.glMatrixMode(GL_PROJECTION);
gl.glLoadIdentity();

后续的坐标变换则针对投影矩阵。

 

OpenGL ES可以使用两种不同的投影变换:透视投影(Perspective Projection)和正侧投影(Orthographic Projection)。

 

正侧投影(Orthographic Projection)

有些地方也翻译成正交投影。

正交却是世界中的物体按照平行的光线投射到一张纸上(你的画布),仿佛被压缩在上面,无论这个物体在世界中多远,投射结果还是原来的大小, 2d 游戏多用此种投影。如下图:

image

正交投影的函数 有 glOrtho 和 glu 库的 gluOrth2D :
glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
gluOrth2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);

每个参数的意思如下图:

 

image

 

透视投影(Perspective Projection)

 

透视比较接近我们现实的方式了,你的眼睛发出的光形成一个夹角,离你的眼睛越近,东西越大,范围越小;反之离眼睛越远,东西越小,视野越开阔。因此多用于 3D 中。如下图:

tutorial_perspective

OpenGL ES定义透视投影的函数为glFrustum():

public void glFrustumf(float left,float right,float bottom,float top,float near,float far)

20110702003

在实际写代码时,Android OpenGL ES提供了一个辅助方法gluPerspective()可以更简单的来定义一个透视投影变换:

public static void gluPerspective(GL10 gl, float fovy, float aspect, float zNear, float zFar)

fovy: 定义视锥的view angle. 视线角度
aspect:  定义视锥的宽高比。
zNear: 定义裁剪面的近距离。
zFar: 定义创建面的远距离。

image

image

fovy,可以理解成眼睛睁开的角度,即,视角的大小,如果设置为0,相当你闭上眼睛了,所以什么也看不到,如果为180,那么可以认为你的视界很广阔;

 

image

对最佳视角fovy,有
tan(fovy/2) = h/distance;   //h为物体在Y方向上的高度,distance为物体中心离视点的距离
aspect = w/h;                   //w为物体在X方向上宽度,h意义同上

 

http://www.imobilebbs.com/wordpress/?p=2025