运用OPENGL进行家居设计的图形制作资料_第1页
运用OPENGL进行家居设计的图形制作资料_第2页
运用OPENGL进行家居设计的图形制作资料_第3页
运用OPENGL进行家居设计的图形制作资料_第4页
运用OPENGL进行家居设计的图形制作资料_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、运用OpenGL进行家居设计的图形制作贵州大学1999级信息学院计算机科学系 徐 磊 021指导老师 刘长云摘要 随着生活水平的改善,家居设计成为现代生活不可缺少的一部分,运用计算机进行家居设计以是一种新兴时尚。学以致用,在毕业课题中,我选用OPENGL进行家居设计。本文通过对OPENGL简单介绍让读者了解OPENGL功能,并运用OPENGL进行设计主要通过创建OPENGL应用程序,OPENGL变量和函数的约定,OPENGL初始化,OPENGL基本图形的绘制,OPENGL的光照与纹理五个步骤来完成其对家居的设计。关键字 视点变换、模型变换、投影变换、辐射光、环境光、散射光、反射光、混合函数、反

2、走样函数、雾函数Use the diagram that OpenGL carries on the furniture design to make 1999 grades in the Guizhou university informatics courtyard computer science systemXu Lei Abstract Along with the improvement of living standard , the stay idle at home design becomes one part that the modern life cannot lac

3、k , and the application computer carries on the stay idle at home design in order to be one kind of new and developing fashion . Being studied for the purpose of application , I choose OPENGL to carry on the stay idle at home design in the graduation subject . This text by way of to OPENGL is simply

4、 introduced to let reader understand OPENGLs merit ability , and using OPENGL to design chiefly to pass through founding the OPENGLs application , appointment of OPENGLs variable and function , OPENGLs initialization , and the illumination of OPENGL is accomplished the design of his partner residenc

5、e with five steps in the veins to drawing of OPENGL underlying graph shapeKey Words Viewpoint mutation , model mutation , projection mutation and radiation light , ambient light , scattered light , reflected light and mix the function and counter to lose shape the function and fog function1.引言快速成型技术

6、已经稳步进入了商品化进程,广大用户在要求快速成型系统具有更高的精度、更快的速度、更稳定的性能和更便宜的价格的同时,也要求系统本身具有漂亮的外观以及友好而丰富的软件界面。 家居设计主要是要靠对所设计的图形进行三维制作,其作用是用完成后的图形形成预览,以达到可以在虚拟的条件下,随意搭配得到各种各样、丰富多彩的组合。这就要求在进行图形设计的时候能够运用快速成型技术,形成图形真实清晰。 OpenGL一经出现,就被认为是高性能图形和交互式视景处理的标准,在计算机图形处理中得到了广泛的应用。OpenGL提供了一种直观的软件编程环境,大大简化了三维图形程序的开发过程,性能较为优越。用户在做三维显示时,省去了

7、大量的投影、透视、消隐、光线处理等算法设计,软件编程变得相对简单,用户可以更加专注于功能、效果等技术细节,深受广大图形开发人员的喜爱。如今,在快速原型软件界面中,采用OpenGL实现三维显示功能是切实可行的。因此,我们在制作家居设计的图形时采用了OPENGL来完成三维图形的制作。2.OpenGL 简介OpenGL是Open Graphics Lib的缩写,是一套三维图形处理库,也是该领域的工业标准。计算机三维图形是指将用数据描述的三维空间通过计算转换成二维图像并显示或打印出来的技术。 OpenGL就是支持这种转换的程序库,它源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发

8、展成为OpenGL。SGI在1992年7月发布1.0版,之后成为工业标准,由成立于1992年的独立财团OpenGL Architecture Review Board (ARB)控制。SGI等ARB成员以投票方式产生标准,并制成规范文档(Specification)公布,各软硬件厂商据此开发自己的系统。OPENGL是一个三维图形和模型库,由于它在三维图形方面的杰出性能,目前许多高级语言都提供了与OPENGL的接口,如:VC、DELPHI、C+Builder等。使用OPENGL可以极大地减少用户开发图形、图像的难度,使用户制作高水准的商业广告、图形CAD、三维动画、图形仿真和影视采集。OPENG

9、L原来是工作站上的一个图形软件库,由于它在商业、军事、医学、航天航空等领域的广泛应用,目前在低档电脑也可以开发出符合用户要求的图形。OPENGL不仅可以绘制基本图像,而且提供了大量处理图形图像的函数与过程。OpenGL是输出到图形硬件的一个软件编程接口,大约包括120条不同命令,用来定义3D物体和交互式3D应用的各种操作。OpenGL用户必须从几何图元(Geometric primitives)的点、线和多边形开始构造所希望的三维模型。它在构造三维立体时,从共面性能考虑,特别以三角形为例进行讨论。它具有建模、变换、光线处理、色彩处理、动画以及其他更先进的高级图形处理能力,如纹理映射、物体运动模

10、糊效果等,可以制作真实感非常强烈的三维立体图形。2.1 生成图形的基本步骤为了满足不同的三维效果要求,OpenGL提供了多种三维物体绘制方式:如线框,深度,反走样线框绘图方式,平面明暗处理方式,光滑明暗处理方式,加阴影和纹理的绘图方式,运动模糊的绘图方式,大气环境效果以及深度域效果等。虽然这多种方式采用的表现手法不一样,但它们生成图像的基本步骤是一样的。1)构造形状根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述(OpenGL把点、线、多边形、图像和位图都作为基本图形单元)。2)空间放置把景物模型放在三维空间的合适位置上,并且设置视点以观察所感兴趣的场景。3)色彩与光照根据应用要求

11、来确定色彩,同时确定光照条件。4)光栅化把景物模型的数学描述及其色彩信息转换成计算机屏幕上的象素点。在上述步骤中,为了提高绘制速度,改善系统性能,OpenGL也执行了消隐等其他操作。从软件编程角度,最大程度上概括来说,其实只有三个基本绘制操作:清除窗口、绘制几何模型和绘制光栅物体图像。2.2 OpenGL库文件为了提供功能强大的图元绘制命令,简化编程工作,windows提供了四个OPENGL库文件1)OpenGL功能库(GLU)包含几个使用低级的OpenGL命令的例程,可以用来创建指定视角的投影模型,执行多边形镶嵌和表面着色,这里使用glu命令前缀。2)OpenGL X窗口系统扩展库(GLX)

12、提供创建OpenGL上下文和相关的X窗口系统的可画窗口。它提供了与X窗口系统的相挂接功能,这里使用glx命令前缀。3)OpenGL编程指南辅助功能库结合讨论教学使用,可以通过ftp获取,使用aux命令前缀。4)Open Inventor独立产品提供预建的对象和用于交互的内置事件模型,用于创建和编辑三维场景的高级应用部件,以及打印对象和与其他图形格式交换数据的能力。通过对OpenGL的学习,以及具体在家居设计当中的运用,我们了解到,在三维图形的制作过程当中,主要须要通过两个方面来完成,一是三维原型的显示;二是图形的三维绘制。2.3 OpenGL程序运行方式运行OpenGL主要有以下三种方式:1)

13、OpenGL硬件加速方式一些显示芯片如3Dlabs公司的GliNT进行了优化,OpenGL的大部分功能均可由硬件实现,仅有少量功能由操作系统来完成。这样极大地提高了图形显示的性能,并且能够获得工作站级的图形效果,但是这样的图形硬件价格十分昂贵,非一般用户所能承担。2)三维图形加速模式一些中低档的图形芯片往往也具备一定的三维加速功能,由硬件来完成一些较为复杂的图形操作。一些重要的OpenGL操作,例如Z缓存等就能够直接由显示卡硬件来完成,显示卡所不能支持的图形功能,则通过软件模拟的方式在操作系统中进行模拟。采用这种方法,显示速度尽管无法与硬件加速方法相比,但与采用纯软件模拟方式相比,速度要快得多

14、。3)纯软件模式对于不具备三维加速功能的显示卡,要想运行OpenGL,只能采用纯软件模拟方式。由于所有复杂的OpenGL图形功能均通过主机来模拟,所以速度将会受到很大的影响。但正是由于有了软件模拟方式,才使得更多的用户能够领略OpenGL的强大功能,并能在硬件性能较差的机器上对OpenGL进行开发。采用了OpenGL技术,大大降低了开发高质量图形软件对软、硬件的依赖程度。OpenGL对硬件的要求如下:CPU:Pentinum或Pentinum Pro时钟频率:90MHz以上内存:16/32/64MB以上硬盘:512MB以上(其它可选)OpenGL对软件环境的最低要求是:操作系统:Windows

15、 NT4.0以上或Windows 95以上OpenGL库:Visual Studio 5.0以上版本已包含该库。2.4 OpenGL的工作流程1) 几何操作a.针对每个顶点的操作每个顶点的空间坐标需要经过模型取景矩阵变换、法向矢量矩阵变换,若允许纹理自动生成,则由变换后的顶点坐标所生成的新纹理坐标替代原有的纹理坐标,再经过当前纹理矩阵变换,传递到几何要素装配步骤。b.几何要素装配不同的几何要素类型决定采取不同的几何要素装配方式。若使用平直明暗处理,线或多边形的所有顶点颜色则相同;若使用裁剪平面,裁剪后的每个顶点的空间坐标由投影矩阵进行变换,再由标准取景平面进行裁剪,再进行视口和深度变换操作。如

16、果几何要素是多边形,还要做剔除检验,最后生成点图案、线宽、点尺寸的像素段,并赋上颜色、深度值。 2) 像素操作由主机读入的像素首先解压缩成适当的组份数目,然后进行数据放大、偏置,并经过像素映射处理,根据数据类型限制在适当的取值范围内,像素最后写入纹理内存,使用纹理映射或光栅化生成像素段;如果像素数据由帧缓冲区读入,则执行放大、偏置、映射、调整等像素操作,再以适当的格式压缩。像素拷贝操作相当于解压缩和传输操作的组合,只是压缩和解压缩不是必须的,数据写入帧缓冲区前的传输操作只发生一次。 3)像素段操作当使用纹理映射时,每个像素段将产生纹素,再进行雾效果计算、反走样处理。接着进行裁剪处理、一致性检验

17、(只在RGBA模式下使用)、模板检验、深度缓冲区检验和抖动处理。若采用颜色索引模式,像素还要进行逻辑操作;在RGBA模式下则进行混合操作。根据着色模式不同,决定像素段采取颜色屏蔽还是指数屏蔽,屏蔽操作之后的像素段将写入到适当的帧缓冲区。如果像素写入模板或深度缓冲区,则进行模板和深度检验屏蔽,而不用执行混合、抖动和逻辑操作。对于创建一个三维图形的基本步骤,大致可以包括以下三个主要环节:a.建模:包括几何建模和行为建模,几何建模处理物体的几何和形状的表示,行为建模处理物体的运动和行为的描述; b.设置视点:描述观察者的空间位置;c.设置环境:描述环境的特征,如:光源、空气能见度等。4)三维物体的绘

18、制方式OpenGL的绘制过程多种多样,内容非常丰富,主要提供以下几种对三维物体的绘制方式:a.线框绘制方式(Wire frame):绘制三维物体的网格轮廓线。b.深度优先线框绘制方式(Depth cued):采用线框方式绘图,使远处的物体比近处的物体暗一些,以模拟人眼看物体的效果。c.反走样线框绘制方式(Antialiased):采用线框方式绘图,绘制时采用反走样技术,以减少图形线条的参差不齐。d.平面明暗处理方式(Flat shading):对模型的平面单元按光照进行着色,但不进行光滑处理。e.光滑明暗处理方式(Smooth shading):对模型按光照绘制的过程进行光滑处理,这种方式更接

19、近于现实。f.加阴影和纹理的方式(Shadow and Texture):在模型表面贴上纹理甚至加上光照阴影效果,使三维场景像照片一样逼真。g.运动模糊绘制方式(Motion blured):模拟物体运动时人眼观察所觉察到的动感模糊现象。h.大气环境效果(Atmosphere effects):在三维场景中加入雾等大气环境效果,使人有身临其境之感。i.深度域效果(Depth of effects):类似于照相机镜头效果,模拟在聚焦点处清晰。3.OPENGL的功能3.1 图形变换是图形显示与制作的基础,动画设计和动画显示都离不开图形的变换,图形变换在数学上是由矩形的乘法来实现的,变换一般包括平移

20、、旋转和缩放。按图形的显示性质来分:视点变换、模型变换、投影变换、剪裁变换和视口变换等。3.2 光照效果 不发光的物体的颜色是由物体反射外界光所形成的,这是光照。在三维图形中,如果光照使用不当,三维图形就会失去真实的立体感,OPENGL把光照分为:辐射光、环境光、散射光、反射光等。3.3 纹理映射 通过纹理映射可以在三维表面添加显示现实世界中的纹理。如:一个矩形它不能表示真实世界中的物体,如果填上本质纹理,就逼真了。3.4 图形特效 混合函数、反走样函数和雾函数,可以处理三维图形听之任之物体的透明和半透明、使用线段理加光滑以及提供雾化的效果。3.5 图像特效 处理位图的基本函数:图像绘制、图像

21、拷贝和存储、映射和转移、图像的缩放等。位图操作函数可以人绘图原的低层说明中文字符的形成过程。3.6 几何建模在opengl中提供了绘制点,线,多边形等基本形体的函数,还提供了绘制复杂三维曲线,曲面(如Bezier,Nurbs等)和三维形体(如球,锥体和多面体等)的函数。由于OpenGL是以顶点为图元,由点构成线,由线及其拓扑结构构成多边形。所以应用这些建模函数,可构出几乎所有的三维模型。3.7 坐标变换包括取景变换,模型变换,投影变换和视区变换。3.8 颜色模式设置RGBA模式和颜色索引模式。3.9 光照和材质设置可设置四种光,即辐射光,环境光,镜面光和反射光。材质用模型表面的反射特性表示。3

22、.10 图像功能提供象素拷贝和读写操作的函数,还提供了反走样,融合和雾化等,以增强图像效果。3.11 纹理映射OPENGL的纹理映射功能可十分逼真地再现物体表面的细节。3.12 实时动画利用OPENGL的双缓存(DOUBLE BUFFER)技术可获得平滑逼真的动画效果。3.13 交互技术方便的三维图形交互接口(选择,拾取,反馈),可进行人机交互操作。2.14 Win32下OpenGL的运行机制由于opengl的作用机制是客户(client)服务器(server)机制,由客户(用opengl绘制图形的应用程序)向服务器(opengl内核)发送opengl命令,服务器则负责解释这些命令。在大多数情

23、况下,客户和服务器在同一机器上运行,当然,也可以在网络环境下使用,所有opengl具有网络透明性,于在win32下的图形设备接口(cdi)把图形函数库封装在动态的连接库CDI32.DLL内一样,opengl的图形库也被封装在一个动态库openg132.dll内。从客户应用程序发布的对opengl函数的调用首先被openg132.dll处理,然后传送给服务器后,被winsrv.dll进一步处理,在传给win32设备驱动接口(DDI),最后把处理过的图形命令送给视频显示驱动程序。2.15 OpenGL函数及结构下面以MICROSOFT的windows95(98)为支撑平台,说明OPENFL函数及结

24、构。1)OPENGL核心函数Opengl核心函数有100多个,每个函数以GL开头。这些函数是最基本的,可运行于任何的工作平台。可用这些函数创建二维和三维几何形体,设置视点,建立视觉体,设置颜色及材质,建立灯光,进行纹理映射等。2)OPENGL实用库函数OPENGL实用库函数以glu开头。这些函数是基于核心函数的,提供对辅助函数特性的支持,并且执行了核心的opengl交互,因而是比核心函数更高一层的函数,也更具有通用性。3) 辅助库函数 辅助库函数有31个,这些函数以aux开头。主要是帮助初学者尽快进入编程而做简单练习之用。4)windows专用函数这些函数以wgl开头,是用于连接opengl和

25、windows窗口系统的。用它们可以管理着色描述表(render context)及显示列表(display list),扩展功能,管理字体位图等。5)win32 API函数共6个函数,用于处理象素格式及缓存。CHOOSEPIXELFORMAT DESCRIBEPIXELFORMAT.6)OPENGL结构共有4个,如下:GLYPHMETRICSFLOAT LAYERPLANEDESCRIPTOR PIXELFORMATDESCRIPTOR POINTFLOAT4.创建OPENGL应用程序1.一般原则 A 有uses中添加OPENGL支持单元:OpenGL; B 在窗体的OnCreate事件过程

26、中初始化OPENGL; C 在窗口的OnPaing 事件过程中初始化OPENGL; D 在窗口的OnResize事件过程中初始化OPENGL; E 在窗口的OnDestroy 事件过程中初始化 OPENGL;2、简单实例A 创建一个工程FILE-New ApplicationB 在OnCreate事件中添加代码:procedure TfrmMain.FormCreate(Sender: TObject);var pfd:TPixelFormatDescriptor; /设置描述表 PixelFormat:Integer;begin ControlStyle:=ControlStyle+csOp

27、aque; FillChar(pfd,sizeof(pfd),0); with pfd do begin nSize:=sizeof(TPixelFormatDescriptor); nVersion:=1; dwFlags:=PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; iPixelType:=PFD_TYPE_RGBA; cColorBits:=24; cDepthBits:=32; iLayerType:=PFD_MAIN_PLANE; end; PixelFormat:=ChoosePixelFormat(C

28、anvas.Handle,pfd); SetPixelFormat(Canvas.Handle,PixelFormat,pfd); hrc:=wglCreateContext(Canvas.Handle); w:=ClientWidth; h:=ClientHeight;end;C 在OnDestroy事件中的代码procedure TfrmMain.FormDestroy(Sender: TObject);begin wglDeleteContext(hrc);end;D 在OnPaint事件中的代码procedure TfrmMain.FormPaint(Sender: TObject);

29、begin wglMakeCurrent(Canvas.Handle,hrc); glClearColor(1,1,1,1); glColor3f(1,0,0); glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); MyDraw; glFlush; SwapBuffers(Canvas.Handle);end;E 在OnResize事件中的代码procedure TfrmMain.FormResize(Sender: TObject);begin glMatrixMode(GL_PROJECTION); glLoadIdentity; gl

30、Frustum(-1.0,1.0,-1.0,1.0,3.0,7.0); glViewPort(0,0,ClientWidth,ClientHeight); MyDraw;end;5.OPENGL变量和函数的约定1.OPENGL的库约定它共三个库:基本库、实用库、辅助库。在DELPHI中,基本库由OpenGL单元实现,在Windows环境中,一般不使用辅助库。2.OPENGL常数约定 OPENGL常数均使用大写字母,以GL开头,词汇之间使用下划线分隔,如:GL_LINES,表示使用基本库绘制直线。3.OPENGL函数的命名约定 A 第一部分以gl或wgl开头,如glColor3f中的gl。 B

31、第二部分是用英文表示的函数功能,单词的首字母大写出。 C 第三部分是数字,表示函数的参数。 D 第四部分是小写字母,表示函数的类型。b 9位整数 s 16位整数 i 32位整数 f 32位浮点数 d 64位浮点数 ub 9位无符号整数6.OPENGL的初始化1.PIXELFORMATDESCRIPTOR结构主要描述像素点的性质,如像素的颜色模式和红、绿、蓝颜色构成方式等。 tagPIXELFORMATDESCRIPTOR = packed record nSize: Word; nVersion: Word; dwFlags: DWORD; iPixelType: Byte; cColorBi

32、ts: Byte; cRedBits: Byte; cRedShift: Byte; cGreenBits: Byte; cGreenShift: Byte; cBlueBits: Byte; cBlueShift: Byte; cAlphaBits: Byte; cAlphaShift: Byte; cAccumBits: Byte; cAccumRedBits: Byte; cAccumGreenBits: Byte; cAccumBlueBits: Byte; cAccumAlphaBits: Byte; cDepthBits: Byte; cStencilBits: Byte; cAu

33、xBuffers: Byte; iLayerType: Byte; bReserved: Byte; dwLayerMask: DWORD; dwVisibleMask: DWORD; dwDamageMask: DWORD; end; TPixelFormatDescriptor = tagPIXELFORMATDESCRIPTOR; dwFlags代表点格式的属性:PFD_DRAW_TO_WINDOW 图形绘在屏幕或设备表面PFD_DRAW_TO_BITMAP 在内存中绘制位图PFD_SUPPORT_GDI 支持GDI绘图PFD_SUPPORT_OPENGL 支持OPENGL函数PFD_D

34、OUBLEBUFFER 使用双缓存PFD_STEREO 立体缓存PFD_NEED_PALLETTE 使用RGBA调色板PFD_GENERIC_FORMAT 选择GDI支持的格式绘图PFD_NEED_SYSTEM_PALETTE 使用OPENGL支持的硬件调色板 iPixelType设置像素颜色模式:PFD_TYPE_RGBA或PFD_TYPE_INDEX.。 cColorBits设置颜色的位,如是9表示有256种颜色表示点的颜色。 cRedBits、cGreenBits、cBlueBits 使用RGBA时,三原色所使用的位数。 cRedShitfs、cGreenShifts、cBlueShif

35、ts 使用RGBA时,三原色可以调节的位数。 cAlphaBits、cAlphaShifts 使用RGBA时,Alpha使用的位数与可调节的位数。 cAccumBits设置累积缓存区的位面总数。 cAccumRedBits、cAccumGreenBits、cAccumBlueBits设置累积缓存区的三原色位面总数。 cAccumAlphaBits设置累积缓存区的Alpha位面总数。 cDepthBits设置浓度缓存的深度。 cStencilBits设置Stencil缓存的深度。 cAuxBuffers指辅助缓存的大小。 iLayerType指定层的类型。 bReserved不使用,必须是零。

36、dwLayerMask指定覆盖层的屏蔽。 dwDamageMask设置在相同的框架缓存下是否共用同一种像素模式。2.OPENGL的初始化步骤A 使用Canvas.Handle获得窗口句柄。B 创建一个TPixelFormatDescriptor变量定义像素格式。C 使用ChoosePixelFormat函数选择像素格式。D 使用SetPixelFormat函数使用像素格式生效。E 使用wglCreateContext函数建立翻译描述表。F 使用wglMakeCurrent函数把建立的翻译描述表作为当前翻译描述表。3.资源释放A 使用wglDeleteContext过程删除像素描述表。B 使用R

37、eleaseDC过程释放窗口内存。 在窗口的OnDestroy事件中: begin if hrcnull then wglDeleteCurrent(hrc); if hdcnull then ReleaseDC(Handle,hdc); end;7.OPENGL基本图形的绘制注意底色的设置,颜色设置通常与像素描述变量有关,即与TPixelFormatDescriptor定义中的iPixelType成员有关。 iPixelType:=PFD_TYPE_COLORINDEX; 则只能使用glIndexd,glIndexf,glIndexi,glIndexs,glIndexv,glIndexfv,

38、glIndexiv,glIndexsv过程设置图形颜色。 iPixelType:=PFD_TYPE_RGBA; 则只能使用 glColor3b,glColor3f,glColor4b,glColor4f,glColor4fv设置图形颜色。A 图形底色:屏幕与窗口的颜色,即颜色缓冲区的颜色。改变图形底色首先应使用glClearColor过程设定底色,然后使用glClear过程以这种底色刷新窗口和屏幕。 procedure glClearColor(red:GLClampf,green:GLClampf,blue:GLClampf,alpha:GLClampf); procedure glClea

39、r(mask:GLBitField); red,green,blue,alpha是准备设置的底色,它们的取值是0到1。mask是刷新底色的方式。绘图窗口设置为灰色glClearColor(0.3,0.3,0.3,1);glClear(GL_COLOR_BUFFER_BIT);B 图形颜色 使用glClear3f与glClear4f可以设置图形的绘制颜色。若用三个参数,则分别指设置红、蓝、绿三色光。若用四个参数,则第四个表示RGBA值。2.简单图形的绘制 在glBegin与glEnd过程之间绘制简单图形,如点、线、多边形等。 glBegin(mode:GLenum);绘制过程glEnd; mod

40、e的取值:GL_POINTS 画多个点GL_LINES 画多条线,每两点绘制一条直线GL_LINE_STRIP 绘制折线GL_LINE_LOOP 绘制首尾相接的封闭多边形GL_TRIANGLES 绘制三角形GL_TRIANGLE_STRIP 绘制三边形,每三个点绘制绘制一个三边形GL_TRIANGLE_FAN 绘制三角形GL_QUADS 绘制四边形GL_QUAD_STRIP 绘制四边条,每四点绘制一个四边条GL_POLYGON 绘制多边形 使用glPointSize过程可以设置点的大小;使用glLineWidth过程可以设置线的宽度. 使用glLineStipple过程设置点划线的样板,使用g

41、lEnable(GL_LINE_STIPPLE)过程和对应参数使绘图能够绘制点划线.glDisable(GL_LINE_STIPPLE)过程和对应参数关闭点划线. procedure glLineStipple(factor:GLint,pattern:GLushort); 参数factor表示点划线样板Pattern的重复次数,factor取值1255,Pattern是二进制序列. glLineStipple(1,0,0x11C);0x11C表示为10001110,0表示不画点,1表示画点多边形绘制与点线相似,要改变参数为GL_POLYGON,GL_QUADS,GL_TRANGLES.在绘制

42、时的注意事项: A 多边形的边与边只在顶点相交 B 多边形必须是凸多边形,如果是凹多边形,用户只有折成凸多边形,加快绘制速度.多边形有正面与反面,与之相关的过程:glPolygonMode 控制多边形正,反面绘图模式glFrontface 指定多边形的正面glCullFace 显示多边形是设置消除面glPolygonStripple 形成多边形填充的样式3.简单二次曲面球属于二次曲面. A 球体function gluSphere(qObj:GLUquadricObj,radius:GLdouble,slices:GLint,stacks:GLint);procedure TfrmMain.M

43、yDraw;var qObj:GLUQuadricObj;begin glPushMatrix; glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glColor3f(1,0,0); qObj:=gluNewQuadric; gluQuadricDrawStyle(qObj,GLU_LINE); silhouette silu(:)5et n.侧面影象, 轮廓 gluSphere(qObj,0.5,20,20); SwapBuffers(Canvas.Handle);end;B关于二次曲面的过程gluNewQuadric 创建一个新的二次

44、曲面对象gluDeleteQuadric 删除一个二次曲面对象gluQuadricDrawStyle 指定要绘制的二次曲面类型gluQuadricNormal 设置二次曲面的法矢量gluQuadricOrientation 设置二次曲面是内旋还是外旋转gluQuadricTexture 设置二次曲面是否使用纹理C绘制二次曲面的一般步骤 首先定义一个GLUquadricObj对象; 其次创建一个曲面对象gluNewQuadric; 再次设置二次曲面的特性(gluQuadricDrawStyle, gluQuadricTexture) 绘制二次曲面(gluCylinder,gluSphere,gl

45、uDisk, gluPartialDisk)8.利用OpenGL实现三维绘图8.1初始化OpenGL绘图环境OpenGL提供两种颜色模式:RGB(RGBA)模式和颜色索引模式。在RGBA模式下所有颜色的定义用RGB三个值来表示,有时也加上Alpha值(表示透明度)。RGB三个分量值的范围都在0和1 之间,它们在最终颜色中所占的比例与它们的值成正比。如:(1,1,0)表示黄色,(0,0,1)表示蓝色。颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜色索引值表示(类似于从调色板中选取颜色)。由于三维图形处理中要求颜色灵活,而且在阴影,光照,雾化,融合等效果处理中RGBA 的效果要比颜色索引模式

46、好,所以,在编程时大多采用RGBA模式。 OpenGL提供了双缓存来绘制图像。即在显示前台缓存中的图像同时,后台缓存绘制第二幅图像。当后台绘制完成后,后台缓存中的图像就显示出来,此时原来的前台缓存开始绘制第三幅图像,如此循环往复,以增加图像的输出速度。 设置窗口显示模式函数: void auxInitDisplayMode( AUX_DOUBLE/双缓存方式 |AUX_RGBA);/RGBA颜色模式 2)设置光源 OpenGL的光源大体分为三种:环境光(Ambient light),即来自于周围环境没有固定方向的光。漫射光(Diffuse light)来自同一个方向,照射到物体表面时在物体的各

47、个方向上均匀发散。镜面光(Specular light)则是来自于同一方向,也沿同一个方向反射。全局环境光是一种特殊的环境光,它不来自特于某种定光源,通常做为场景的自然光源。 指定光源函数: Void glLightfv(Glenum light, /光源号 Glenum pname, /指明光源种类 /GL_DIFFUSE 光源为漫射光光源 /GL_AMBIENT 光源为环境光光源 /GL_SPECULAR 光源为镜面光光源 const Glfloat* params);/指向颜色向量的指针 设置全局环境光函数: void glLightModelfv( GL_LIGHT_MODEL_ AM

48、BIENT, const Glfloat* param ); /param 指向颜色向量的指针 起用光源函数: void glEnable(GL_LIGHTING); void glEnable(GL_enum cap);/ cap :指明光源号 3)设置材质 在OpenGL中,用材料对光的三原色(红绿蓝)的反射率大小来定义材料的颜色。与光源相对应,材料的颜色,也分为环境色,漫反射色和镜面反射色,由此决定该材料对应不同的光呈现出不同的反射率。由于人所看到物体的颜色是光源发出的光经物体反射后进入眼睛的颜色。所以,物体的颜色是光源的环境光,漫反射光和镜面反射光与材料的环境色,漫反射色和镜面反射色的

49、综合。例如:OpenGL 的光源色是(LR,LG,LB),材质色为(MR,MG,MB),那么,在忽略其他反射效果的情况下,最终进入眼睛的颜色是(LR*MR,LG*MG,LB*MB)。 材质定义函数: void glMaterialfv( GLenum face, /指明在设置材质 的哪个表面的颜色。可以是GL_FRONT, GL_BACK,或GL_FRONT_AND_BACK GLenum pname,/与光源的pname参数相似 const float* params);/指向材质的颜色向量 4)定义投影方式 也即选择观察物体的角度和范围。由于我们是三维绘图,所以采用不同的视点和观察范围,就

50、会产生不同的观察效果。由于计算机只能显示二维图形,所以在表示真实世界中的三维图形时,需将三维视景转换成二维视景。这是产生三维立体效果的关键。OpenGL提供了两种将3D图形转换成2D图形的方式。正投影(Orthographic Projection)和透视投影(Perspective Projection)。其中,正投影指投影后物体的大小与视点的远近无关,通常用于CAD设计;而透视投影则符合人的心理习惯,离视点近的物体大,离视点远的物体小。此外,在OpenGL中还要定义投影范围,只有在该范围中的物体才会被投射到计算机屏幕上,投影范围外的物体将被裁减掉。 定义投影范围(不同的投影方式对应不同函数

51、): void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near,GLdouble far); /(left,bottom,near)和(right,top,far)分别给出正射投 /影投影范围的左下角和右上角的坐标。 2.定义与windows接口的系统函数 1)定义绘图窗口的位置void auxInitPosition(GLint x,GLint y,GLsizei width, GLsizei heigh);/ (x,y)给出窗口左上角坐标 / width和 heigh给

52、出窗口的宽高 2)定义绘图窗口的标题: void auxInitWindow(GLbyte* 窗口标题字串); 3)定义绘图窗口改变时的窗口刷新函数: void auxReshapeFunc(回调函数名称); /当窗口改变形状时调指定的回调函数 4)定义空闲状态的空闲状态函数以实现动画: void auxIdleFunc(回调函数名称); /当系统空闲时调用指定的回调函数 5)定义场景绘制函数(当窗口更新或场景改变时调用): void auxMainLoop(回调函数名称); /当窗口需要更新或场景变化时调用 3.在VC下实现 在VC编辑器下键入下述代码后,保存为后缀是cpp的C+文件。开始编

53、译,在The build command requires an active project workspace。 Would you like to create a default project workspace? 的提示后,选择“是(Y)”。进入Project菜单,选择Setting项,弹出Project Setting 对话框,选择Link项,在Libaray栏目中加入OpenGL提供的函数库:“opengl32.lib glu32.lib glaux.lib”9.OPENGL中的变换变换是动画设计的基础,包括图形的平移,旋转,缩放等操作,在数学上是通过矩阵来实现的。1)glLo

54、adIdentity过程能够把当前矩阵变为单位矩阵。2)glLoadMatrix过程能够把指定的矩阵设为当前矩阵。procedure glLoadmatrixd(m:GLdouble);procedure glLoadmatrixf(m:GLfloat);m表示4X4矩阵,下面的代码定义并使之成为当前矩阵M:array1.4,1.4 of GLfloat;glLoadMatrix(M);3)glMultMatrix过程能够将当前矩与指定矩阵相乘,并把结果作为当前矩.procedure glMultMatrixd(M:GLdouble);procedure glMultMatrixf(M:GLf

55、loat);4)glPushMatrix和glPopmatrixglPushMatrix能够把当前矩压入矩阵堆栈, glPopMatrix能够把当前矩弹出矩阵堆栈. glPushMatrix能够记忆矩阵当前位置,glPopmatrix能够返回以前所在的位置. 注:glPushMatrix与glPopMatrix必须放在glBegin与glEnd之外.6)几何变换矩阵 三维物体的运动姿态变换,是指物体的平移,旋转,缩放.A glTranslate过程能够把坐标原点移到(x,y,z),它的声明语法: procedure glTranslated(x:GLdouble,y:GLdouble,z:GLdouble); procedure glTranslatef(x:GLdouble,y:GLdouble,z:GLdouble);B glRotate能够使物体旋转一定的角度,它的声明语法: procedure glRotated(angle:GLdobule,x:GLdouble,y:GLdouble,z:GLdouble); procedure glRotatef(angle:GLdobule,x:GLdouble,y:GLdouble,z:GLdouble); 其中angle为旋转角,旋转的中心轴是由(0,0,0)与(x,y,z)两点的连线.C

温馨提示

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

评论

0/150

提交评论