1. 相机
产生目标场景视图的变换过程类似于用照相机进行拍照。用照相机进行拍照的步骤大致如下:
·把照相机固定在三脚架上,并让它对准场景(视图变换);
·对场景进行安排,使各个物体在照片中的位置是我们所希望的(模型变换)
·选择照相机镜头,并调整放大倍数(投影变换)
·确定最终照片的大小(视口变换)
完成这些步骤之后,就可以进行拍照(或者绘制场景)了。
2. 投影方式
openGL提供了两种投影方式:正射投影和透视投影。
a) 正射投影(Orthographic Projection)
又叫平行投影。这种投影的视景体是一个矩形的平行管道,因此无论物体距离相机多远,投影之后物体的大小尺寸不变。这也正是为什么在正射投影模式下前后移动茶壶看不出来。此种模式下,不需要设定照相机位置、方向以及视点的位置,也就是说不需要gluLookAt函数。
正射投影函数void glOrtho(GLdoubleleft, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdoublefar)创建一个平行视景体,实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩阵,矩形左下角点三维空间坐标是(left, bottom,-near),右上角点(right, top,-near);远裁剪平面也是一个矩形,左下角点空间坐标是(left, bottom,far),右上角点是(right, top,-far)。所有的near和far值同时为正或者同时为负,物体在视点后面时far和near都为正值。
b) 透视投影(Perspective Projection)
透视投影符合人的心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失,成为灭点。它的视景体类似于一个顶部和底部被切除掉的棱锥,也就是棱台。
透视投影函数voidgluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar),创建一个对称透视视景体。其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。参数fovy定义视野在X-Z平面的角度,范围是[0.0,180.0];参数aspect是投影平面宽度与高度的比率;参数zNear和Far分别是远近裁剪面到眼睛的距离,它们总为正值。
3. 深度测试
深度其实就是像素点在3D世界中距离摄像机的距离,深度缓存中存储着每个像素点的深度之,深度值越大,则离摄像机越远。
在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这不符合现实世界表现。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能够按照远近顺序进行现实。
启用深度测试的代码如下:
glEnable(GL_DEPTH_TEST);//启用深度测试,根据坐标远近自动隐藏被遮住的物体 |