在BlackBerry上使用OpenGL绘图(九):投影变换

 

9 投影变换

以上讲解的是“视图模型模式”,主要是如何对观察点或者是模型进行变换,下面粗略了解一下“投影模式”。

 

“投影模式”变换的作用是控制3D模型如何投影到2D的屏幕上。一般希望的是将3D模型投影到2D屏幕上时和我们看见现实世界的物体相同,有近大远小的透视效果,这种投影模式称之为“透视投影”。在特殊的情况下,如机械制图等,可能希望将3D模型在2D屏幕投影出来时保持实际大小,不论模型离观察点多远,它在屏幕上投影出来的大小都是相同的,这种投影方式称之为“正投影”。

 

如果使用“正投影”的话,远处的物体不会变小,不符合人类的视觉习惯,当物体在2D屏幕上显示出来的时候用户会有“近小远大”的错觉。所以,除了有特殊要求,一般的应用程序都使用“透视投影”。OpenGLDemo样例中使用的也是“透视投影”。

 

样例在CubeRenderer的sizeChanged方法中设置了投影方式为“透视投影”。首先是调用glMatrixMode方法,通过参数GL_PROJECTION将当前的变换模式设为投影变换模式,表示之后的操作都是对投影方式的操作,然后调用glLoadIdentity方法载入对应的单位距阵。

  gl.glMatrixMode(GL10.GL_PROJECTION);

            gl.glLoadIdentity();

然后通过GLUtils的gluPerspective方法将投影方式设置成“透视投影模式”,如果希望将投影方式设置成“正投影”,需要用GLUtils的gluOrtho2D方法替代gluPerspective方法。

            net.rim.device.api.opengles.GLUtils.gluPerspective(gl, 45.0f,

                        (float) width / (float) height, 0.15f, 100.0f);

 

gluPerspective接受五个参数:第一个参数是GL实例;第二个参数是视角,这个参数只接受0到180之间的值,指定的是在YZ平面上视野的角度,系统通过这个参数计算出Y轴上什么范围内的模型需要绘制;第三个参数是屏幕的纵横比例,就是X和Y的比例,因为Y轴的范围已经指定,通过纵横比例可以计算出X轴上什么范围的模型需要绘制;第四个参数和第五个参数指定的最靠近的点和最远的点,只有在两者之间的模型才会被绘制,通过第四个和第五个参数系统可以计算出Z轴上什么范围内的模型需要绘制。

在BlackBerry上使用OpenGL绘图(九):投影变换_第1张图片

图18-9 指定绘制范围

参考图18-9。视角参数决定OAB平面和OCD平面之间的内容需要绘制。这样给出Z轴上的任一点都可以计算出该点所在的XY平面上Y的最大值和最小值。而纵横比结合视角可以决定平面OAD和OBC之间的内容需要绘制。这样给出Z轴上的任一点都可以计算出该点所在的XY平面上X的最大值和最小值。近点确定了平面abcd之后的内容需要绘制,而远点确定了平面ABCD之前的内容需要绘制。近点和远点决定了Z轴上的值的最大值和最小值。

 

可以看到,通过视角,纵横比,近点和远点可以确定一个六面体,在该六面体内的模型是需要被绘制的。

你可能感兴趣的:(float,BlackBerry)