OpenGL学习笔记(九)
来源:互联网 发布:淘宝指数关键词 编辑:程序博客网 时间:2024/05/21 17:06
视图
产生目标场景视图的变换过程类似于用照相机进行拍照。用照相机(或计算机)进行拍照的步骤大致如下:
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()将会导致错误。- OpenGL学习笔记(九)
- OpenGL学习笔记(九)
- OPENGL学习笔记之九
- OpenGL ES3.0 《学习笔记 九》 Texturing
- openGL之光照1---openGL学习笔记(九)
- OpenGL入门学习[九]
- OpenGL入门笔记(九)
- OpenGL入门学习(九)
- OpenGL学习九:视图简介
- opengl 入门学习 随笔九
- OpenGL入门学习(九)
- OPENGL学习视频(九)
- 现代OpenGL+Qt学习笔记之九:smooth和flat着色模式
- OpenGL入门学习(九) 【转】
- OpenGL学习(九)纹理初步
- OPENGL学习笔记1
- OpenGL学习笔记
- OpenGL 学习笔记
- 在scrollview中嵌套多个GridView,GridView的内容不能显示全,只显示一部分
- joomla组建汉化
- zoj 2734 Exchange Cards
- Android Uri用法
- Kernel panic 息分析方法(转自高人)
- OpenGL学习笔记(九)
- 在DAO中想动态创建数组的方式。
- SAP认证简介
- CSS3 下拉菜单按钮
- kernel panic 调试
- 安装ehlib,专门为我修改的ehlib5.6 for xe2而写
- Lua_tinker for lua 5.2
- SAP系统管理员应做的工作(附操作事务代码)
- SQLite在micro上的移植