《CAD计算机辅助设计技术第10章课件.ppt》由会员分享,可在线阅读,更多相关《CAD计算机辅助设计技术第10章课件.ppt(69页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第10章章 OpenGL10.1简介简介10.2OpenGL基本程序结构基本程序结构10.3OpenGL程序设计入门程序设计入门10.1简介简介10.1.1什么是什么是OpenGL?OpenGL是一个功能强大的是一个功能强大的开放开放图形库图形库(OpenGraphicsLibrary)。其其前身是前身是SGI公司为其图形公司为其图形工作站开发的工作站开发的IRISGL。为使其能够更加容易地为使其能够更加容易地移植到不同的硬件和操作系统,移植到不同的硬件和操作系统,SGI开发了开发了OpenGL。目前,目前,OpenGL已已成为开放的国际图形标准。成为开放的国际图形标准。10.1.2Open
2、GL的特点的特点从程序开发人员的角度来看,从程序开发人员的角度来看,OpenGL是一组是一组绘图命令的绘图命令的API集合。利用这些集合。利用这些API能够方便地能够方便地描述二维和三维几何物体,并控制这些物体按描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲区中。某种方式绘制到显示缓冲区中。OpenGL的的API集提供了物体描述、平移、旋转、缩放、光照、集提供了物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字、交互以及提纹理、材质、像素、位图、文字、交互以及提高显示性能等方面的功能,基本涵盖了开发二、高显示性能等方面的功能,基本涵盖了开发二、三维图形程序所需的各个
3、方面。与一般的图形三维图形程序所需的各个方面。与一般的图形开发工具相比,开发工具相比,OpenGL具有以下几个突出特具有以下几个突出特点点:(1 1)跨平台特性)跨平台特性 OpenGL与硬件、窗口和操作系统是相互独立的。与硬件、窗口和操作系统是相互独立的。为了构成一个完整功能的图形处理系统,其设计实现为了构成一个完整功能的图形处理系统,其设计实现共分共分 5 5 层:图形硬件、操作系统、窗口系统、层:图形硬件、操作系统、窗口系统、OpenGL和和应用软件。应用软件。因而,因而,OpenGL可以集成到各种标准窗口和操作系可以集成到各种标准窗口和操作系统中。例如,操作系统包括统中。例如,操作系统
4、包括UNIX,WindowsNT,Windows95/98,DOS等;窗口系统包括等;窗口系统包括XWindows,MicrosoftWindows等。等。(2)应用的广泛性应用的广泛性OpenGL是目前最主要的二、三维交互式图形应用程是目前最主要的二、三维交互式图形应用程序开发环境,已成为业界最受推荐的图形应用编程接序开发环境,已成为业界最受推荐的图形应用编程接口。自从口。自从1992年发表以来,年发表以来,OpenGL已被广泛地应用已被广泛地应用于于CAD/CAM、三维动画、数字图像处理以及虚拟现三维动画、数字图像处理以及虚拟现实等领域,实等领域,Kinetix公司的公司的3DStudio
5、Max就是突出的就是突出的代表。无论是在代表。无论是在PC机上,还是在工作站甚至是大型机上,还是在工作站甚至是大型机和超级计算机上,机和超级计算机上,OpenGL都能表现出它的高性能都能表现出它的高性能和强大威力。和强大威力。(3)网络透明性网络透明性 建立在客户建立在客户/服务器模型上的网络透明性是服务器模型上的网络透明性是OpenGL的固有特性,它允许一个运行在工作站上的的固有特性,它允许一个运行在工作站上的进程在本机或通过网络在远程工作站上显示图形。利进程在本机或通过网络在远程工作站上显示图形。利用这种性质能够均衡各工作站的工作负荷用这种性质能够均衡各工作站的工作负荷,共同承担共同承担图
6、形应用任务。图形应用任务。(4)高质量和高性能高质量和高性能 无论是在无论是在CAD/CAM、三维动画还是可视化仿真三维动画还是可视化仿真等领域,等领域,OpenGL高质量和高效率的图形生成能力都高质量和高效率的图形生成能力都能得到充分的体现。在这些领域中,开发人员可以利能得到充分的体现。在这些领域中,开发人员可以利用用OpenGL制作出效果逼真的二、三维图像来。制作出效果逼真的二、三维图像来。(5)出色的编程特性出色的编程特性OpenGL在各种平台上已有多年的应用在各种平台上已有多年的应用实践,加上严格的规范控制,因此实践,加上严格的规范控制,因此OpenGL具具有良好的稳定性。有良好的稳定
7、性。OpenGL具有充分的独立性与易使用性等。具有充分的独立性与易使用性等。10.2OpenGL基本程序结构基本程序结构Windows95/98以及以及WindowsNT3.51以上的操以上的操作系统中提供了作系统中提供了OpenGL的动态库,在的动态库,在VC+2.0以上的版本中提供了以上的版本中提供了OpenGL的静态库,所以,的静态库,所以,使用使用OpenGL编程,在微机上使用时,最好是编程,在微机上使用时,最好是在上述软件环境中编写在上述软件环境中编写OpenGL程序。程序。在微机版本中,在微机版本中,OpenGL提供了三个函数库,提供了三个函数库,它们是基本库、实用库和辅助库。它们
8、是基本库、实用库和辅助库。10.2.1Windows系统下的系统下的OpenGL函数函数OpenGL的的基基本本库库是是OpenGL的的核核心心函函数数库库,在在这这个个函函数数库库中中,提提供供了了115个个函函数数,这这些些函函数数都都是是以以“gl”为为前前缀缀。这这类类API的的主主要要功功能能包包括括物物体体描描述述、平平移移、旋旋转转、缩缩放放、光光照照、纹纹理理、材材质质、像像素素、位位图、文字处理等。图、文字处理等。所所有有OpenGL提提供供的的操操作作都都可可以以使使用用这这些些函函数数来来实实现现,而而且且,对对于于不不同同的的软软件件和和硬硬件件平平台台,这这些些函函数
9、数的的使使用用是是完完全全相相同同的的,这这个个特特性性注注定定了了OpenGL程程序完美的可移植性。序完美的可移植性。OpenGL的实用库是的实用库是OpenGL基本库的一套子程序,基本库的一套子程序,它提供了它提供了43个函数,这些函数都是以个函数,这些函数都是以”glu”为前为前缀。基本的缀。基本的OpenGL不支持传统上同图形标准相关不支持传统上同图形标准相关的一些几何对象,为了减少一些编程负担,的一些几何对象,为了减少一些编程负担,OpenGL提供了实用库。提供了实用库。主要功能包括绘制二次曲主要功能包括绘制二次曲面、面、NURBS曲线曲面、复杂多边形以及纹理、矩曲线曲面、复杂多边形
10、以及纹理、矩阵管理等。阵管理等。实用库中的所有函数全都是由实用库中的所有函数全都是由OpenGL基本库函数基本库函数来编写的,所以,在使用上和来编写的,所以,在使用上和OpenGL基本库的使基本库的使用是完全相同的,而且,用户也可以使用基本函用是完全相同的,而且,用户也可以使用基本函数库来实现实用库的函数功能。数库来实现实用库的函数功能。OpenGL的辅助库是为了方便用户用标准的辅助库是为了方便用户用标准C编写编写OpenGL程序而编写的。程序而编写的。OpenGL是一个图形标准,所以,在是一个图形标准,所以,在OpenGL中没有提供窗口管理和消息事件响应的函数,中没有提供窗口管理和消息事件响
11、应的函数,这样使用标准这样使用标准C编写编写OpenGL程序是很不方便的,所以程序是很不方便的,所以提供了辅助库。提供了辅助库。它提供了它提供了31个函数,这些函数都是以个函数,这些函数都是以“aux”为前缀。为前缀。OpenGL辅助库提供了一些基本的窗口辅助库提供了一些基本的窗口管理函数、事件处理函数和一些简单模型的制作函数等,管理函数、事件处理函数和一些简单模型的制作函数等,例如,定义窗口的大小、处理键盘时间、鼠标击键事件、例如,定义窗口的大小、处理键盘时间、鼠标击键事件、绘制多面体等等。绘制多面体等等。10.2.2一个简单的一个简单的OpenGL程序程序下下面面将将通通过过一一个个简简单
12、单的的OpenGL程程序序来来说说明明OpenGL头头文文件件的的使使用用、语语法法规规则则、程程序序的的基基本本结结构构、程程序序的的运运行行环环境配置。境配置。例例10.1OpenGL例程例程sample.c#include#include#include#include#includevoidmyinit(void);voidCALLBACKmyReshape(intw,inth);voidCALLBACKdisplay(void);voidmyinit(void)/初始化初始化glClearColor(0.0,0.0,0.0,0.0);/将窗口清为黑色将窗口清为黑色voidCALLBA
13、CKdisplay(void)glClear(GL_COLOR_BUFFER_BIT);/将颜色缓存清为将颜色缓存清为glClearColor命令所设置的颜色,即背景色命令所设置的颜色,即背景色glColor4f(0.2,0.8,1.0,1.0);/选颜色选颜色(R,G,B)glRotatef(30,1.0,1.0,0.0);/做旋转变换做旋转变换auxWireCube(1.0);/绘制六面体的虚线图绘制六面体的虚线图glFlush();/强制绘图,不驻留缓存强制绘图,不驻留缓存voidCALLBACKmyReshape(intw,inth)/用用于于窗窗口口大大小小改改变变时时的的处处理,与
14、绘图无关理,与绘图无关glViewport(0,0,w,h);voidmain(void)auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);/窗窗口口显显示示单单缓缓存存和和RGB(彩色彩色)模式模式auxInitPosition(0,0,200,200);/大小大小x=200y=200(0,0)是屏幕左上点是屏幕左上点auxInitWindow(“openglsample.c”);/初始化窗口,参数是标题初始化窗口,参数是标题myinit();auxReshapeFunc(myReshape);auxMainLoop(display);1.头文件使用头文件使用若
15、若应用程序使用应用程序使用OpenGL核心函数,应包括头文件核心函数,应包括头文件;使用使用GLU库函数,应包括头文件库函数,应包括头文件;使用使用AUX库函数,应包括头文件库函数,应包括头文件;使用使用WGL和和Win32应包括头文件应包括头文件。2.回调(回调(CALLBACK)函数函数CALLBACK函数是一些用来让系统调用的函数,函数是一些用来让系统调用的函数,系统调用它们来实现显示、接受输入事件功能。系统调用它们来实现显示、接受输入事件功能。3.语法规则语法规则OpenGL基基本本库库的的所所有有操操作作函函数数都都是是以以“gl”为为前前缀缀的的。实实用用库库的的所所有有操操作作函
16、函数数都都是是以以“glu”为为前前缀缀。辅辅助助库库的的所所有有操操作作函函数数都都是是以以“aux”为为前前缀缀的的。OpenGL命命令令带有后缀。带有后缀。以以sample.c中中的的glColor4f为为例例,前前缀缀“gl”指指这这个个函函数数是是OpenGL的的核核心心库库函函数数,组组成成命命令令的的单单词词首首字字母母大大写写,如如“Color”;后后缀缀“4”表表示示颜颜色色值值是是由由4个个变变量量来来表表示示的的;“f”表表示示所所表表示示颜颜色色的的每每个个分分量量的的类类型型为为32位位浮点数。浮点数。OpenGL核心库函数常量是以核心库函数常量是以“GL_”开头,均
17、用大写字开头,均用大写字母,并用下划线将每个关键词分开,如母,并用下划线将每个关键词分开,如GL_COLOR_BUFFER_BIT。4.程序的基本结构程序的基本结构一个一个OpenGL程序的基本结构是很简单的,无论多么复杂程序的基本结构是很简单的,无论多么复杂的的OpenGL程序,可以大致分解成以下部分:程序,可以大致分解成以下部分:(1)定义窗口)定义窗口Windows系统下的系统下的OpenGL实现提供了一个辅助函数库实现提供了一个辅助函数库aux,用于解决开窗口和处理输入事件等问题。用于解决开窗口和处理输入事件等问题。窗口管理函数:窗口管理函数:首先,调用首先,调用voidauxInit
18、DisplayMode(Glbitfieldmask)函函数定义窗口的特性,如颜色和缓存区的性质。例如:数定义窗口的特性,如颜色和缓存区的性质。例如:auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);/窗口显示单缓存和窗口显示单缓存和RGB(彩色彩色)模式模式其次,调用其次,调用voidauxInitPosition(Glintx,Glinty,Glintwidth,Glintheight)定义窗口在屏幕上的位置和大小。其定义窗口在屏幕上的位置和大小。其中,中,x,y为窗口左上角的坐标,为窗口左上角的坐标,width,height分别为窗口的分别为窗口的宽和高宽和
19、高(像素个数像素个数)。默认值为。默认值为(0,0,100,100)。例如:。例如:auxInitPosition(0,0,200,200);/大小大小x=200y=200(0,0)是屏幕左上点是屏幕左上点最后,完成上述两个函数调用后,用函数最后,完成上述两个函数调用后,用函数voidauxInitWindow(Glbyte*titleString)打开窗口。窗口的打开窗口。窗口的标题为字符串标题为字符串titleString。窗口窗口把把ESC键与退出函数联系键与退出函数联系起来,可以用来关闭窗口,退出程序。例如:起来,可以用来关闭窗口,退出程序。例如:auxInitWindow(“open
20、glsample.c”);/初始化窗口,参数是标题初始化窗口,参数是标题处理输入事件处理输入事件:当改变窗口尺寸、移动窗口、重新显示窗口时,当改变窗口尺寸、移动窗口、重新显示窗口时,由由auxReshapeFunc(myReshape)调用函数调用函数myReshape重新定义窗口属性。重新定义窗口属性。通常通常myReshape函数调用函数调用glViewPort函数,对当函数,对当前图形进行裁剪,重新定义投影矩阵等。前图形进行裁剪,重新定义投影矩阵等。OpenGL辅助函数库中还包括处理键盘和鼠标输辅助函数库中还包括处理键盘和鼠标输入事件的函数。入事件的函数。(2)初始化操作)初始化操作由于
21、由于OpenGL的绘图方式是由一系列的状态确定的,因而在绘的绘图方式是由一系列的状态确定的,因而在绘制图形前需要做一些准备工作,包括制图形前需要做一些准备工作,包括清缓存区(清缓存区(buffer)、)、定定义光照模型、定义纹理映射等基本操作的初始化状态、设置义光照模型、定义纹理映射等基本操作的初始化状态、设置三维视景体、定义视口。三维视景体、定义视口。例如:例如:glClearColor(0.0,0.0,0.0,0.0);/将窗口清为黑色将窗口清为黑色glClear(GL_COLOR_BUFFER_BIT);/将颜色缓存清为将颜色缓存清为glClearColor命令所设置的颜色,即背景色命令
22、所设置的颜色,即背景色(3)设置观察坐标系下的取景模式和取景框位置及大小设置观察坐标系下的取景模式和取景框位置及大小主要利用了三个函数:主要利用了三个函数:函数函数voidglViewport(GLintx,Glinty,Glsizeiwidth,Glsizeiheight):设置在屏幕上的视口大小,四个参设置在屏幕上的视口大小,四个参数描述屏幕视口四个角上的坐标(以像素表示)。数描述屏幕视口四个角上的坐标(以像素表示)。参数参数(x,y)用于指定视口的左下角在窗口坐标系中的位置,用于指定视口的左下角在窗口坐标系中的位置,参数参数width和和height分别确定矩形视口的宽和高,均以像素分别
23、确定矩形视口的宽和高,均以像素为单位为单位。注意:视口的大小和尺寸是在窗口坐标系中进行度量的,注意:视口的大小和尺寸是在窗口坐标系中进行度量的,默认状态下其坐标原点位于窗口的左下角,其尺寸与窗口默认状态下其坐标原点位于窗口的左下角,其尺寸与窗口的大小相同。的大小相同。视点方向观察体积 函数函数voidglOrtho(left,right,bottom,top,near,far):设置投影方式为正交投影(平行投影),其取景体设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体积是一个各面均为矩形的六面体。函数函数voidgluPerspective(fovy,aspect,z
24、Near,zFar):设设置投影方式为透视投影,其取景体积是一个截头锥体,置投影方式为透视投影,其取景体积是一个截头锥体,在这个体积内的物体投影到锥的顶点。在这个体积内的物体投影到锥的顶点。它它通过指定通过指定x-z平面内的视角大小及宽高比来确定平面内的视角大小及宽高比来确定沿视线方向的棱锥,并通过指定远、近剪切面与沿视线方向的棱锥,并通过指定远、近剪切面与视点间的距离来截断棱锥,得到观察体。视点间的距离来截断棱锥,得到观察体。注注:在默认状态下投影方式为平行正交投影。在默认状态下投影方式为平行正交投影。(4)使用使用OpenGL的库函数构造几何物体对象的的库函数构造几何物体对象的数学描述。包
25、括点线面的位置和拓扑关系、几何数学描述。包括点线面的位置和拓扑关系、几何变换、光照处理等。这是变换、光照处理等。这是OpenGL程序的主要部分。程序的主要部分。在例在例10.1中,在函数中,在函数voidCALLBACKdisplay(void)中写好中写好要绘制的三维图形要绘制的三维图形,然后,在主程序中,然后,在主程序中调用调用auxMainLoop(display)就可让该就可让该图形一直显示。图形一直显示。(5)程序的微机运行环境配置)程序的微机运行环境配置软件与硬件环境软件与硬件环境操作系统:操作系统:Windows95/98,WindowsNT软件开发环境:软件开发环境:Micro
26、softVisualC+4.0及以上版本及以上版本硬件:奔腾级微机,最好配有支持硬件:奔腾级微机,最好配有支持OpenGL硬加速的图形卡硬加速的图形卡连接三个静态库连接三个静态库程序中除了包含必需的头文件如程序中除了包含必需的头文件如外,外,在创建执行文件时,在在创建执行文件时,在VC环环境设置中要连接境设置中要连接opengl32.lib,glu32.lib和和glaux.lib三个函数库。运三个函数库。运行已创建的执行文件时,在行已创建的执行文件时,在windowssystem目录下要有目录下要有opengl32.dll,glu32.dll两个动态连接库。两个动态连接库。10.3OpenG
27、L程序设计入门程序设计入门OpenGL的状态机制的状态机制OpenGL中的图元绘制中的图元绘制坐标变换及其坐标变换及其OpenGL实现实现应用变换的一个实例应用变换的一个实例光照处理光照处理10.3.1OpenGL的状态机制的状态机制OpenGL的绘图方式是由一系列的状态决定的,如果设置了的绘图方式是由一系列的状态决定的,如果设置了一种状态或模式而不改变它,一种状态或模式而不改变它,OpenGL在绘图过程中将一直在绘图过程中将一直保持这种状态或模式。保持这种状态或模式。例例如如,当当前前绘绘图图颜颜色色就就是是OpenGL的的一一个个状状态态,当当选选定定颜颜色后,色后,OpenGL就用这个颜
28、色绘图。在例就用这个颜色绘图。在例10.1中,以下语句中,以下语句voidmyinit(void)glClearColor(0.0,0.0,0.0,0.0);中的函数中的函数glClearColor(0.0,0.0,0.0,0.0)将视口背景色清为黑将视口背景色清为黑色,如果不改变这种状态,视口背景色将一直保持为黑色。色,如果不改变这种状态,视口背景色将一直保持为黑色。再如:再如:glColor3f(1.0,0.0,0.0);/设置当前颜色为红色设置当前颜色为红色glColor3f(0.0,0.0,1.0);/设置当前颜色为蓝色设置当前颜色为蓝色glRectf(0.5,0.5,0.7,0.7)
29、;/绘制一个矩形绘制一个矩形glColor3f(0.0,1.0,0.0);/设置当前颜色为绿色设置当前颜色为绿色glRectf(0.8,0.8,0.9,0.9);glRectf(0.2,0.2,0.4,0.4);执行结果是:一个蓝色的矩形和两个绿色的矩形。执行结果是:一个蓝色的矩形和两个绿色的矩形。10.3.2OpenGL中的图元绘制中的图元绘制任何复杂的图形都是由基本的图元点、线和多边形任何复杂的图形都是由基本的图元点、线和多边形组成的。组成的。程序格式如下:程序格式如下:要绘制某个几何对象,首先必须指明究竟是哪种类要绘制某个几何对象,首先必须指明究竟是哪种类型的几何对象(例如点、线和多边形
30、),否则系统型的几何对象(例如点、线和多边形),否则系统在执行绘图操作时无法判断究竟是画什么。在执行绘图操作时无法判断究竟是画什么。OpenGL提供了一对用于指定顶点序列操作的函数,确定基提供了一对用于指定顶点序列操作的函数,确定基本几何对象的类型。本几何对象的类型。glBegin();();/描述一组顶点,用于建构某种几何对象描述一组顶点,用于建构某种几何对象glEnd();();1.点的绘制点的绘制OpenGL中中点点定定义义为为一一个个方方块块,在在默默认认状状态态下下,点点是是屏屏幕幕上上的的一一个个像像素素。在在OpenGL中中,一一个个点点是是当当作作一一个个n(2,3,4)维向量
31、来处理的。维向量来处理的。OpenGL中中的的点点是是三三维维的的,如如果果用用户户设设定定二二维维坐坐标标(x,y),则则OpenGL在在实实际际计计算算时时处处理理的的点点为为(x,y,0);对对于于由由四四维维齐齐次次坐坐标标定定义义的的顶顶点点(x,y,z,w),在在w非非零零时时,齐齐次次顶顶点点(x,y,z,w)对对应应于于三三维维坐坐标标中中的的点点(x/w,y/w,z/w););若若w=0.0,则对应于无穷远处的点。则对应于无穷远处的点。glVertex2,3,4dfisv(TYPEcoords);例如:例如:glVertex2i(0,1);glVertex3d(-1.0,1.
32、0,3.1425926);glVertex4d(40,-15.9,0,2);Glfloatv3=-1.2f,3.4f,5.6f;glVertex3fv(v);以下操作的结果是在屏幕上绘制三个点以下操作的结果是在屏幕上绘制三个点:glBegin(GL_POINTS)glVertex3f(1.0,0.0,0.0);glVertex3f(1.0,1.0,0.0);glVertex3f(0.0,1.0,1.0);glEnd();2.线的绘制线的绘制与与数数学学意意义义上上两两端端无无限限延延伸伸的的直直线线不不同同,OpenGL的的线线是是数学定义中的线段,用成对的端点来描述。如:数学定义中的线段,用
33、成对的端点来描述。如:glBegin(GL_LINES)glVertex2f(0.0,0.0);glVertex2f(1.0,1.0);glEnd();上述操作描述了一条由坐标原点到点(上述操作描述了一条由坐标原点到点(1.0,1.0)的线段。)的线段。3.多边形的绘制多边形的绘制多多边边形形指指封封闭闭线线段段围围成成的的区区域域。但但OpenGL中中可可以以描描述述的的多多边边形形有有两两点点限限制制:多多边边形形的的边边除除了了多多边边形形的的顶顶点点外外不不允允许许相相交交,即即确确保保多多边边形形为为简简单单多多边边形形;多多边边形形为为凸凸多多边边形形,即任给多边形的两个内部点,其
34、连线完全在多边形内。即任给多边形的两个内部点,其连线完全在多边形内。多边形的描述方式如下:多边形的描述方式如下:glBegin(GL_POLYGON);glVertex*(v0);glVertex*(v1);.glVertex*(vn);glEnd();其其中中,*表表示示glVertex函函数数的的上上述述任任一一种种组组合合形形式式,由由多多边边形顶点形顶点v0,v1,vn的表示形式而定。的表示形式而定。注意:多边形顶点应按一定顺序排列(如逆时针)。注意:多边形顶点应按一定顺序排列(如逆时针)。4.矩形的绘制矩形的绘制由由于于矩矩形形在在几几何何体体构构造造中中出出现现得得比比较较频频繁繁
35、,所所以以OpenGL提提供了专门的矩形函数:供了专门的矩形函数:voidglRectdfis(TYPEx1,TYPEy1,TYPEx2,TYPEy2);voidglRectdfisv(TYPE*v1,TYPE*v2);矩阵的左上、右下角点坐标分别为(矩阵的左上、右下角点坐标分别为(x1,y1)和和(x2,y2),或或者用数组指针者用数组指针v1、v2表示。用上述函数描述的矩形位于表示。用上述函数描述的矩形位于z=0平面内,并且各边分别平行于平面内,并且各边分别平行于x、y轴。但注意:经过坐标轴。但注意:经过坐标变换之后,这些特性可能改变。变换之后,这些特性可能改变。例例10.2基本的图元绘制
36、程序基本的图元绘制程序为为简简单单起起见见,我我们们仅仅改改变变例例10.1中中的的绘绘制制函函数数void CALLBACKdisplay(void)如下:如下:voidCALLBACKdisplay(void)glClear(GL_COLOR_BUFFER_BIT);/将颜色缓存清为将颜色缓存清为glClearColor命令所设置的颜色,即背景色命令所设置的颜色,即背景色glColor4f(1.0,1.0,1.0,1.0);/选颜色选颜色(R,G,B)glPointSize(6.0);/设置点的大小设置点的大小glBegin(GL_POINTS);/在屏幕上绘制三个点在屏幕上绘制三个点gl
37、Vertex3f(0.1,0.2,0.0);glVertex3f(0.2,0.7,0.0);glVertex3f(0.5,0.8,0.0);glEnd();glBegin(GL_LINES);/在屏幕上绘制一条线段在屏幕上绘制一条线段glVertex2f(0.0,0.4);glVertex2f(-0.3,0.8);glEnd();glBegin(GL_POLYGON);/在屏幕上绘制一个四边形在屏幕上绘制一个四边形glVertex2f(-0.6,0.0);glVertex2f(-0.4,0.0);glVertex2f(-0.4,0.3);glVertex2f(-0.6,0.4);glEnd()
38、;glColor3f(1.0,0.0,0.0);/设置当前颜色为红色设置当前颜色为红色glColor3f(0.0,0.0,1.0);/设置当前颜色为蓝色设置当前颜色为蓝色glRectf(0.5,0.5,0.7,0.7);/绘制一个矩形绘制一个矩形glColor3f(0.0,1.0,0.0);/设置当前颜色为绿色设置当前颜色为绿色glRectf(0.8,0.8,0.9,0.9);/绘制一个矩形绘制一个矩形glRectf(0.2,0.2,0.4,0.4);/绘制一个矩形绘制一个矩形glFlush();/强制绘图,不驻留缓存强制绘图,不驻留缓存用该函数替换例用该函数替换例10.1中相应的函数后,运行
39、的结果如下中相应的函数后,运行的结果如下图所示。图所示。10.3.3坐标变换及其坐标变换及其OpenGL实现实现在二维平面上创建三维物体的过程:在二维平面上创建三维物体的过程:在三维空间中创建所绘制物体的模型,由计算机经过适当的在三维空间中创建所绘制物体的模型,由计算机经过适当的变换,将三维坐标系中的点转换为屏幕上的相应位置,以得变换,将三维坐标系中的点转换为屏幕上的相应位置,以得到理想的视觉效果。到理想的视觉效果。OpenGL就是实现将物体的各个顶点通过各种变换矩阵的作就是实现将物体的各个顶点通过各种变换矩阵的作用映射到屏幕的过程用映射到屏幕的过程。下图是顶点变换过程。注意:。下图是顶点变换
40、过程。注意:在模在模式观察变换过程中,顶点的法向量也自动地进行变换。式观察变换过程中,顶点的法向量也自动地进行变换。在在OpenGL编程过程中编程过程中,程序员必须在头脑中有整个坐标程序员必须在头脑中有整个坐标变换过程的清晰的图像,才能将所建的场景模型正确地变换过程的清晰的图像,才能将所建的场景模型正确地显示在屏幕上。显示在屏幕上。OpenGL的坐标变换过程类似于用照相机拍摄照片的坐标变换过程类似于用照相机拍摄照片的过程。使用照相机与坐标变换的步骤比较如下:的过程。使用照相机与坐标变换的步骤比较如下:(1)竖起三角架,将照相机对准场景(视图变换竖起三角架,将照相机对准场景(视图变换,取取景变换
41、景变换,视点变换)。视点变换)。(2)将要拍的场景置于所要求的位置上(造型变换)。将要拍的场景置于所要求的位置上(造型变换)。(3)选择照相机透镜或调整焦距(投影变换)。选择照相机透镜或调整焦距(投影变换)。(4)确定最终的照片需要多大,例如放大照片(视确定最终的照片需要多大,例如放大照片(视口变换)。口变换)。其中其中(1)、(2)顺序可看成照相馆中的照相过程;而顺序可看成照相馆中的照相过程;而在室外摄影时,由于先有景物,再选择照相机的位在室外摄影时,由于先有景物,再选择照相机的位置与方向,因此照相顺序可看成置与方向,因此照相顺序可看成(2)、(1)。OpenGL中的多种变换(几何变换、投影
42、变换等)是由矩中的多种变换(几何变换、投影变换等)是由矩阵的乘积实现的。阵的乘积实现的。OpenGL提供了一系列矩阵操作函数。提供了一系列矩阵操作函数。(1)通用的矩阵操作命令通用的矩阵操作命令voidglMatrixMode(Glenummode);参数取值:参数取值:GL_MODELVIEW、GL_PROJECTION或或GL_TEXTURE。默认的选定默认的选定矩阵为造型矩阵为造型-观察变换矩阵。观察变换矩阵。voidglLoadIdentity(void);OpenGL中的变换命令都是对当前矩阵(当前矩阵为中的变换命令都是对当前矩阵(当前矩阵为以后图形变换所要使用的矩阵)进行操作,因此
43、在以后图形变换所要使用的矩阵)进行操作,因此在选定可修改矩阵后,应首先用上述命令设置当前操选定可修改矩阵后,应首先用上述命令设置当前操作矩阵为单位矩阵。作矩阵为单位矩阵。(2)造型)造型-观察变换观察变换 造型造型-观察变换过程就是一个将顶点坐标从世界坐标变观察变换过程就是一个将顶点坐标从世界坐标变换到视觉坐标的过程。这里很重要的是对两个坐标系的认换到视觉坐标的过程。这里很重要的是对两个坐标系的认识。识。世界坐标系也称为全局坐标系。它是一个右手坐世界坐标系也称为全局坐标系。它是一个右手坐标系,可以认为该坐标系是固定不变的,在初始态下,其标系,可以认为该坐标系是固定不变的,在初始态下,其x x轴
44、为沿屏幕水平向右,轴为沿屏幕水平向右,y y轴为沿屏幕垂直向上,轴为沿屏幕垂直向上,z z轴则为轴则为垂直屏幕面向外指向用户。垂直屏幕面向外指向用户。视觉坐标系视觉坐标系(即观察坐标系即观察坐标系)也称为局部坐标系。也称为局部坐标系。它是一个左手坐标系,该坐标系是可以活动的。在初始态它是一个左手坐标系,该坐标系是可以活动的。在初始态下,其原点及下,其原点及x x、y y轴分别与世界坐标系的原点及轴分别与世界坐标系的原点及x x、y y轴重轴重合,而合,而z z轴则正好相反,即为垂直屏幕面向内。轴则正好相反,即为垂直屏幕面向内。在初始状态下在初始状态下,相机在观察坐标系的原点且指向相机在观察坐标
45、系的原点且指向z z轴正轴正向向,即为垂直屏幕面向内。即为垂直屏幕面向内。平移变换平移变换voidglTanslatefd(TYPEx,TYPEy,TYPEz);旋转变换旋转变换voidglRotatefd(TYPEangle,TYPEx,TYPEy,TYPEz);绕绕矢矢量量v=(x,y,z)T逆逆时时针针方方向向旋旋转转angle指指定定的的角角度度。旋旋转转角角度的范围是度的范围是0360度。当度。当angle=0时,时,glRotate()不起作用。不起作用。缩放变换缩放变换voidglScalefd(TYPEx,TYPEy,TYPEz);变换的顺序:变换的顺序:glMatrixMod
46、e(GL_MODELVIEW);glLoadIdentity();glMultMatrixf(N);/*applytransformationN*/glMultMatrixf(M);/*applytransformationM*/glMultMatrixf(L);/*applytransformationL*/glBegin(GL_POINTS);glVertex3f(v);/*drawtransformedvertexv*/glEnd();在这个过程中,在在这个过程中,在GL_MODELVIEW状态下,相继引状态下,相继引入了入了I(单位阵)单位阵),N,M,L矩阵。变换后的顶点为矩阵。变换
47、后的顶点为NMLv(顶点取顶点取列向量列向量)。因此,顶点的变换为。因此,顶点的变换为N(M(Lv),即是先作变换即是先作变换L,然然后是变换后是变换M,最后才是最后才是N。这里,顶点这里,顶点v的实际变换顺序正好的实际变换顺序正好与指定的顺序相反。与指定的顺序相反。(3)投影变换)投影变换在在调调用用投投影影变变换换命命令令前前必必须须先先在在程程序序中中加加入入下下述述语语句:句:glMatrixMode(GL_PROJECTION);glLoadIdentity();这两条命令一方面指定接下来的变换命令只影响投这两条命令一方面指定接下来的变换命令只影响投影矩阵,同时也将当前投影矩阵设置为
48、单位阵。影矩阵,同时也将当前投影矩阵设置为单位阵。透视投影透视投影voidgluPerspective(Gldoublefovy,Gldoubleaspect,GldoublezNear,GldoublezFar);正交投影正交投影voidglOrtho(Gldoubleleft,Gldoubleright,Gldoublebottom,Gldoubletop,Gldoublenear,Gldoublefar);对对于于二二维维图图形形向向二二维维屏屏幕幕的的投投影影,则则应应使使用用实实用用库库中中的的如如下函数:下函数:void gluOrtho2D(Gldouble left,Gldou
49、ble right,Gldoublebottom,Gldoubletop);前面提到过,用二维顶点命令绘制的二维物体的前面提到过,用二维顶点命令绘制的二维物体的z坐标均为坐标均为零,而零,而gluOrtho2D()命令假定场景中的命令假定场景中的z坐标介于坐标介于-1.0和和1.0之间。之间。(4)视口变换视口变换voidglViewport(GLintx,Glinty,Glsizeiwidth,Glsizeiheight);窗口和视口是两个不同的概念窗口和视口是两个不同的概念。注意:应该使视口的长宽比与取景体积的长宽比相等,注意:应该使视口的长宽比与取景体积的长宽比相等,否则会使图像变形。否
50、则会使图像变形。10.3.4应用变换的一个实例应用变换的一个实例本本节节将将通通过过一一个个简简单单的的程程序序进进一一步步阐阐述述OpenGL的的基基本本变变换换命命令令及及其使用方法。其使用方法。例例10.3三维空间绘制立方体的程序三维空间绘制立方体的程序cube.c#include#include#include#include#includevoidmyinit(void);voidCALLBACKmyReshape(intw,inth);voidCALLBACKdisplay(void);/初始化初始化voidmyinit(void)glClearColor(0.0,0.0,0.0,