OpenGL学习笔记(九)
2012-12-11 15:26
169 查看
视图
产生目标场景视图的变换过程类似于用照相机进行拍照。用照相机(或计算机)进行拍照的步骤大致如下:
1.
把照相机固定在三角架上,并让它对准场景(视图变换)
2.
对场景进行安排,使各个物体在照片中的位置是我们所希望的(模型变换)
3.
选择照相机镜头,并调整放大倍数(投影变换)
4.
确定最终照片的大小(视口变换)
5.
在完成上面步骤后,就可以进行拍照(或者绘制场景)了
矩阵变换
矩阵变换之前需要确定自己想修改的是模型视图矩阵还是投影矩阵,可以使用glMatrixMode()选择矩阵。
void glMatrixMode(GLenum mode);
指定了需要修改的是模型视图矩阵、投影矩阵还是纹理矩阵。mode的值可以为:GL_MODELVIEW、GL_PROJECTION或GL_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); //移动
把当前矩阵与一个表示移动物体的矩阵相乘。这个移动矩阵由x、y和z值指定。
void glRotate{fd}(TYPE angle,TYPE x,TYPE y,TYPE z); //旋转
把当前矩阵与一个表示移动物体的矩阵相乘,以逆时针方向绕着从原点到点(x,y,z)的直线进行旋转。angle参数指定了旋转的度数。
void glScale{fd}(TYPE x,TYPE y,TYPE z); //缩放
把当前矩阵与一个表示沿各个轴对物体进行拉伸、收缩或反射的矩阵相乘。这个物体中的每个点的x、y和z坐标与对应的x、y和z参数相乘。
下面是视图变换相关函数
视图变换用于修改观察点的位置和方向。视图变换一般也是由移动和旋转组成的,所以可以使用模型变换函数(glTranslate*()和glRotate*())。
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参数表示哪个方向是朝上的(也就是说,在视景体中自底向上的方向)
下面是投影变换相关函数
投影变换的目的是定义一个视景体。视景体的用途:1.决定了一个物体是如何映射到屏幕上的(即通过透视投影还是正投影)2.定义了哪些物体裁剪到最终的图像之外
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);
在窗口中定义一个像素矩形,最终的图像将映射到这个矩形中。参数x和y指定了窗口内部视口的左下角,width和height指定了视口的大小。附:视口的纵横比一般和视景体的纵横比相同,若不同则当图像投影到视口时就会变形。
矩阵堆栈
在场景中放置每个物体时,并不一定都要使用单位矩阵对模型视图矩阵进行重置。我们常常需要保存当前的变换状态,然后在放置了一些物体之后再恢复到这个状态。为了方便这个过程,OpenGL维护了一个矩阵堆栈。它的工作方式与普通程序的堆栈一样。
void glPushMatrix(void);
复制当前矩阵(当前矩阵就是位于堆栈顶部的矩阵),并把它压到堆栈中。这时堆栈最顶部的两个矩阵的内容相同。
void glPopMatrix(void);
把堆栈顶部的那个矩阵弹出堆栈,销毁被弹出矩阵的内容。这时堆栈碑的第二个矩阵成为了顶部矩阵。注意,如果堆栈只包含一个矩阵,则调用glPopMatrix()将会导致错误。
产生目标场景视图的变换过程类似于用照相机进行拍照。用照相机(或计算机)进行拍照的步骤大致如下:
1.
把照相机固定在三角架上,并让它对准场景(视图变换)
2.
对场景进行安排,使各个物体在照片中的位置是我们所希望的(模型变换)
3.
选择照相机镜头,并调整放大倍数(投影变换)
4.
确定最终照片的大小(视口变换)
5.
在完成上面步骤后,就可以进行拍照(或者绘制场景)了
矩阵变换
矩阵变换之前需要确定自己想修改的是模型视图矩阵还是投影矩阵,可以使用glMatrixMode()选择矩阵。
void glMatrixMode(GLenum mode);
指定了需要修改的是模型视图矩阵、投影矩阵还是纹理矩阵。mode的值可以为:GL_MODELVIEW、GL_PROJECTION或GL_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); //移动
把当前矩阵与一个表示移动物体的矩阵相乘。这个移动矩阵由x、y和z值指定。
void glRotate{fd}(TYPE angle,TYPE x,TYPE y,TYPE z); //旋转
把当前矩阵与一个表示移动物体的矩阵相乘,以逆时针方向绕着从原点到点(x,y,z)的直线进行旋转。angle参数指定了旋转的度数。
void glScale{fd}(TYPE x,TYPE y,TYPE z); //缩放
把当前矩阵与一个表示沿各个轴对物体进行拉伸、收缩或反射的矩阵相乘。这个物体中的每个点的x、y和z坐标与对应的x、y和z参数相乘。
下面是视图变换相关函数
视图变换用于修改观察点的位置和方向。视图变换一般也是由移动和旋转组成的,所以可以使用模型变换函数(glTranslate*()和glRotate*())。
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参数表示哪个方向是朝上的(也就是说,在视景体中自底向上的方向)
下面是投影变换相关函数
投影变换的目的是定义一个视景体。视景体的用途:1.决定了一个物体是如何映射到屏幕上的(即通过透视投影还是正投影)2.定义了哪些物体裁剪到最终的图像之外
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);
在窗口中定义一个像素矩形,最终的图像将映射到这个矩形中。参数x和y指定了窗口内部视口的左下角,width和height指定了视口的大小。附:视口的纵横比一般和视景体的纵横比相同,若不同则当图像投影到视口时就会变形。
矩阵堆栈
在场景中放置每个物体时,并不一定都要使用单位矩阵对模型视图矩阵进行重置。我们常常需要保存当前的变换状态,然后在放置了一些物体之后再恢复到这个状态。为了方便这个过程,OpenGL维护了一个矩阵堆栈。它的工作方式与普通程序的堆栈一样。
void glPushMatrix(void);
复制当前矩阵(当前矩阵就是位于堆栈顶部的矩阵),并把它压到堆栈中。这时堆栈最顶部的两个矩阵的内容相同。
void glPopMatrix(void);
把堆栈顶部的那个矩阵弹出堆栈,销毁被弹出矩阵的内容。这时堆栈碑的第二个矩阵成为了顶部矩阵。注意,如果堆栈只包含一个矩阵,则调用glPopMatrix()将会导致错误。
相关文章推荐
- OpenCV for Ios 学习笔记(8)-用OPENGL渲染AR场景1
- LearnOpenGL学习笔记2:绘制基础图形
- OpenGL学习笔记2:绘制和混合
- OpenGL学习笔记(一):状态管理与绘制
- openGL画线---openGL学习笔记(三)
- Opengl学习笔记:(一).Ply文件文件格式和文件读取
- Opengl学习笔记1 -- 做一个透视立方体
- LearnOpenGL学习笔记9:材质
- opengl学习笔记二之绘制一个矩形
- OPENGL学习笔记之八
- OpenGL学习笔记(五)
- OpenGL学习笔记[2]:#include< >和#include" "的区别
- OpenGL 图形编程 学习笔记 一
- OpenGL学习笔记3:变换,矩阵,更多对象
- OpenGL学习笔记(七)
- LearnOpenGL学习笔记9:材质
- OpenGL学习笔记:颜色
- OPENGL学习笔记之三
- OpenGL学习笔记(14)像素操作
- Opengl学习笔记(一)