1、第9章 OpenGL开发基础,机械CAD,2,人类生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,必须能在三维空间描绘这些物体。三维表现技术能够再现三维世界中的物体,能够用三维形体来表示复杂的信息,这种技术就是可视化技术。 可视化技术赋予人们一种仿真的、三维的并且具有实时交互的能力,这样人们可以在三维图形世界中用以前不可想象的手段来获取信息或发挥自己创造性的思维。OpenGL可以完成上述功能,是事实上的三维图形标准。,机械CAD,3,OpenGL的历史,1980s SGI开发 IRIS GL 1992年SGI推出跨平台的OpenGL 1.0 1992年OpenGL ARB
2、委员会成立 1995年 OpenGL 1.1 1999年 OpenGL 1.2.1 2001年OpenGL 1.3 SIGGRAPH 2004 上 OpenGL 2.0规范宣布 SIGGRAPH 2007 上 OpenGL 3.0规范宣布,机械CAD,4,9.1 OpenGL的基本概念,OpenGL实质是一种图形与硬件的接口,包括了100多个图形函数,开发者可以用这些函数来建立三维模型和三维实时交互。与其它图形程序设计接口不同,OpenGL提供了十分清晰明了的图形函数。因此初学的程序设计员也能利用OpenGL的图形处理能力和1670万种色彩的调色板设计出三维图形以及三维交互软件。,机械CAD,
3、5,OpenGL强有力的图形函数不要求开发者把三维物体模型的数据写成固定的数据格式,这样开发者不但可以直接使用自己的数据,而且可以利用其它不同格式的数据源,如DXF格式的文件等。这种灵活性极大地节省了开发者的时间,提高了软件开发效率。,机械CAD,6,长期以来,从事三维图形开发的技术人员都不得不在自己的程序中编写矩阵变换、外部设备访问等函数,这样为调制这些与自己的软件开发目标关系并不十分密切的函数费脑筋,而OpenGL正是提供一种直观的编程环境,它提供的一系列函数大大地简化了三维图形程序。,机械CAD,7,9.1.1 OpenGL工作流程,机械CAD,8,数据处理将所有数据(包括几何顶点数据和
4、图像像素数据)存储在一个显示列表中,计算顶点和像素的坐标、纹理、法向向量数据,近似的绘制几何曲线和曲面。 顶点和图元的处理对顶点进行变换和光照处理;对图元进行裁减以适合视区大小。这一阶段的处理结果,被存储为纹理内存以用于光栅操作阶段,或者采取同几何数据一样的形式进行光栅化,并将结果融入帧缓存中;,机械CAD,9,光栅化操作光栅化包含几何和物理映射两部分。几何操作是将图元转化为二维图像;物理操作是计算图像每个点的颜色和深度等信息;通过几何操作和物理操作的二维描述,产生一系列的帧缓存地址和相关数值,并将所有片段作为像素存储在帧缓存中,写纹理内存,使用纹理映射,最后光栅化成像素段; 对像素段进行处理
5、,雾化效果生成,反走样处理,抖动处理等帧缓冲区操作。,机械CAD,10,9.1.2 OpenGL具体功能,1. 模型绘制OpenGL能够绘制点、线和多边形。应用这些基本的形体,可以构造出几乎所有的三维模型。OpenGL通常用模型的多边形的顶点来描述三维模型。,机械CAD,11,2. 模型观察在建立了三维景物模型后,就需要用OpenGL描述如何观察所建立的三维模型。观察三维模型是通过一系列的坐标变换进行的。模型的坐标变换在是观察者能够在视点位置观察与视点相适应的三维模型场景。在整个三维模型的观察过程中,投影变换的类型决定观察三维模型的观察方式,不同的投影变换得到的三维模型的景象也是不同的。最后的
6、视窗变换则对模型的景象进行剪取缩放,即决定整个三维模型在屏幕上的图形。,机械CAD,12,3. 颜色模式的指定OpenGL应用了一些专门的函数来指定三维模型的颜色。程序开发者可以选择两个颜色模式,即RGBA模式和颜色索引模式。在RGBA模式中,颜色直接由RGB值来指定;在颜色索引模式中,颜色值则由颜色索引表中的一个颜色的索引值来指定。开发者还可以选择平面明暗处理和平滑明暗处理两种对整个三维场景进行着色。,机械CAD,13,4. 光照处理用OpenGL绘制的三维模型必须加上光照才能更加与客观物体相似。OpenGL提供了管理四种光(辐射光、环境光、镜面光和漫反射光)的方法,另外还可以指定模型表面的
7、反射特性,即材质定义。,机械CAD,14,5. 图像效果增强 OpenGL提供了一系列的增强三维场景的图像效果的函数,这些函数通过反走样、融合和雾化来增强图像效果,雾能使影象从视点到远处逐渐褪色,更接近事实。 6. 位图和图像处理 OpenGL还提供了专门对位图和图像进行操作的函数。,机械CAD,15,7. 实时动画 为了获得平滑的动画效果,需要先在内存中生成下一幅图像,然后把已经生成的图像从内存显示到屏幕上,这就是OpenGL的双缓存技术。OpenGL提供了双缓存技术的一系列函数。 8. 交互技术 目前有许多图形应用需要人机交互,OpenGL提供了方便的三维图形人机交互接口,用户可以选择修改
8、三维场景中的物体。,机械CAD,16,9.1.3 OpenGL坐标系,(1)物体坐标系。OpenGL的场景实际就是它的物体空间,OpenGL的物体和其他对象都放在这个空间之中的。物体空间所使用的坐标系称为物体坐标系(又称为WCS世界坐标系)。OpenGL的物体坐标系是遵循右手规则的直角实数坐标系。缺省情况下,物体坐标系的原点在窗口的正中央,窗口所在的平面是坐标系的X-Y平面。坐标系的X坐标轴指向窗口的右方,轴指向上方,Z轴指向操作者。几何顶点的三个坐标分量就是对应于这个坐标系的。,机械CAD,17,(2)观察坐标系。观察坐标来自观察者的观察点。观察坐标系是物体坐标系与模视矩阵(Model_Vi
9、ew Matrix)相乘的结果,观察坐标系仅仅用于OpenGL内部的光照计算。 (3)裁剪坐标系。观察坐标系给出的点的坐标经投影变换后,得到的结果就是裁剪坐标。,机械CAD,18,(4)归一化设备坐标系。首先将裁剪坐标系中的坐标分量x、y、z限制在-w,w之内,即-wx,y,zw,然后再用w去除x、y、z,这样就将裁剪坐标转换为归一化坐标了,结果的坐标值位于-1,1范围内。归一化坐标系空间也称为单位立方体。,机械CAD,19,(5)窗口坐标系。单位立方体中的x、y、z坐标直接按比例缩放到下一个坐标系,这个坐标系就是窗口坐标系。窗口坐标系以像素为度量单位,其左下角的坐标为(0,0)。OpenGL
10、的窗口坐标系与Windows API所使用的窗口坐标系有所不同,Windows API的窗口坐标原点在窗口的左上角。 (6)屏幕坐标系。窗口坐标经由一个代表窗口在屏幕上位置的偏移量的修正便成为屏幕坐标。,机械CAD,20,9.1.4 OpenGL坐标变换,1. 矩阵操作 在OpenGL中,3D模型是通过各种矩阵变换来显示在计算机屏幕上的。 涉及到的矩阵操作有模视变换矩阵、投影变换矩阵以及进行纹理贴图的纹理坐标变换矩阵。这些矩阵是由glMatrix(Glenum mode)函数指定的,矩阵变换函数会影响所指定的当前矩阵,一次变换函数只能修改一个矩阵。,机械CAD,21,2. 模视变换,生成一个几
11、何物体时,OpenGL依照自己的坐标系统来建立这个几何物体。可以用模视变换(平移、旋转、比例几何变换)函数glTranslate()、glRotate()、glScale()来操纵整个物体,以确定该物体在场景中的位置、旋转角度和缩放比例。模视变换是通过矩阵变换来完成的,每进行一次变换,OpenGL会根据变换参数产生变换矩阵,再右乘当前模视变换矩阵,从而获得新的当前模视矩阵,这些矩阵仅影响在它被调用之后所绘制的物体。,机械CAD,22,3. 投影变换,投影变换的目的是将三维场景中的物体投影到二维平面上,这个二维平面就是显示窗口。投影变换定义一个取景体,该取景体决定物体是如何投影到窗口平面上的,并
12、且它还定义了哪些物体和物体的哪些部分从最终的图像中剪切出去。投影变换同样是使用矩阵变换来实现的,与模视变换不同的是它使用投影变换矩阵,因此在进行投影变换之前必须调用glMatrixMode(GL_PROJECTION)函数将当前矩阵的类型设置为投影变换矩阵。,机械CAD,23,1) 透视投影透视投影基本符合人类的视觉习惯,同样尺寸的物体视点近的比离视点远的大,远到极点即消失。正如人眼睛不能聚焦到非常近和非常远的物体一样,透视投影有两个剪切面近剪切面和远剪切面,分别将离视点太近和太远的物体部分地或全部地剪切掉。,机械CAD,24,2). 正交投影正交投影的取景体是一个封闭的平行六面体。与透视投影
13、不同,从一端到另一端,取景体的大小不改变,因此同样尺寸的物体,离视点近的物体与离视点远的物体经投影后,它们大小仍然是相同的。这类图应广泛用于CAD等领域。正交投影的变换函数为glOrtho()函数。,机械CAD,25,4. 视窗变换和附加裁减面,视窗变换类似于照片冲洗过程中的照片剪裁。在计算机图形学中,视区是绘制图像的矩形区域。视区以窗口坐标来定义,它表示图像相对于窗口左下角的位置。进行视区变换时,所有顶点都已经过模视变换和投影变换,并且对于取景体之外的图像已被剪切掉了。,机械CAD,26,9.2 OpenGL编程基础,首先应该明确,OpenGL不是编程语言,而是一种API(应用程序编程接口A
14、pplication Programming Interface),即只能提供接口,本身并不能单独构成应用程序,必须使用某种编程语言来调用这种API所提供的函数,才能完成图形的处理。编程语言的选择范围很大,只要在Windows中能调用API的即可,常用的一般有Visual C+,Delphi。,机械CAD,27,机械CAD,28,9.2.1 OpenGL数据类型,机械CAD,29,9.2.2 OpenGL函数形式的约定,v () 库前缀(gl):表示函数来自OpenGL核心库OpenGL32.lib;若来自实用库则是glu;glut代表来自实用程序软件包(以前是aux); 根命令(Color)
15、:表示是与颜色处理有关的函数; 参数个数(3):该函数需要3个形参; 参数类型(f):形参类型为浮点数(GLfloat,GLclampf)类型; v:表示形参为矢量形式(指向矢量或数组的指针参数);若不加v,表示形参为非矢量形式(独立变量)。,机械CAD,30,9.2.3 图元与命令,OpenGL能够绘制的图元包括点、线段和多边形,OpenGL可以在这几种图元模式之间选择。可以独立的控制图元模式,模式的选择、图元的定义以及其他OpenGL操作都是通过调用相应的函数来实现的。,机械CAD,31,图元被定义为一组顶点。顶点是构成线和多边形的基本元素的。与顶点相关联的数据包括其坐标、颜色、法向量、纹
16、理坐标等。在通常情况下OpenGL以相同的方法独立地、顺序的处理每个顶点及其相关数据。唯一例外的情况是:如果一组顶点必须被裁剪,那么这个图元将被调整到指定的区域匹配。这中情况下,顶点数据将被修改并产生一些新的顶点。,机械CAD,32,OpenGL命令总是按接收到的顺序进行执行处理。也就是说先定义的图元画完后才会执行后面的命令,状态查询命令返回在调用它之前所有发给OpenGL的命令完全执行后的相应数据。,机械CAD,33,按一定的顺序给出几何要素的顶点,glVertex命令指定一个顶点,并在生成顶点后,把当前颜色,纹理坐标,法线等值赋给这个顶点。- void glVertex234sifdv(c
17、oords);有时用矢量形式定义顶点,执行效率高,但是它只能在glBegin与glEnd之间调用才有意义。,机械CAD,34,glBegin标志几何要素定义的开始,glEnd函数则标志结束一个几何要素的定义。- void glBegin(Glenum mode);- void glEnd();mode 的值见下表,机械CAD,35,机械CAD,36,机械CAD,37, glLineWidth(10); glBegin(GL_LINES); glVertex3f(0.0f,1.0f,-2.0f);glVertex3f(0.0f,0.0f,-2.0f);glVertex3f(1.0f,1.0f,-
18、2.0f);glVertex3f(1.0f,2.0f,-2.0f);glVertex3f(2.0f,3.0f,-2.0f);glVertex3f(2.0f,2.0f,-2.0f); glEnd(); ,机械CAD,38,机械CAD,39, glBegin(GL_TRIANGLES); glVertex3f(0.0f,1.0f,-2.0f);glVertex3f(0.0f,0.0f,-2.0f);glVertex3f(1.0f,1.0f,-2.0f);glVertex3f(1.0f,2.0f,-2.0f);glVertex3f(2.0f,3.0f,-2.0f);glVertex3f(2.0f,2
19、.0f,-2.0f); glEnd(); ,机械CAD,40,机械CAD,41, glBegin(GL_POLYGON); glVertex3f(0.0f,1.0f,-2.0f);glVertex3f(0.0f,0.0f,-2.0f);glVertex3f(1.0f,1.0f,-2.0f);glVertex3f(1.0f,2.0f,-2.0f);glVertex3f(2.0f,3.0f,-2.0f);glVertex3f(2.0f,2.0f,-2.0f); glEnd(); ,机械CAD,42,机械CAD,43,9.2.4绘制方式,线框绘制方式(wire frame):这种绘制仅绘制三维物体的
20、网络轮廓线; 深度优先线框绘制方式(depth cued):用线框方式绘图,但使远处物体比近处物体淡一些,以模拟人眼看物体的效果; 反走样线框绘制方式(antialiased):用线框方式绘图,绘制时采用反走样技术以减少图形线条的参差不齐;,机械CAD,44,平面明暗处理方式(flat shading):对模型的平面单元按光照度进行着色,但不进行光滑处理; 光滑明暗处理方式(smooth shading):对模型按光照绘制的过程中进行光滑处理,这种处理方式更接近于现实; 加阴影和纹理的方式(shadow,texture):模型表面贴上纹理甚至加上光照阴影效果,使得三维场景像照片一样逼真;,机械
21、CAD,45,运动模糊绘制方式(motion blured):模拟物体运动时人眼观察时所感觉到的动感模糊现象; 大气环境效果(atmosphere effects):在三维物体中加入雾等大气环境效果,使人身临其境; 深度域效果(depth of effects):近似照相机镜头效果,模型在聚焦点处清晰,反之则模糊。,机械CAD,46,9.2.5 帧缓存和动画,1. 帧缓存屏幕上所有的图形都是由象素组成的,每个象素都有一个固定的颜色或带有相应点的其他信息,如深度等。因此在绘制图形时,内存中必须为每个象素均匀的保存数据,这个所有象素保存数据的内存区就叫缓冲区,又叫缓存(buffer)。,机械CAD
22、,47,不同的缓存可能包含每个象素的不等数位的数据,但在给定的一个缓存中,每个象素都被赋予相同数位的数据。存储一位象素信息的缓存叫位面(bit plane)。系统中所有的缓存通称为帧缓存(Frame buffer),可以利用这些不同的缓存进行颜色设置、隐藏面消除、场景反走样和模板等操作。,机械CAD,48,OpenGL帧缓存由以下四种缓存组成:颜色缓存(Color Buffer)、深度缓存(Depth Buffer)、模板缓存(Stencil Buffer)、累积缓存(Accumulation Buffer)。,机械CAD,49,2. 动画计算机动画是借助于计算机生成的一系列可供动态演示的图形
23、图像技术。字面意思就是在屏幕上动态显示图形,获得生动的画面。因此动画技术在 CAD/CAM/CAI等许多领域都有广泛的应用。由于动画具有直观、形象等特点,因此在模拟与仿真领域中有着非常重要的地位。动画的原理基于视觉具有暂留的特性,动画如同电影一样,实际上是显示一系列的静止画面,当以每秒24幅以上的画面显示时,就可以实现动画的连续性。,机械CAD,50,OpenGL提供了双缓存,可以用来制作动画。也就是说,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当绘制完毕,则后台缓存内容便在前台显示出来,后台又在绘制下一画面内容。这样循环反复,屏幕上显示的总是已经画好的图形,于是看起来所有
24、的画面都是连续的,从而没有抖动。,机械CAD,51,9.3 OpenGL与Visual C+编程,随着奔腾芯片的出现,微机的性能有了很大的进步,Microsoft在Windows98OSR2以上版本的操作系统中内置了OpenGL(OpenGL32.dll和glu32.dll),并将OpenGL置入编译系统Visual C+2.0以上版本,这更为OpenGL在微机上的应用创造了有利条件,使广大用户能够享受OpenGL所带来的强大图形功能。本节主要介绍OpenGL与VC的编程步骤。,机械CAD,52,9.3.1 OpenGL编程基本框架,VC中OpenGL的的编程方式一般有两种,主要的区别是VC的
25、应用程序种类不同,因此,对应了两种应用程序框架,一种为Win32控制台应用程序,另一种是基于MFC的应用程序。,机械CAD,53,1. 控制台应用程序,只需按照以下步骤即可进行OpenGL编程: 1)创建一个新工程(win32 console application); 2)设置包含文件(gl.h、glu.h、glaux.h)和库文件路径(OpenGL32.lib、glu32.lib、glaux.lib); 3)加入OpenGL库。 4)编写OpenGL绘图程序。,机械CAD,54,2. MFC AppWizard应用程序,基本步骤如下: 1)编写创建函数; 2)编写销毁函数,清除位图、定时器等资源及设备场景; 3)修改Cview类的样式; 4)编写OnDraw时间处理程序; 5)在OnSize方法中定义当前视区、投影模型和物体模型以及光源等; 6)编写On Timer时间处理程序; 7)编写OpenGL绘图程序。,机械CAD,55,9.3.2 使用MFC进行OpenGL编程,1. 创建项目文件 2. 添加OpenGL库文件 3. 修改CMyTestView类的代码,机械CAD,56,9.3.3 OpenGL应用实例,机械CAD,57,机械CAD,58,