图形程序设计-李祥-386113_第1页
图形程序设计-李祥-386113_第2页
图形程序设计-李祥-386113_第3页
图形程序设计-李祥-386113_第4页
图形程序设计-李祥-386113_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章坐标变换,学习三维模型在绘制到二维屏幕之前如何进行变换。学习坐标系与坐标变换学习矩阵操作、平移变换、旋转变换、缩放变换、变换次序等学习控制这些变换的方法,显示模型的特定视图。,OpenGL提供了计算机图形学中最基本的三维变换,包括:视点变换、模型变换、投影变换、剪取变换(附加裁剪面)和视口变换等。同时OpenGL还有针对性地提供了一些特殊的变换和用法,如矩阵堆栈等。,3.1从三维图形到二维图像,3.1.1三维图形的输出过程,在现实世界中,观察到的所有物体对象都具有三维特征。但是在计算机屏幕上只能表现二维图像。那么,在三维图形到二维平面之间,需要什么样的变换,才能真实地反映现实世界呢?,3.1.2坐标系与坐标变换,为了能在计算机上显示三维图形,必须使其适应计算机。因为计算机只能处理数据,因此必须将三维图形与数据相联系。而将数据与三维图形联系在一起的惟一纽带,就是坐标。从现实三维世界中获取的三维对象,本身是包含了现实世界的坐标形式。这个坐标系称之为世界坐标系。而屏幕上的二维平面本身又定义了一个坐标系,称为屏幕坐标系。三维图形映射到二维平面上,最重要的一环就是投影。投影分为透视投影和正交投影两种。投影平面对应的三维空间称为三维视景体(ViewingVolume)。只有在视景体内的三维物体才可能投影到二维平面上。,在屏幕坐标系中,可以定义一个矩形,称为视口,视景体投影后的图形就在视口中显示出来。视口的坐标系与物理设备的坐标系之间可能还存在差异,因此还需要做一些适应物理设备的坐标变换。物理设备的坐标系称为物理设备坐标系。,3.1.3矩阵操作,OpenGL提供了丰富的三维变换函数,用户可以运用这些三维变换函数自如地进行三维图形操作,同时OpenGL还提供了一系列矩阵操作函数,帮助用户自己定义变换。下面先介绍这些矩阵操作函数。1)设置矩阵类在OpenGL中,设置矩阵类型的函数是glMatrixMode(),该函数的原型如下:voidglMatrixMode(GLenummode);功能:设置当前矩阵。,2)装入矩阵在OpenGL中,装入矩阵的函数是glLoadMatrix(),该函数的原型如下:voidglLoadMatrixfd(TYPE*m);功能:用指定的矩阵替换当前矩阵。,3)装入单位矩阵在OpenGL中,装入单位矩阵的函数是glLoadIdentity(),该函数的原型如下:voidglLoadIdentity(void);功能:用单位矩阵替换当前的矩阵。,4)矩阵相乘在OpenGL中,矩阵相乘的函数是glMultMatrix(),该函数的原型如下:voidglMultMatrixfd(TYPE*m);功能:用指定的矩阵乘以当前的矩阵。,3.2几何变换,几何变换是指三维场景中的物体运动姿态的变化,包括物体的平移、旋转和缩放。在OenGL中提供了3个命令函数来实现平移、旋转和缩放,它们是glTranslate(),glRotate(),glScale(),从而可以确定一个物体在场景中的位置、旋转角度和缩放比例。直接使用OpenGL中的矩阵操作函数可以实现几何变换,但是使用OpenGL中的变换函数,变换的速度要快得多。,3.2.1平移变换,为了便于建模,通常以物体坐标系缺省的原点作为模型的初始位置,建模完成后再将物体移至它在场景中应处的位置。在OpenGL中,物体的移动是用平移变换函数glTranslate()来完成的,函数原型如下:voidglTranslatefd(TYPEx,TYPEy,TYPEz);功能:把当前矩阵乘上一个平移矩阵。,glTranslate()函数可以作用于几何矩阵、投影矩阵和纹理坐标变换矩阵。如果当前矩阵为几何矩阵,函数的功能则是将物体坐标系的原点移到(x,y,z)所指的位置,形成新的物体坐标系。调用此函数之后的所有顶点的坐标都以新的位置作为原点。换句话说,平移之后所画的几何物体都做了相同的平移。glTranslate()函数平移的是坐标系而不是物体,如图3.2所示。该函数仅影响在它被调用之后所绘的物体。如果使用(0,0,0)作为参数调用该函数,则不产生任何平移。,3.2.2旋转变换,在OpenGL中,进行旋转变换的函数是glRotate(),该函数的原型如下:voidglRotatefd(TYPEangle,TYPEx,TYPEy,TYPEz);功能:把当前矩阵乘上一个旋转矩阵。参数说明:angle指定旋转角度,其单位是“度”()。X,y,z分别指定一个向量的x,y和z坐标。函数glRotate()的作用是绕向量(x,y,z)产生一个angle角度的旋转。当前矩阵将被它与一个旋转矩阵相乘后所得的矩阵所替代。,3.2.3缩放变换,在OpenGL中,进行缩放变换的函数是glScale(),该函数的原型如下:voidglScalefd(TYPEx,TYPEy,TYPEz);功能:当前矩阵乘以一个普通的缩放矩阵。参数说明:x,y,z分别指定沿x,y和z轴方向的缩放因子。当前矩阵将被它与这个缩放矩阵相乘的结果所替换。,3.2.4变换次序,在OpenGL中,平移、旋转和缩放变换的组合使用会产生复杂的变换效果,但是必须注意变换的先后次序,因为不同的变换次序会导致不同的效果。,3.2.5实例介绍,下面介绍一个应用几何变换的例子,从该例子中可以清晰地分辨出,对一个三角形实施的平移变换、缩放变换和旋转变换的痕迹。,3.3投影变换,投影变换的目的是将三维场景中的物体投影到二维平面上,这个二维平面就是显示窗口。投影变换定义一个取景器,该取景器决定物体是如何投影到窗口平面上的,并且它还定义了哪些对象或物体的哪些部分从最终的图像中剪切出去。投影变换同样是使用矩阵变换来实现的,与几何变换不同的是它使用投影矩阵,因此在进行投影变换之前必须调用glMatrixMode(GL_PROJECTION)函数将当前矩阵的类型设置为投影矩阵。,投影变换有两种,一种是透视投影,这种投影得到的效果与人眼观察世界的效果相同;另一种是正交投影,它的最大特点是无论物体距离视点多远,投影后的尺寸不变。在执行投影变换命令之前,必须调用下面的函数,将变换矩阵设置为投影变换矩阵:glMatrixMode(GL_PROJECTION);/阵模式为投影变换矩阵glLoadIdentity();,3.3.1透视投影,透视投影的取景器被设计成一个被截去了顶的四面锥体,因此取景器又称为观察锥。落在取景器内的物体朝着观察锥的顶点的方向投影,观察锥的顶点就是视点,靠近视点的平面称为近剪切面,观察锥的底称为远剪切面。观察锥的底平行于xOy平面,并向z轴负方向延伸。同样尺寸的物体,离视点越近就显得越大,这是因为它们比那些远处的物体占据的取景器空间的比例更大。这种投影方式与人眼的工作方式相似,因此常被用于动画、视觉模拟等场合。,在OpenGL中,定义取景器有2个函数:glFrustum()和gluPerspective()。1)glFrustum()在OpenGL中,glFrustum()的函数原型如下:voidglFrustum(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop,GLdoublezNear,GLdoublezFar);功能:用一个透视矩阵乘以当前的矩阵。参数说明:left,right指定左、右垂直剪切平面的坐标。bottom,top指定下、上水平剪切平面的坐标。zNear,zFar指定视点到最近和最远深度剪切平面的距离。二者必须是正数。,2)gluPerspective()在OpenGL中,luPerspective()函数的原型如下:voidgluPerspective(GLdoublefovy,GLdoubleaspect,GLdoublezNear,GLdoublezFar);功能:立一个透视投影矩阵。参数说明:ovy指定y方向的取景区域的角度,值范围为0,180。aspect指定x方向的用来确定取景区域的高宽比。高宽比是x(宽度)与y(高度)的比率。zNear指定视点到最近的裁剪平面的距离(它必须是正数)。zFar指定视点到最远的裁剪平面的距离(它必须是正数)。,3.3.2正交投影,正交投影的取景器是一个封闭的平行六面体。与透视投影不同,从一端到另一端,取景器的大小不改变,因此同样尺寸的物体,距离视点近的物体与离视点远的物体经投影后,它们的大小仍然是相同的。这类投影通常用于CAD等领域。在OpenGL中设置正交投影的函数是glOrtho(),该函数的原型如下:voidglOrtho(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop,GLdoublezNear,GLdoublezFar);功能:一个正交矩阵乘以当前矩阵。,3.4视窗变换,视窗变换类似于照片冲洗过程中的照片裁剪。在计算机图形学中,视窗是绘制图像的矩形区域。视窗以窗口坐标来定义,它表示图像相对于窗口左下角的位置。进行视窗变换时,所有顶点都已经过几何变换和投影变换,并且位于取景器之外的图像已被剪切掉了。,3.4.1定义视窗,打开一个窗口时,系统自动地将视口设置为整个窗口的大小。在OpenGL中可以用glViewport()函数来设置一个较小的绘图区,该函数的原型如下:voidglViewport(GLintx,clinty,GLsizeiwidth,GLsizeiheight);功能:设置视口。视口的宽度和高度被默认地截断到一定的范围,具体范围值由所处环境决定。可调用函数glGet(GL_MAX_VIEWPORT_DIMS)查询这一范围值。视口的高宽比一般应与投影取景器的高宽比相同,否则会造成图像的变形。在程序的运行过程中,可能会改变窗口的大小,因此程序应该能够检测到这种变化,并作相应的处理。,3.4.2变换z坐标,在视口变换中,z坐标或深度坐标被编码并被存储起来。在OpenGL中可以使用glDepthRange()函数缩放z坐标的值,使它位于所要求的范围内。该函数的原型如下:voidglDepthRange(GLclampedzNear,GLclampedzFar);功能:指定一种从归一化深度坐标到窗口深度坐标的映射方法。,3.5附加裁剪面,附加裁剪面可用于显示物体的剖面图等情况。每个裁剪面是通过指定方程Ax+By+Cz+D=0中的系数来确定。裁剪面通过模型和视点变换自动进行相应的变换。最后的裁剪体成为视图体和附加裁剪面所定义的半空间的交集。OpenGL会适当地重建被自动剪切的多边形的边。在OpenGL中,定义附加裁剪面的函数是glClipPlane()。该函数的原型如下:voidglClipPlane(GLenumplane,constGLdouble*equation);功能:指定一个剪切几何体所用的平面。,3.6矩阵堆栈,堆栈在计算机中表示先入后出的内存区域。而OpenGL中的矩阵堆栈,也是以这种方式管理的,专门用于存储矩阵的内存区域,只不过该堆栈中存放的数据单元是矩阵。OpenGL中管理内存堆栈的函数是glPushMatrix()和glPopMatrix(),函数的原型如下:voidglPushMatrix(void);voidglPopMatrix(void);功能:压入和弹出当前矩阵堆栈。,下面介绍一个3个齿轮相互啮

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论