OpenGL中glMatrixMode()函数以及视图变换,模型变换,投影变换,视口变换的理解

OpenGL中的视图可以利用照相机来进行比拟。产生目标的场景的变过过程类似于相机拍照。此步骤大概分为三个:

1)把相机固定在三角架上,并让它对准场景(视图变换)

2)对场景安排,使得各个物体在招片中的位置是我们所希望的(模型变换)

3)选择照相机的镜头,并调整放大的倍数(投影变换)

4)确定最终照片的大小,放大(视口变换)

完成这些步骤就可以进行场景的绘制了。

在这个过程中,我们可以把场景长中的物体的坐标变换关系表示为如下情况:

物体坐标(顶点)——模型视图矩阵(视觉坐标)——投影矩阵(剪裁坐标)——透视除法(规范化设备坐标)——视口变换(窗口坐标)



视图变换

视图变化相当于对照相机进行操作。首先利用glLoadIdentity()函数对矩阵进行初始化,将当前的矩阵设定为单位矩阵。然后再把它与视图变换矩阵相乘。视图变换矩阵利用函数gluLookAt()函数进行指定。

void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,
                                   GLdouble centerx,GLdouble centery,GLdouble centerz,
                                   GLdouble upx,GLdouble upy,GLdouble upz);
该 函数定义一个视图 矩阵,并与当前矩阵相乘。
第一组eyex, eyey,eyez 相机在世界坐标的位置
第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
第三组upx, upy, upz 相机向上的方向在世界坐标中的方向。
通过此函数的设定,能够把相机的位置确定下来。详细的介绍见链接:http://blog.csdn.net/wangqinghao/article/details/14002077
视图变换函数必须要在调用任何模型变换函数之前调用,以确保首先作用于模型的是模型变换。可以这里利用矩阵的结合性质来理解。
视图变换矩阵A,模型变换矩阵B,视景体的坐标系统矩阵C。(A*B)*C=A*(B*C).

模型变化

有三个函数能够设定模型变换矩阵。glTranslate(),glRotate(),glScale().这些函数通过移动,旋转,拉伸,收缩或者反射对物体进行变换。

glMatrixMode()函数的参数有3种模式: GL_PROJECTION 投影, GL_MODELVIEW 模型视图, GL_TEXTURE 纹理。

GL_PROJECTION 投影:

投影变换:相当于为照相机选择镜头,这种变换的目的是为照相机选择视野(或者视景体)。因此确定哪些物体位于视野之内以及他们能够被看到的程度。投影变换决定了物体如何被投影到屏幕上。有两种投影。透视投影(perspective projection),它使得远处的物体看上去更小一些。透视投影有两个操作函数,glFrustum()或gluPerspective()。

通过它们生成的矩阵与当前的矩阵相乘生成相应的透视效果。

1.glFrustum()
OpenGL中glMatrixMode()函数以及视图变换,模型变换,投影变换,视口变换的理解_第1张图片

这个函数原型为:
  void glFrustum(GLdouble left, GLdouble Right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
创建一个透视型的视景体。其操作是创建一个透视投影的矩阵,并且用这个矩阵乘以当前矩阵。这个函数的参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标,即(left,bottom,-near)和(right,top,-near);最后一个参数far是远裁剪平面的离视点的距离值,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成。near和far表示离视点的远近,它们总为正值(near/far 必须>0)。

2.gluPerspective()

OpenGL中glMatrixMode()函数以及视图变换,模型变换,投影变换,视口变换的理解_第2张图片

这个函数原型为:
void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);
  创建一个对称的透视型视景体,但它的参数定义于前面的不同,如图。其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。参数fovy定义视野在Y-Z平面的角度,范围是[0.0, 180.0];参数aspect是投影平面宽度与高度的比率;参数Near和Far分别是近远裁剪面到视点(沿Z负轴)的距离,它们总为正值。
  以上两个函数缺省时,视点都在原点,视线沿Z轴指向负方向。

另一类投影叫做正投影(orthographic projection),它把物体直接映射到屏幕上而不影响它们的大小。和透视投影不同,正投影的物体的两端的大小没有不同,物体和照相机的距离并不影响它们看上去的大小。这种类型的投影用于建筑蓝图和计算机辅助设计的应用程序。

glOrtho()函数创建一个正交平行的视景体。

glOrtho(left, right, bottom, top, near, far), left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的。

关于此函数可以理解为通过设定参数,对视景体进行剪裁。详细的介绍见:http://blog.csdn.net/shizhipeng/article/details/4939529




你可能感兴趣的:(OpenGL)