OpenGL学习笔记(九)

来源:互联网 发布:淘宝指数关键词 编辑:程序博客网 时间:2024/05/21 17:06

视图

产生目标场景视图的变换过程类似于用照相机进行拍照。用照相机(或计算机)进行拍照的步骤大致如下:

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

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

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

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

5.   在完成上面步骤后,就可以进行拍照(或者绘制场景)

矩阵变换

矩阵变换之前需要确定自己想修改的是模型视图矩阵还是投影矩阵,可以使用glMatrixMode()选择矩阵。

void glMatrixMode(GLenum mode);

指定了需要修改的是模型视图矩阵、投影矩阵还是纹理矩阵。mode的值可以为:GL_MODELVIEWGL_PROJECTIONGL_TEXTURE。注意,一次只能修改一个矩阵。在默认情况下,变换函数修改的矩阵是模型视图矩阵。另外,在默认情况下这3个矩阵均为单位矩阵。

void glLoadIdentity(void);

把当前的可修改矩阵设置为4*4的单位矩阵。一般而言,总是在指定视图或投影变换之前调用这个函数。

void glLoadMatrix{fd}(const TYPE *m);

把当前矩阵的16个值设置为m指定的值。

void glMultMatrix{fd}(const TYPE *m);

m指定的16个值作为一个矩阵,与当前矩阵相乘,并把结果存储在当前矩阵中。

下面是模型变换相关的函数

void glTranslate{fd}(TYPE x,TYPE y,TYPE z); //移动

把当前矩阵与一个表示移动物体的矩阵相乘。这个移动矩阵由xyz值指定。

void glRotate{fd}(TYPE angle,TYPE x,TYPE y,TYPE z); //旋转

把当前矩阵与一个表示移动物体的矩阵相乘,以逆时针方向绕着从原点到点(x,y,z)的直线进行旋转。angle参数指定了旋转的度数。

void glScale{fd}(TYPE x,TYPE y,TYPE z); //缩放

把当前矩阵与一个表示沿各个轴对物体进行拉伸、收缩或反射的矩阵相乘。这个物体中的每个点的xyz坐标与对应的xyz参数相乘。

下面是视图变换相关函数

视图变换用于修改观察点的位置和方向。视图变换一般也是由移动和旋转组成的,所以可以使用模型变换函数(glTranslate*()glRotate*())

void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz);

定义了一个视图矩阵,并把它与当前矩阵进行右乘。目标观察点是由eyexeyeyeyez指定的,centerxcenterycenterz参数指定了视线上的任意一点,upxupyupz参数表示哪个方向是朝上的(也就是说,在视景体中自底向上的方向)

下面是投影变换相关函数

投影变换的目的是定义一个视景体。视景体的用途:1.决定了一个物体是如何映射到屏幕上的(即通过透视投影还是正投影).定义了哪些物体裁剪到最终的图像之外

void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

创建一个表示透视视图平截头体的矩阵,并把它与当前矩阵相乘。各参数的定义如下图所示:

透视投影

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);

创建了一个表示正交平行视景体的矩阵,并把它与当前矩阵相乘。各参数的定义如下图所示:

正投影

下面是视口变换相关函数

在计算机图形中,视口是一个矩形的窗口区域,图像就是在这个区域中绘制的。

void glViewport(GLint x,GLint y,GLsizei width,GLsizei height);

在窗口中定义一个像素矩形,最终的图像将映射到这个矩形中。参数xy指定了窗口内部视口的左下角,widthheight指定了视口的大小。附:视口的纵横比一般和视景体的纵横比相同,若不同则当图像投影到视口时就会变形。

矩阵堆栈

在场景中放置每个物体时,并不一定都要使用单位矩阵对模型视图矩阵进行重置。我们常常需要保存当前的变换状态,然后在放置了一些物体之后再恢复到这个状态。为了方便这个过程,OpenGL维护了一个矩阵堆栈。它的工作方式与普通程序的堆栈一样。

void glPushMatrix(void);

复制当前矩阵(当前矩阵就是位于堆栈顶部的矩阵),并把它压到堆栈中。这时堆栈最顶部的两个矩阵的内容相同。

void glPopMatrix(void);

把堆栈顶部的那个矩阵弹出堆栈,销毁被弹出矩阵的内容。这时堆栈碑的第二个矩阵成为了顶部矩阵。注意,如果堆栈只包含一个矩阵,则调用glPopMatrix()将会导致错误。
原创粉丝点击