1、ppt课件课件.1ppt课件课件.23.1二维观察3.2三维变换ppt课件课件.33实现二维观察的步骤:实现二维观察的步骤:p 3.1.1指定矩阵堆栈指定矩阵堆栈p 3.1.2指定裁剪窗口指定裁剪窗口p 3.1.3指定视区指定视区ppt课件课件.44p 指定当前操作的是投影矩阵堆栈指定当前操作的是投影矩阵堆栈glMatrixMode(GL_PROJECTION);p 初始化,即指定当前操作的矩阵堆栈的栈顶元初始化,即指定当前操作的矩阵堆栈的栈顶元素为单位矩阵。素为单位矩阵。 glLoadIdentity();ppt课件课件.55p 定义二维裁剪窗口定义二维裁剪窗口gluOtho2D(xwmin
2、, xwmax, ywmin, ywmax);其中,双精度浮点数其中,双精度浮点数xwmin, xwmax, ywmin, ywmax分别对应裁剪窗口的左、右、下、上四条边分别对应裁剪窗口的左、右、下、上四条边界。界。默 认 的 裁 剪 窗 口默 认 的 裁 剪 窗 口 , 四 条 边 界 分 别 为四 条 边 界 分 别 为 w x l = - 1 . 0 , wxr=1.0,wyt=-1.0,wyb=1.0。ppt课件课件.66p 指定视区指定视区glViewPort(xvmin,yvmin,vpWidth,vpHeighht););xvmin和和yvmin指定了对应于屏幕上显示窗口指定了
3、对应于屏幕上显示窗口中的矩形视区的左下角坐标,单位为像素。中的矩形视区的左下角坐标,单位为像素。整型值整型值vpWidth和和vpHeighht则指定了视区的则指定了视区的宽度和高度。宽度和高度。默认的视区大小和位置与显示窗口保持一致。默认的视区大小和位置与显示窗口保持一致。ppt课件课件.7例子教材【程序6-2】ppt课件课件.83.2.1变换种类3.2.2模型视图矩阵3.2.3矩阵操作3.2.4矩阵堆栈3.2.5投影变换3.2.6剪切变换83.2OpenGL中的变换中的变换ppt课件课件.9视图变换:指定观察者或摄影机的位置;模型变换:在场景中移动对象;模型视图变换:描述视图变换与模型变换
4、的对偶性;投影变换:对视见空间进行修剪和改变大小;视见区变换:对窗口的最终输出进行缩放;93.2.1变换种类变换种类ppt课件课件.10视图变换:指定观察者或摄影机的位置;视图变换是第一个应用到场景上的变换。它用于确定场景的有利位置。默认情况下,观察点位于原点,顺着z轴的负向看。视图变换使你可以将观察点放置在任何期望的位置上,从任何方向进行观察。确定视图变换相当于在场景中放置一部摄像机并确定其指向。 在工作时间表上,必须先指定视图变换再指定其他任何变换。 103.2.1变换种类变换种类ppt课件课件.11模型变换:在场景中移动对象;模型变换用于处理模型和模型内的特定对象。这些变换把对象移动到合
5、适的位置,旋转它们,并对它们进行缩放。模型变换实际上就是几何变换。 113.2.1变换种类变换种类ppt课件课件.12模型视图变换:描述视图变换与模型变换的对偶性;从内部效果和它们对场景最终外观的效果来说,视图变换和模型变换是相同的,把这两者分开完全是为了程序员的方便,向后移动对象和向前移动参考系之间并没有本质差别。术语“模型视图”表示你可以把这类变换视为模型变换或视图变换,但实际上并无区别,因此称它为模型视图变换。 123.2.1变换种类变换种类ppt课件课件.13投影变换:对视见空间进行修剪和改变大小;投影变换应用到最终的模型视图方向。投影实际上定义了视见空间并建立了修剪平面。更明确一些,
6、投影变换指定已完成场景如何转换成屏幕上的最终图象。常用的投影变换包括 正投影和透视投影。 133.2.1变换种类变换种类ppt课件课件.14视见区变换:对窗口的最终输出进行缩放;把场景的一个二维投影映射到屏幕上某处的窗口。这个到物理窗口坐标的映射是最后完成的一项变换,它称为视见区变换。 143.2.1变换种类变换种类ppt课件课件.15在计算机图形学中,所有的变换都是通过矩阵乘法来实现的,即将物体顶点构成的齐次坐标矩阵乘以三维变换矩阵就得到了变换后的物体顶点的齐次坐标矩阵,这样只要求出物体的三维变换矩阵,就可以得到变换后的物体。在OpenGL中,对象的坐标变换也通过矩阵来实现的(虽然并不一定要
7、自己定义矩阵)。通常,在OpenGL中使用了两个重要的矩阵:模型视图矩阵和投影矩阵,其中模型视图矩阵用于物体的模型视图变换,投影矩阵用于投影变换。 153.2.1变换种类变换种类ppt课件课件.16有了模型视图矩阵和投影矩阵,在OpenGL中从未加工的顶点数据到屏幕坐标的过程就包括如下步骤: 1. 将顶点坐标转换为规范化齐次坐标矩阵; 2. 将顶点的规范化齐次坐标矩阵乘以模型视图矩阵,生成变换后的顶点齐次坐标矩阵; 3. 将变换后的顶点齐次坐标矩阵乘以投影矩阵,生成修剪坐标矩阵,这样就有效地排除了视见空间之外的所有数据。4. 由修剪坐标除以w坐标,得到规格化的设备坐标。注意,在变换过程中,模型
8、视图矩阵和投影视图矩阵都有可能改变坐标的 w 值。 5. 坐标三元组被视见区变换影射到一个2D平面。这也是一个矩阵变换,但在OpenGL中不能直接指定或修改它,系统会根据指定给 glViewport 的值在内部设置它。 163.2.1变换种类变换种类ppt课件课件.17模型视图矩阵用于指定场景的视图变换和几何变换,模型视图矩阵是一个44的矩阵,它代表了用来放置和定位对象的经过变换的坐标系。在计算机图形学中,物体进行的几何变换可以分解成多个基本几何变换,而三维几何变换矩阵是多个基本几何变换矩阵相乘的结果。OpenGL提供了一些函数用于把任意矩阵设置成当前操作的矩阵(模型视图矩阵或投影矩阵)。 1
9、73.2.2模型视图矩阵模型视图矩阵ppt课件课件.18glfloat m = 1.0f, 0.0f,3.0f,0.0f, 0.0f,1.0f,0.0f,1.0f, 0.0f,0.0f,1.0f,1.0f, 0.0f,0.0f,0.0f,1.0f, ;glMatrixMode(GL_MODELVIEW); glLoadMatrixf(m); 这段程序中,先声明了一个数组来保存 44 矩阵的值,注意这里矩阵按列优先顺序保存,这意味着先从上往下遍历每一列;然后使用glLoadMatrix函数将定义的矩阵设置为当前操作的矩阵。 183.2.2模型视图矩阵模型视图矩阵ppt课件课件.19如果需要执行变
10、换,即把定义的矩阵乘到模型视图矩阵中。可以使用函数 glMultmatrix,其函数原型如下: void glMultMatrixfd(const TYPE *m); 参数 m 为一个以列优先顺序保存16个连续值的数组。 193.2.2模型视图矩阵模型视图矩阵ppt课件课件.20平移 旋转 比例 203.2.2模型视图矩阵模型视图矩阵ppt课件课件.21平移void glTranslatefd(TYPE x,TYPE y,TYPE z);参数x,y,z就是目标分别沿三个轴的正向平移的偏移量。这个函数用这三个偏移量生成的矩阵完成乘法。当参数是(0.0,0.0,0.0)时,生成的矩阵是单位矩阵,此
11、时对物体没有影响。 213.2.2模型视图矩阵模型视图矩阵ppt课件课件.22旋转void glRotatefd(TYPE angle,TYPE x,TYPE y,TYPE z );函数中第一个参数是表示目标沿从原点到指定点(x,y,z)的方向矢量逆时针旋转的角度,后三个参数则是指定旋转方向矢量的坐标。这个函数表示用这四个参数生成的矩阵完成乘法。当角度参数是 0.0 时,表示对物体没有影响。 223.2.2模型视图矩阵模型视图矩阵ppt课件课件.23比例void glScalefd(TYPE x,TYPE y,TYPE z);三个参数值就是目标分别沿三个轴向缩放的比例因子。这个函数用这三个比例
12、因子生成的矩阵完成乘法。这个函数能完成沿相应的轴对目标进行拉伸、压缩和反射三项功能。当参数是(1.0,1.0,1.0)时,对物体没有影响。当其中某个参数为负值时,表示将对目标进行相应轴的反射变换,且这个参数不为1.0,则还要进行相应轴的缩放变换。最好不要令三个参数值都为零,这将导致目标沿三轴都缩为零。 233.2.2模型视图矩阵模型视图矩阵ppt课件课件.24视图变换函数(定义观察坐标系)void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez, GLdouble centerx,GLdouble centery,GLdouble cen
13、terz,GLdouble upx,GLdouble upy,GLdouble upz);视点位置:(eyex, eyey, eyez)参考点位置:(centerx, centery, centerz)向上矢量方向:(upx, upy, upz)ppt课件课件.25例子红皮书cube.c model.cppt课件课件.26263.2.3矩阵操作矩阵操作o矩阵堆栈选择矩阵堆栈选择 glMatrixMode(GLenum mode);参数参数modemode用于确定将哪个矩阵堆栈用于矩阵操作。用于确定将哪个矩阵堆栈用于矩阵操作。GL_MODELVIEWGL_MODELVIEW:模型视图矩阵堆栈模型
14、视图矩阵堆栈GL_PROJECTIONGL_PROJECTION:投影矩阵堆栈投影矩阵堆栈GL_TEXTUREGL_TEXTURE:纹理矩阵堆栈纹理矩阵堆栈 ppt课件课件.27273.2.3矩阵操作矩阵操作通过上述的高级矩阵函数,可以很方便地实现变换。通过上述的高级矩阵函数,可以很方便地实现变换。问题:在调用函数时,修改的是当前的模型视图矩阵。新的矩问题:在调用函数时,修改的是当前的模型视图矩阵。新的矩阵随后将成为当前的模型视图矩阵并影响此后绘制的图阵随后将成为当前的模型视图矩阵并影响此后绘制的图形。这样模型视图矩阵函数在调用时,就会造成效果的积形。这样模型视图矩阵函数在调用时,就会造成效果
15、的积累。累。 ppt课件课件.28283.2.3矩阵操作矩阵操作p 效果积累效果积累一段代码:一段代码: /沿沿 x 轴正向移动轴正向移动 10 个单位个单位 glTranslatef(10.0f, 0.0f, 0.0f); glutSolidSphere(1.0f, 15, 15); /沿沿 y 轴正向移动轴正向移动 10 个单位个单位 glTranslatef(0.0f, 10.0f, 0.0f); glutSolidSphere(1.0f); 这段代码绘制了两个球,第一个绘制的球的球心沿这段代码绘制了两个球,第一个绘制的球的球心沿x轴正向移动了轴正向移动了10个单个单位,而第二球不仅沿位
16、,而第二球不仅沿y轴正向移动轴正向移动10个单位,也沿个单位,也沿x轴正向移动轴正向移动10个个单位。这就是效果积累。单位。这就是效果积累。 ppt课件课件.29单位矩阵glTranslatef(10.0f, 0.0f, 0.0f);glutSolidSphere(1.0f, 15, 15);glTranslatef(0.0f, 10.0f, 0.0f);glutSolidSphere(1.0f , 15, 15);想要第二个球只沿 y 轴正向移动 10 个单位,一种简单的方法是把模型矩阵复位,即通过给模型视图矩阵加载上单位矩阵来复位原点。 glMatrixMode(GL_MODELVIEW)
17、; glLoadIdentity( );ppt课件课件.30303.2.4矩阵堆栈矩阵堆栈实际上,在创建、装入、相乘模型变换和投影变实际上,在创建、装入、相乘模型变换和投影变换矩阵时,都已用到堆栈操作。换矩阵时,都已用到堆栈操作。一般说来,矩阵堆栈常用于构造具有继承性的模一般说来,矩阵堆栈常用于构造具有继承性的模型,即由一些简单目标构成复杂模型。而在型,即由一些简单目标构成复杂模型。而在构造复杂模型时,常常需要保存中间的变化构造复杂模型时,常常需要保存中间的变化状态,以便在进行一些变换后能够恢复。状态,以便在进行一些变换后能够恢复。 ppt课件课件.31313.2.4矩阵堆栈矩阵堆栈OpenG
18、L为模型视图矩阵和投影矩阵各维护着一为模型视图矩阵和投影矩阵各维护着一个个“矩阵堆栈矩阵堆栈”,可以把当前矩阵压到堆栈,可以把当前矩阵压到堆栈中保存它,然后对当前矩阵进行修改。把矩中保存它,然后对当前矩阵进行修改。把矩阵弹出堆栈即可恢复。使用的函数如下:阵弹出堆栈即可恢复。使用的函数如下: void glPushMatrix(void); void glPopMatrix(void);ppt课件课件.32323.2.4矩阵堆栈矩阵堆栈o 函数函数 glPushMatrix 用于将当前矩阵压入用于将当前矩阵压入当前矩阵堆栈,常用于保存当前变换矩阵。当前矩阵堆栈,常用于保存当前变换矩阵。o 函数函
19、数 glPopMatrix 用于将最后一个(最顶用于将最后一个(最顶上的)矩阵弹出当前矩阵堆栈,常用于恢复上的)矩阵弹出当前矩阵堆栈,常用于恢复当前变换矩阵原先的状态,如果曾经调用当前变换矩阵原先的状态,如果曾经调用 glPushMatrix 把它保存起来的话。把它保存起来的话。 ppt课件课件.33333.2.4矩阵堆栈矩阵堆栈堆栈是有深度的,如果超出了堆栈深度或当堆栈堆栈是有深度的,如果超出了堆栈深度或当堆栈为空时试图弹出一个矩阵值,都会发生错误。为空时试图弹出一个矩阵值,都会发生错误。可以用下面的函数获取堆栈深度的最大值:可以用下面的函数获取堆栈深度的最大值: glGet(GL_MAX_
20、MODELVIEW_STACK_DEPTH); glGet(GL_MAX_PROJECTION_STACK_DEPTH); ppt课件课件.34343.2.5投影变换投影变换o OpenGL中只提供了两种投影方式,一种是平中只提供了两种投影方式,一种是平行投影(正射投影),另一种是透视投影。行投影(正射投影),另一种是透视投影。在投影变换之前必须指定当前处理的是投影在投影变换之前必须指定当前处理的是投影变换矩阵:变换矩阵: glMatrixMode(GL_PROJECTION);glLoadIdentity();ppt课件课件.35353.2.5投影变换投影变换o 平行投影平行投影视景体是一个
21、矩形的平行管道,也就是一个长方视景体是一个矩形的平行管道,也就是一个长方体,其特点是无论物体距离相机多远,投影体,其特点是无论物体距离相机多远,投影后的物体大小尺寸不变。后的物体大小尺寸不变。 OpenGL中平行投影函数共有两个:中平行投影函数共有两个: glOrtho gluOrtho2D ppt课件课件.36363.2.5投影变换投影变换void glOrtho (GLdouble left,GLdouble right, GLdouble bottom,GLdouble top, GLdouble near,GLdouble far);函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以
22、当前矩函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。阵。近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(),右上角点是(right,top,-near););远裁剪平面也是一个矩形,左下角点空间坐标是(远裁剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(),右上角点是(right,top,-far)。所有的)。所有的near和和far值同时为正或同时为负。值同时为正或同时为负。如果没有其他变换,正射投影的方向平行于如果没有其他变换,正射投
23、影的方向平行于Z 轴,且视点朝向轴,且视点朝向Z负轴。负轴。这意味着物体在视点前面时这意味着物体在视点前面时far和和near都为负值,物体在视点都为负值,物体在视点后面时后面时far和和near都为正值。都为正值。 ppt课件课件.37373.2.5投影变换投影变换void gluOrtho2D (GLdouble left,GLdouble right, GLdouble bottom,GLdouble top);一个特殊的正射投影函数,主要用于二维图像到二维屏一个特殊的正射投影函数,主要用于二维图像到二维屏幕上的投影。幕上的投影。其其near和和far缺省值分别为缺省值分别为-1.0和和
24、1.0,所有二维物体的,所有二维物体的Z坐坐标都为标都为0.0。裁剪面是一个左下角点为(裁剪面是一个左下角点为(left,bottom)、)、右上角点为右上角点为(right,top)的矩形。的矩形。ppt课件课件.38透视投影透视投影的特点是距离视点近的物体大,距离视点远的物体小,远到极点即为消失,成为灭点。它的视景体类似于一个顶部和底部都被切除掉的棱椎,也就是棱台。OpenGL透视投影函数也有两个: glFrustum gluPerspective ppt课件课件.39void glFrustum (GLdouble left, GLdouble right, GLdouble botto
25、m, GLdouble top, GLdouble near, GLdouble far);此函数创建一个透视投影矩阵,并且用这个矩阵乘以当前矩阵。参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标,即(left,bottom,-near)和(right,top,-near);最后一个参数far是远裁剪平面的Z负值,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成。near和far表示离视点的远近,它们总为正值。ppt课件课件.40void gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble near, GLdoubl
26、e far);它也创建一个对称透视视景体,但它的参数定义于前面的它也创建一个对称透视视景体,但它的参数定义于前面的不同,其操作是创建一个对称的透视投影矩阵,并且不同,其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。用这个矩阵乘以当前矩阵。参数参数fovy定义视野在定义视野在X-Z平面(垂直方向上的可见区域)的平面(垂直方向上的可见区域)的角度,范围是角度,范围是0.0, 180.0;参数;参数aspect是投影平面的是投影平面的纵横比(宽度与高度的比值);参数纵横比(宽度与高度的比值);参数near和和far分别分别是远近裁剪面沿是远近裁剪面沿Z负轴到视点的距离。负轴到视点的距
27、离。 3.2.5投影变换投影变换ppt课件课件.413.2.5投影变换投影变换ppt课件课件.42在 OpenGL 中,除了利用投影变换中视景体定义的六个裁剪平面(上、下、左、右、前、 后)外,还可继续再定义一个或多个附加裁剪平面,对场景进一步进行裁减,以去掉场景中无关的目标。 ppt课件课件.43附加平面裁剪函数为: void glClipPlane(GLenum plane,Const GLdouble *equation); 这个函数定义一个附加的裁剪平面。其中参数equation指向一个包含四个双精度浮点数 的数组,这四个系数分别是裁剪平面 Ax+By+Cz+D=0 的 A、B、C、D 值。因此,由这四个 系数就能确定一个裁剪平面。参数 plane 是符号常数 GL_CLIP_PLANEi (i=0,1,.),用于指定裁剪面号。 ppt课件课件.44注意:在调用附加裁剪函数之前,必须先启动 glEnable(GL_CLIP_PLANEi),使得当前 所定义的裁剪平面有效;当不再调用某个附加裁剪平面时,可用 glDisable(GL_CLIP_PLANEi) 关闭相应的附加裁剪功能。 ppt课件课件.45例子红皮书clip.cppt课件课件.46综合例子红皮书planet.c robot.c此课件下载可自行编辑修改,供参考!感谢您的支持,我们努力做得更好!