• 487.00 KB
  • 2022-09-27 发布

基于opengl的虚拟运动场漫游毕业设计(论文)

  • 36页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
  4. 网站客服QQ:403074932
摘要1引言11.1课题背景11.2虚拟漫游22虚拟运动场漫游系统实现技术32.13DS建模32.1.13DS造型技术32.1.23DS格式文件的存取42.2OpenGL图形库52.2.1OpenGL体系结构52.2.2创建渲染描述表72.2.3定义逻辑调色板92.2.4设置像素格式102.3碰撞检测技术112.3.1碰撞检测基本原理112.3.2碰撞检测算法分析122.3.3经典算法研究133虚拟运动场漫游系统分析173.1需求分析173.2系统架构174虚拟运动场漫游系统设计与实现184.1场景建模194.2OpenGL模型重构204.2.1OpenGL工作流程204.2.2OpenGL数据类型214.2.3模型重构214.2.4光照模型224.2.5材质设置234.2.6纹理映射244.33DS文件导入264.3.13DS文件导入数据结构264.3.23DS文件的导入274.4漫游控制284.4.1键盘操作284.4.2鼠标操作284.4.3自动播放295系统测试29结论32致谢33\n参考文献34\n摘要随着计算机硬件性能的不断提高和软件技术的迅猛发展,科学计算可视化、计算机动画和虚拟现实成为近几年在计算机图形学领域内三大活跃的发展方向。在这些发展领域,其核心技术都是三维真实感图形,而OpenGL正是“三维世界”的建造者之一。因此,基于OpenGL进行三维场景的显示和交互,成为当前可视化仿真的热点课题。系统基于OpenGL三维图形库,利用3DSMax建立模型,使用VC++开发语言实现运动场的虚拟漫游。系统通过读取3DS文件重构场景模型,使用键盘和鼠标实现场景任意方向的浏览,同时可实现缩小、放大、旋转等基本功能。此外,通过加入碰撞检测技术,增强了系统的真实感和用户的沉浸感。系统采用面向对象理论,设计简单方便,开发成本低,场景具有良好的真实感和实时性,能满足用户基本需求。关键词虚拟现实,虚拟漫游,OpenGL,3DSMax引言VR(VirtualReality,虚拟现实)是21世纪的高新技术,也称灵境技术或人工环境。虚拟现实技术是利用电脑模拟产生一个三维空间的虚拟世界,为用户提供关于视觉、听觉、触觉等感官的模拟,使用户如同身临其境一般,及时、随意地观察三维空间的事物。VR技术是一项涉及计算机图形学、人机交互技术、传感技术、人工智能等众多领域的综合技术,利用计算机生成逼真的三维感知,使人作为参与者通过适当的装置,自由地对虚拟世界进行体验和交互。概括地讲,虚拟现实是通过计算机对复杂数据进行可视化操作与交互式控制的一种全新方式,与传统的人机界面以及流行的视窗操作相比,VR在技术思想上有着质的飞跃。虚拟漫游技术是VR技术的重要分支,在建筑、旅游、游戏、航空航天、医学等多种行业发展很快。由于其可贵的3I特性——沉浸感(Immersion)、交互性(Interactivity)和构想性(Imagination)\n,使得沿用固定漫游路径等手段的其他漫游技术和系统无法与之相比。虚拟场景漫游是虚拟漫游的一个代表性方面,是虚拟场景构建技术和虚拟漫游控制技术的有效结合,具有很好的研究意义和开发前景。1.1课题背景虚拟现实不仅是信息领域科技工作者和产业界研究、开发和应用的热点,也是多方媒体竞相报道的热点,其目标是要创建一个由多维信息构成的和谐人机环境。业界权威人士称虚拟现实技术是继多媒体技术之后的21世纪代表性技术,也是多媒体技术的终极技术。虚拟场景漫游系统是一种虚拟现实系统,同样充分体现出VR系统特有的多感觉器官感知和令人神往的3I优越性。近两年,“数字校园”一词屡见报端,它是继“数字地球”、“数字城市”后提出的概念,是一种集数字化、信息化、可视化等多种技术为一体的计算机管理应用系统。虚拟校园作为数字校园中最重要的一部分,其实现需要运用计算机图形学、图像处理技术结合三维可视化语言在屏幕上显示出来,并实现场景漫游、人机交互等功能。OpenGL(OpenGraphicsLibrary,开放式图形库)是一种独立于硬件和操作系统的API(ApplicationProgrammingInterface,应用程序接口),由于它具有高性能的交互式三维图形建模能力和易于编程开发等特点,已经成为一种三维图形开发标准,是从事三维图形开发工作的主流工具。而VisualC++在编程语言中历来是以王者著称的,由于它基础类库丰富、接口函数灵活多样,已被广泛应用在各个工程技术领域。微软公司在VisualC++6.0开发语言中提供了三个OpenGL函数库,分别为glu32.lib、glaux.lib和OpenGL32.lib,利用这些函数库中的OpenGLAPI函数,可以方便的实现三维图形的建模、渲染和图形变换。OpenGL与VisualC++紧密结合,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性。1.2虚拟漫游虚拟现实和科学计算可视化、计算机动画是计算机图形学领域三大活跃的发展方向。随着计算机技术的发展,虚拟现实技术已经渗透到军事、航空航天、建筑设计、科教、遥感控制等诸多领域。作为虚拟现实技术的一个重要分支,虚拟场景的漫游技术已经走进人们的生活,栩栩如生的电影特效、形象逼真的广告设计、在学生中颇受欢迎的网络游戏以及网上风靡一时的“虚拟旅游”都是虚拟漫游技术的实践成果。\n目前,虚拟场景漫游的最大难点在于建模逼真度和绘制实时性的矛盾。由于在实现虚拟漫游时,观察者距离场景很近,能轻易发现场景中的缺陷和漏洞,这就需要在场景建模时绘制得非常生动、逼真。因此,在建模时要十分精细,同时,由于计算机性能的制约,构造出来的模型越复杂,在绘制时要达到实时效果就越困难,实时性太差就会使观察者无法接受。这对矛盾是整个虚拟现实系统普遍存在的。一般来说,需要在精确程度和绘制速度两方面取一个折中值,即既满足一定的绘制真实感,又不造成观察者的动态不适感。在建模时,可以运用多层次细节方法为场景生成不同的细节层次,这样能够大大减少绘制的计算量,也可以采取一些场景预处理办法,例如用辐射度方法,可在漫游时省去许多计算光照的计算量。2虚拟运动场漫游系统实现技术系统是基于场景建模和模型导入技术的虚拟运动场漫游,因此,首先利用建模软件手工构建运动场模型,再通过VisualC++结合MFC把建好的模型导入OpenGL场景,OpenGL可以对整个三维图形轻松进行渲染,设计交互动作,从而创建良好的虚拟漫游系统,最终实现虚拟运动场的交互式漫游。2.13DS建模系统基于场景建模和模型导入技术,因此,运动场的建模和在OpenGL环境中导入模型都是系统开发的重点。目前,市面上的建模工具主要有美国AutoDesk公司开发的AutoCAD(AutoComputerAidedDesign,Auto计算机辅助设计)和3DSMax(3-DimensionStudioMax,三维影像超级制作室)。AutoCAD是的一个优秀的绘图软件,主要用于二维图形的设计,虽然也可进行三维图形的绘制,但制作三维立体模型仍然比较困难。3DSMax是一个专门的三维制作软件,其功能十分强大,能方便地进行各种三维造型的制作,还包括丰富的材质贴图,是一种方便快捷的三维建模软件。2.1.13DS造型技术3DSMax是一种用于三维物体建模的专门软件,具有强大、完善的三维建模功能,是当今最流行的三维建模、动画制作及渲染软件,被广泛用于室内设计、游戏开发、虚拟现实等领域。3DSMax的造型技术很多,建模方式多种多样,其内部的建模工具十分强大。新引入的面片、网格建模,特别是曲线建模使许多复杂物体的构建变得简单方便,也使个人电脑的三维制作水平真正达到了工作站一级。3DSMax的建模技术很多,一个对象的建立可以使用多种造型技术实现。\na)基本造型基本造型由3DSMax提供的标准几何体、平面图形,可以直接创建。b)放样造型放样是一个强大的造型功能,在三维制作中占有举足轻重的地位。它通过提供给图形一条路径并在路径中放置相同的或不同的图形来制作复杂的造型。c)合成造型合成造型功能是通过合成方式产生对象,如布尔运算、变形、离散、连接等。d)适配变形适配变形是指根据三维视图的原理演化而来。先给定一条路径和在此路径上的一个剖面图形,再由另外两个图形来控制物体的形状。e)面片建模以面片方式创建网格模型,是一种独特的造型方法。面片建模中使用的对象只包含三维面或网格三角形。通过连接许多小三角就可以快速地建立网格表面而产生造型。f)曲线建模曲线建模在建立复杂表面时功能很强,并能在表面之间进行调和。曲线建模系统的成功引入,很大程度上取代了面片建模的中坚地位,可以很容易地创建人物、动物、汽车等复杂造型。g)粒子系统粒子系统是比较特殊的造型系统,一般用来制作雪、雨、灰尘等。粒子系统虽然功能强大,但是易于掌握,在建模过程中使用频繁。在应用范围方面,拥有强大功能的3DSMax被广泛地应用于影视及娱乐行业中,比如广告动画、网络游戏、电影特效等。而在国内发展的相对比较成熟的建筑效果图和建筑动画制作中,3DSMax的使用率更是占据了绝对的优势。3DSMax能方便地建立各种复杂物体模型,但是很难对模型进行仿真控制。OpenGL是一个硬件和图形软件接口,很容易实现模型的各种变换、着色、光照、纹理、交互操作和动画,但是它只提供基本几何元素的造型函数,使得复杂模型的建模相对困难。因此,通常在3DSMax中建立好复杂模型后,再导入OpenGL中对其进行控制和变换等操作,实现场景的漫游。2.1.23DS格式文件的存取\n3DS是一种三维模型的数据文件交换格式,含有纹理和光照信息,用VC++开发语言以十六进制方式打开可以看到其结构。3DS文件结构是由许多块(chunk)组成的,每个块由块信息和块数据组成,块信息又由块的信息类别ID(两个字节长的标识,如4D4D)和下一块的相对位置信息(四个字节数,即下一块的偏移字节数)组成。与许多文件格式一样,3DS文件中的数据也是按低字节在前、高字节在后的方式组织的。例如,两个十六进制字节4A5C组成的整型数,4A是低位字节,5C是高位字节。对于长整型数,如4A5C3B8F,8F3B是高位字节,5C4A是低位字节。每个块实际是一个层次结构,不同类型的块,其层次结构也不相同。3DS文件中有一个基本块,其ID是4D4D,每一个3DS文件都是以这样一个块开始的。在3DS文件中最先出现的主块是基本块,它包含了整个文件。此外,还有两种主块,分别为3D编辑程序块和关键帧块,前者的ID是3D3D,后者的ID是B000。3D编辑程序块表明编辑程序数据开始,物体的形体数据定义从此块开始。关键帧则表明了开始定义关键帧的信息。3DS文件总体结构如同一棵树,在这棵“场景树”中,通常给予每个物体一个数字以标识其在场景树中的位置。在读取3DS文件时,会导入一系列物体数字标识。如果当前数字标识比前一个大,表明当前物体是前一个物体的子物体;反之,当数字标识比前一个数字标识小,则又回到上一层结构。2.2OpenGL图形库三维图形技术的研究已经经历了一个很长的历程,而且涌现了许多三维图形开发工具,其中SGI公司推出的GL(GraphicsLibrary,图形库)表现尤为突出,它使用简便且功能强大。随着计算机技术的迅速发展,GL已经进一步发展成为OpenGL,现在OpenGL被公认为高性能图形和交互式视景处理的标准。虚拟运动场漫游系统就是在基于OpenGL图形库的基础上设计开发的。2.2.1OpenGL体系结构OpenGL是一套图形标准,严格按照计算机图形学原理设计而成,符合光学和视觉原理,非常适合可视化仿真系统。在OpenGL中允许视景对象用图形方式表达,如由物体表面顶点坐标集合构成的几何模型,这类图形数据含有丰富的几何信息,得到的仿真图像能充分表达出其形体特征,而且在OpenGL中有针对三维坐标表示的顶点的几何变换,通过该变换可使顶点在三维空内进行平移和旋转,对于由顶点的集合所表达的物体可以实现其在空间的各种运动。\nOpenGL通过光照处理能表达出物体的三维特性,其光照模型是整体光照模型,它把顶点到光源的距离、顶点到光源的方向向量以及顶点到视点的方向向量等参数代入该模型,计算顶点颜色。因此,可视化仿真图像的颜色体现着物体与视点以及光源之间的空间位置关系,具有很强的三维效果。为弥补图形方法难于生成复杂自然背景的不足,OpenGL提供了对图像数据的使用方法,即直接对图像数据读、写和拷贝,或者把图像数据定义为纹理与图形方法结合在一起生成视景图像以增强效果。为增强计算机系统三维图形的运算能力,相关科研机构已经研制出了专门对OpenGL进行加速的三维图形加速卡,其效果可与图形工作站相媲美。一个完整的窗口系统的OpenGL图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,顶层为应用软件。如图2-1所示。应用软件OpenGL窗口系统操作系统图形硬件图2-1OpenGL图形处理层次结构OpenGL是网络透明的,在客户机/服务器体系结构中,允许本地或远程调用OpenGL。因此,在网络系统中,OpenGL在Windows或其他窗口系统下都可以以一个独立的图形窗口出现。\n客户端驱动程序ClientServer应用程序OpenGL32.DLLGDI32.DLLWINSRV.DLL硬件相关DDIWIN32.DDI视频显示驱动程序图2-2OpenGL体系结构OpenGL在Windows窗口系统上的实现是基于Client/Server模式的,应用程序发出OpenGL命令,由动态链接库OpenGL32.DLL接收和打包后,发送到服务器端的WINSRV.DLL,然后由它通过DDI层发往视频显示驱动程序。如果系统安装了硬件加速器,则由硬件相关的DDI来处理。OpenGL的体系结构如图2-2所示。2.2.2创建渲染描述表在Windows中使用GDI(GraphicsDeviceInterface,图形设备接口)绘图时,必须指定在哪个DC(DeviceContext,设备描述表)中绘制,同样地,在使用OpenGL函数时也必须指定一个RC(RenderContext,渲染描述表)。正如设备描述表DC要存储GDI的绘制环境信息如笔、刷和字体等,渲染描述表RC也必须存储OpenGL所需的渲染信息如像素格式等。渲染描述表主要由以下六个wgl函数来管理。a)wglCreateContext(HDChdc)该函数用来创建一个OpenGL可用的渲染描述表RC。hdc必须是一个合法的支持至少16色的屏幕设备描述表DC或内存设备描述表的句柄。该函数在调用之前,设备描述表必须设置好适当的像素格式。成功创建渲染描述表之后,hdc可以被释放或删除。函数返回NULL值表示失败,否则返回值为渲染描述表的句柄。b)wglDeleteContext(HRChrc)\n该函数用于删除一个RC。一般应用程序在删除RC之前,应使它成为非现行RC。不过,删除一个现行RC也是可以的。此时,OpenGL系统冲掉等待的绘图命令并使之成为现行RC,然后删除它。a)wglGetCurrentContext(void)该函数返回线程的现行RC,如果线程无现行RC则返回NULL。b)wglGetCurrentDC(void)该函数返回与线程现行RC关联的DC,如果线程无现行RC则返回NULL。c)wglMakeCurrent(HDChdc,HRChrc)该函数把hdc和hrc关联起来,并使hrc成为调用线程的现行RC。如果传给hrc的值为NULL,则函数解除关联,并置线程的现行RC为非现行RC,此时忽略hdc参数。d)wglUseFontBitmaps(HDChdc,DWORDdwFirst,DWORDdwCount,DWORDdwBase)该函数使用hdc的当前字体,创建一系列指定范围字符的显示表。可以利用这些显示表在OpenGL窗口画GDI文本。在使用单个RC的应用程序中,在相应WM_CREATE消息时创建RC,当WM_CLOSE或WM_DESTROY到来时再删除它。当WM_PAINT消息到来时,程序再获取DC句柄,并与RC关联起来,绘图完成后,立即解除RC与DC的关联,并释放DC。在使用OpenGL命令向窗口绘制图形之前,必须先建立一个RC,并使之成为现行RC。OpenGL命令无需提供RC,它将自动使用现行RC。若无现行RC,OpenGL将简单地忽略所有的绘图命令。RC与DC管理的示意图如图2-3所示。\n消息循环WM_PAINTGettheDChandle(GetDC)MaketheRCCurrentDrawwithOpenGLMaketheRCnotCurrentReleasetheDChandle(EndPaint)WM_CREATEGettheDChandle(GetDC)CreatetheRCReleasetheDChandle(ReleaseDC)WM_DESTORYDeletetheRC图2-3RC与DC管理示意图2.2.3定义逻辑调色板OpenGL可以使用16色、256色、64K和16M真彩色。真彩模式下不需要调色板,但在16色模式下不能得到满意的效果,因此对OpenGL而言,调色板只有在256色模式下才有意义。Windows把调色板分为系统调色板和逻辑调色板。每个应用程序都有一套自身的逻辑调色板(或使用缺省调色板),当应用程序拥有键盘输入焦点时可以最多使用从16M种色彩中选取的256种颜色(20种系统保留颜色和236种自由选取的颜色),失去焦点的应用程序可能会有某些颜色显示不正常。系统调色板有Windows内核来管理,由系统保留的20种颜色和经仲裁后各个应用程序设置的颜色组成,并与硬件的256个调色板相对应。应用程序的逻辑调色板与硬件的调色板没有直接的对应关系,而是按照最小误差的原则映射到系统调色板中。当应用程序的窗口接收到键盘输入焦点时,Windows会向它发送一条WM_QUERYNEWPALETTE消息,让它设置自己的逻辑调色板,此时Windows会在系统调色板中尽量多地加入应用程序需要的颜色,并生成相应的映射关系。接着Windows会向系统中所有的覆盖型窗口和顶级窗口(包括拥有键盘输入焦点的窗口)发送一条WM_PALETTECHANGED消息,设置逻辑调色板和重绘客户区,以便能充分地利用系统调色板。\nOpenGL内部用浮点数来表示和处理颜色,红绿蓝和Alpha值这四种成份的最大值为1.0,最小值为0.0。在256色模式下,OpenGL把一个像素颜色的内部值按线性关系转换为8比特来输出到屏幕上,其中红色占最低位的3比特,绿色占中间的3比特,蓝色占最高位的2比特。Windows将这个8比特值看作逻辑调色板的索引值。显然,OpenGL输出的8比特值中直接表明了颜色的组成,为了使图形显示正常,通常以线性关系来设置逻辑调色板。因此生成调色板时,把索引值从低位到高位分成3-3-2共三部分,将每一部分映射到0-255中,3比特映射为{0,36,73,109,146,182,219,255},2比特映射为{0,85,170,255},最后把三部分组合成一种颜色。2.2.4设置像素格式像素格式是OpenGL窗口的重要属性,它包括是否使用双缓冲、颜色位数和类型以及深度位数等。像素格式由Windows系统定义的所谓像素格式描述子结构来定义(PIXELFORMATDESCRIPTOR)。相关像素格式属性见表2.1。表2.1像素格式属性标识符注释PFD_DRAW_TO_BITMAPPFD_DRAW_TO_WINDOWPFD_DOUBLEBUFFERPFD_CENERIC_FORMATPFD_SUPPORT_OPENGL支持内存中绘制位图支持屏幕绘图支持双缓冲指定选择GDI支持的像素格式支持OpenGLWindows提供了四个像素格式管理函数。a)ChoosePixelFormat(m_hDC,&pfdWnd)该函数用来比较传送过来的像素格式描述和OpenGL支持的像素格式,返回一个最佳匹配的像素格式索引。该索引值可传给SetPixelFormat为DC设置像素格式。返回值为0时表示失败。b)DescribePixelFormat(m_hDC,pixelformat,&pfdWnd)该函数用格式索引pixelformat说明的像素格式来填写由pfdWnd所指向的像素格式描述子结构,利用该函数可以枚举像素格式。c)SetupGetPixelFormat(HDChdc)该函数用于获取hdc的格式索引。d)SetPixelFormat(m_hDC,pixelformat,&pfdWnd)\n该函数用格式索引pixelformat来设置hdc的像素格式。在使用该函数之前应该调用ChoosePixelFormat来获取像素格式索引。另外,OpenGL窗口风格必须包含WS_CLIPCHILDREN和WS_CLIPSIBLINGS类型,否则设置失败。OpenGL通常支持24种不同的像素格式,如果系统安装了OpenGL硬件加速器,它会支持其他的像素格式。设置DC的像素格式的逻辑图如图2-4所示。枚举或选择像素格式DescribePixelFormatChoosePixelFormat期望的像素格式描述子结构PIXELFORMATDESCRIPTOR设置像素格式匹配NOYES图2-4设置像素格式逻辑图2.3碰撞检测技术碰撞检测是构造可视化系统的不可缺少的一个重要部分,它可以使用户以更自然的方式与可视化系统中的场景对象进行交互。如果没有碰撞检测,当一个对象碰到另一个对象时,往往会“穿墙而过”,而不会产生碰撞的效果,这在现实中是不存在的。因此,构造可视化系统时,必须能够实时、精确地判断场景中物体之间是否发生碰撞。可视化系统中动态物体与静态物体之间或动态物体之间的交互基础就是碰撞检测。2.3.1碰撞检测基本原理碰撞检测(CollisionDetection)即检测虚拟场景中不同对象之间是否发生了碰撞。从几何上讲,碰撞检测表现为两个多面体的求交测试问题。按照是否考虑时间参数,碰撞检测又可分为CCD(ContinousllyCollisionDetection,连续碰撞检测)和DCD(DiscreteCollisionDetection,离散碰撞检测)。CCD的定义如下:设三维空间R用三维几何坐标系统表示,其中有N个运动模型,其状态随着时间而改变,表示第i个模型所占的空间。随着时间的变化形成四维坐标系统,模型沿着一定的轨迹运动形成四维坐标系统,碰撞检测就是判断是否成立。上述定义给出了碰撞检测的精确的理论描述,但其计算\n复杂度太高。在实际运用时通常采用牺牲计算精度提高计算时间的方法,不考虑连续的四维空间,仅仅在离散的点上考虑问题,以简化碰撞检测的计算量。具体方法是在计算出环境中所有物体在下一时刻的位置、方向等运动状态后,检测是否有对象在新的状态下与其它物体重叠若有物体重叠,则发生碰撞,反之则不会发生碰撞。这种方法称为DCD,由名称可知,该方法只检测离散时间点上可能发生的碰撞,若对象运动速度很快或时间点间隔太长时,则可能会出现“穿墙而过”的现象。通常解决的方法有三种:一是对物体的运动速度加以限制;二是尽可能地减小离散点的采样间隔;三是对物体的运动状态加以限制。2.3.2碰撞检测算法分析考虑围绕物体运动的整个空间,所谓的碰撞检测就是检测物体由当前状态运动到下一状态所经过的四维空间与其它物体经过的四维空间是否发生重叠,即检测物体的运动轨迹。由此理论基础,可以给出离散碰撞检测算法,其伪代码如下:BoolCollisionDetection(,);{Input和;fort←0到T,采样间隔为tfor∈{,,...,}移动到t时刻的位置;for∈{,,…,}移动到t时刻的位置;for对象的中的每一个多边形for对象的中的每一个多边形if(与相交)return(true);//发生碰撞else(与没有相交)return(false);//没有发生碰撞}由上面的伪代码可以看出,程序中含三层循环。最外层的for循环,时间t以\n采样间隔t递增。步长t越大,检测速度越快,但检测精度却会下降(严重时可能出现漏检),且这种固定步长的检测算法不能根据具体情况调整步长和精度。第二、三层的for循环,对所有物体(和)进行检测,使问题的时间复杂度变为O()。最内层的for循环,即对组成多面体的基本几何元素(通常是三角形)进行相交测试。若场景中有N个多面体,每个多面体有M个顶点,则碰撞检测的时间复杂度为O()。上述的碰撞检测算法要遍历所有的基本几何元素,是最基本的碰撞检测算法,但是速度很慢。在实际运用中,为了提高检测速度,常常简化算法,简化算法大体上可以分为空间分解法和包围盒层次法两大类。空间分解法是将虚拟空间分解为体积相等的小单元格,只对占据同一单元格或相临单元格的几何对象进行相交测试。典型的空间分解法有八叉树法和二叉空间剖分法。包围盒层次法是利用体积略大而形状简单的包围盒把复杂的几何对象包裹起来,碰撞检测时在包围盒之间进行相交测试。如果包围盒相交,再进行几何对象之间精确的碰撞检测。显然,包围盒法对于判断两个几何对象不相交是十分有效的。包围盒相交,并不意味着两个几何对象一定相交,所以包围盒的选择应该满足既简单又紧密的要求。2.3.3经典算法研究在碰撞检测中,包围盒层次法是比较成熟的算法,其基本思想是通过建立对象的包围盒层次来逐渐逼近对象的几何模型,从而用体积略大而形状简单的包围盒代替复杂的几何对象参加碰撞检测,通过包围盒之间的相交测试快速地排列成不相交的基本几何元素对,以减少相交测试的次数。典型的包围盒碰撞检测法包括球形包围盒检测法、AABB(Axis–AlignedBoundingBoxes,坐标轴的轴向包围盒)检测法、OBB(OrientedBoundingBoxes,方向包围盒)检测法、k-DOP(DiscreteOrientationPolytopes,离散方向多面体)检测法、FDH(FixedDirectionsHulls,固定方向凸包)检测法等。a)球形包围盒检测法球形包围盒检测法是一种最简单的碰撞检测法,顾名思义是用球形来逼近物体或物体的某一部分,再判断近似的包围球是否相交。这种检测法仅需要测试两个球体中心的距离是否小于它们的半径和,若小于,则发生碰撞。如果用中心点距离的平方和半径和的平方进行比较,效果更好。由于去除拙劣的开方运算,运算量大大减少。但是,简单的运算也导致了精确度的降低。b)AABB检测法\n所谓AABB,即包含该碰撞体且边平行于坐标轴的最小六面体。描述一个AABB,仅需六个标量。在构造AABB时,仅需沿着物体局部坐标系的轴向(x,y,z)来构造。因此,所有的AABB具有一致的方向。AABB树是基于AABB的二叉树,按照从上到下的递归细分方式构造生成。在每一次递归过程中,要求取最小的AABB,需沿所选的剖面分别将物体分为正负两半,并将所对应的原始几何元素分别归属正、负两边,整个递归过程类似于空间二叉剖分,只是每次剖分的对象是AABB,而不是空间区域。递归细分一直要进行到每一个叶子节点只包含一个原始几何元素为止,所以具有n个原始几何元素的AABB树具有n-1个非叶子节点和n个叶子节点。AABB树之间的碰撞检测是一个双重递归遍历的过程。对于AABB树A和B,若树A的根节点的AABB与树B内部节点的AABB不相交,则停止向下遍历。如果遍历能达到树B的叶节点,再用该叶节点遍历树A;如果能到达树A的叶节点,则进一步进行基本几何元素之间的相交测试。c)OBB检测法所谓OBB,即包含该对象且相对于坐标轴方向任意的正六面体。与AABB树相比,OBB的最大特点是其方向的任意性,这使得它可以根据被包裹对象的形状特点尽可能紧密地包裹对象。该算法利用顶点坐标的一阶和二阶统计特性,包围盒层次的划分依据是:式(2.1)式(2.2)其中n构成模型的三角形的数目;,,是3×1向量;和是3×3协方差矩阵;:均值;:协方差;第i个三角形的三个顶点是。OBB的计算相对于AABB和包围球而言复杂一些,其关键是寻找最佳方向,并确定在该方向上包围对象的包围盒的最小尺寸。OBB踫撞检测算法能有效提高系统的检测效率,但在解决系统的实时性检测问题时还稍嫌不足。d)k-DOP检测法\nk-DOP的概念最早是由Kay和Kajiya提出的,旨在将各层次包围盒尽可能紧密地包裹其中所含的景物。作为叶节点,景物自身即是最紧的包围盒,但由于包围盒的选取还要求光线与包围盒的求交测试尽可能简单,因此通常选取形状比较简单的球体、圆柱体、长方体等作为包围盒。但是这些形状简单的包围盒具有包裹景物不紧的缺点,Kay和Kajiya提出了根据景物的实际形态选取若干组不同方向的平行平面对(Slab)包裹一个景物或一组景物的层次包围盒技术。这些平行平面对组成一个凸体,称之为平行2k面体,如图2-5所示。由图可以看出每个物体需要用超过3对平行平面对来逼近,所有的平行平面对都是由方向相反的两个法向量所定义的半空间相交得到的,而这些平行平面对的法向量是固定不变的。在实际应用中,可以合理地选择法向量的方向,例如取集合{-1,0,1}中的整数,以简化平行平面对的计算。由此可以看出,AABB是k=6时k-DOP的情形,即6-DOP。当k足够大时,k-DOP就发展为物体的凸包(ConvexHull)。对于平面图形而言凸包是包围一组控制点的凸多边形的边界;对于立体图形而言凸包是用面片连接各顶点的多面体的包络。图2-5用平行平面对包裹对象示意图图2-6平行平面对与对象交点运算图对于k值和平行平面对方向的选取,考察k=6,k=14,k=18,k=24时的情形。如前面所述,当k=6时,k-DOP就是AABB,可以看作是与坐标轴正交的3对平行平面对的交集,即平行平面对的法矢量由矢量(1,0,0),(0,1,0)和(0,0,1),如图2-6所示。当k=14时就有7对(K/2)平行平面对来包裹物体,选平行平面对的法矢量为(1,0,0),(0,1,0),(0,0,1),(1,1,1),(1,-1,1),(1,1,-1)和(1,-1,-1)。前面的3个法矢量所决定的平行平面对的交集就是AABB。后面4\n个矢量决定的8个斜半平面切了AABB的8个角。k=18和k=26时情形,依此类推。因此,只要合理地选取k的大小以及平行平面对的方向,就可以在碰撞检测的简单性和包裹物体的紧密性之间取得较好的折中。e)FDH检测法FDH是一种特殊的凸包,它具有凸包紧密性好的优点。FDH可以看作是AABB的扩展。AABB可以看作是与坐标轴正交的3对平行的平面对的交集。两个AABB相交当且仅当所有的3对平行平面对都分别相交,这个条件很容易检测。扩展AABB的思想,用超过3对的平行平面对来逼近对象,这些平行平面对的法向量固定不变。FDH检测算法首先求一般物体的凸壳,然后将物体的特征面分为一系列凸特征面子集和凹特征面子集,分别对这些子集建立基于FDH的包容体层次。对于凸特征面子集设定一个界限值,当包容体中的特征面数小于这个值时,细分终止。对于凹特征面子集则剖分到每个叶节点只含一个基本几何体。FDH碰撞检测的基本思想是利用几何特性简单的包围盒代替复杂的几何对象进行相交测试,如果两个结点上的包围盒不相交,则它们所包围的对象的基本几何元素的子集不相交,从而不需要对子集中的元素作进一步的相交测试。表2.2五种包围盒方法的比较表包围盒方法紧密性检测速度检测难度检测精度应用范围球形法AABBOBBk-DOPFDH差较差中等较好好快快较快较快慢容易较易较易中等较难差中等中等较好较好宽宽较宽较窄较窄表2.2给出五种包围盒方法的简单比较。球形法是最简单的方法,但是其紧密性和检测精度都较差,在检测精度要求不高的情况下,应用较广。AABB紧密性差,相交测试简单。OBB法紧密性好,但由于方向任意性,使得相交测试较复杂。k-DOP其实是介于AABB和凸包之间的包围盒,其特点是只要合理地选取平行平面对的个数和方向,就可以在碰撞检测的简单性和包裹物体的紧密性之间灵活取舍,即紧密性要优于AABB,而相交测试的复杂度要小于OBB。FDH实质上是AABB的扩展,较其余4种方法而言,其紧密性和检测精度都有了很大改进。\n3虚拟运动场漫游系统分析近些年,随着学校规模不断壮大,师生员工数量也不断增加,2007年年底学校又顺利通过了国家本科教学质量评估,在社会引起很大反响,许多社会人士纷纷到我校参观考察。人流量的增加给学校管理部门增加了工作负担,因此开发一个虚拟校园的交互式漫游系统是非常必要的,虚拟运动场漫游系统正是在这种应用背景下提出设计的。3.1需求分析系统以北京路校区的运动场为研究区域,使用对象定位为学校体育部管理规划人员、本校师生及校外人员。在综合考虑体育部日常管理与规划所需要的各种信息的前提下,为方便体育部领导和教师管理运动场各项设施,规划体育课场地安排而设计并开发的。用户和系统的交互式控制主要通过鼠标和键盘的操作实现,系统可以根据用户的操作,快速、有效地定位检索出运动场各个场地、各项设施的最新信息,并能实现场景的缩放、旋转以及视点的改变等功能。考虑到初次使用学校运动场的校外人员对场景不熟悉,可以通过系统的自动播放功能来了解运动场的概况。3.2系统架构场景是系统中所有可视化对象的集合,系统通过场景建模和模型导入以及用户的交互输入控制场景的绘制与显示。用户的输入主要指键盘、鼠标等输入设备的输入,经输入解释后将变成一系列的控制命令,进行实体模型的加载、数据的管理以及视点方向、位置的设置。然后,模型渲染模块能够根据用户的输入进行场景的实时绘制与动态显示。在这个过程中,还可以根据视点与物体之间的距离进行碰撞检测。虚拟漫游系统框架图如图3-1所示。\n交互输入输入解释用户模型加载数据管理属性设置视点控制模型渲染场景设置几何构建和物理构建场景数据碰撞检测图3-1运动场虚拟漫游系统框架系统基于OpenGL三维图形库进行设计,OpenGL对三维场景的构造一般要经过以下4个操作步骤。a)几何构建根据导入的场景数据对实体模型进行几何重建,主要运用数学方法建立所需场景的几何描述。b)物理构建所谓物理构建就是进行颜色、材质、纹理等的处理,最终将几何图元转换为可供显示的图形或图像。c)场景设置在对三维场景进行渲染前,需要设置相关的场景参数值,包括光源性质(镜射光、漫射光和环境光)、纹理映射方式、视点位置、视线方向等。d)模型渲染模型渲染主要通过投影变换将三维空间场景转换为二维计算机屏幕上的图像。虚拟场景中一般都采用透视投影,以便更好地模拟现实世界。4虚拟运动场漫游系统设计与实现基于场景建模的虚拟漫游系统通常利用建模软件手工搭建三维场景,然后导入漫游系统,使用开发语言Visual\nC++结合OpenGL进行一系列的设置,最终实现场景的虚拟漫游。虚拟漫游系统的实现主要包括虚拟运动场的构建和漫游控制的设计两部分。虚拟运动场构建主要是指立体运动场的构建,以此得到运动场的数据库,漫游控制主要实现运动场的实时显示和交互控制。4.1场景建模基于场景建模及导入模型实现虚拟漫游是当前虚拟现实的热门技术,其中很关键的一个环节就是建立实体模型。系统采用3DSMax7.0对运动场进行建模,具体由以下步骤操作完成。运动场最终效果图如图4-1所示。图4-1运动场最终效果图a)建立基本模型场景建模首先要建立基本的多边形模型。考虑到场景导入的速度问题,将运动场分为两个场景,主场为足球场,副场为篮球场和排球场。b)模型修改基本模型创建后,根据实际需求对模型进行修改,以求更加真实。相对而言,运动场的模型比较简单,没有太多的复杂层面,利用修改器基本可以完成。c)创建材质模型建立完成后,利用材质编辑器对模型创建材质,通常的材质在3DSMax材质库中都能找到,比如在运动场景中涉及的金属纹理,大理石纹理,草坪等,可以直接导入场景。诸如栏网、跑道、国旗等不常用的材质需要手工创建,以.BMP贴图形式导入。d)场景渲染为了增强场景的真实感,需要对场景进行进一步渲染操作,比如灯光背景的设置。e)后期合成\n后期合成主要是对实体模型进行数学描述,以便导出3DS格式文件。利用3DSMax建立虚拟场景,具有可视化、效率高的特点,不过3DSMax生成的3DS格式文件的数据量比较大。由于受到网络带宽及传输速率的限制,在利用3DSMax建模时不宜太精细,贴图不宜太复杂,场景尽量简单。在建模时减少基本几何体的分段数以节约面数,删除场景中不可见的面,使用编辑修改器对模型进行优化。4.2OpenGL模型重构运动场模型建立后,导出的3DS格式文件需要在OpenGL环境中重新绘制、显示。OpenGL的绘图方式与Windows一般的绘图方式不同,Windows采用GDI绘图,而OpenGL采用RC绘图,并且使用特殊的像素格式。4.2.1OpenGL工作流程图4-2为抽象的OpenGL工作流程图,展示了OpenGL处理数据的过程。如图所示,命令由左边进入,首先根据基本图形单元建立场景模型,并且对所建立的模型进行数学描述。数据可以通过流程立即执行这些命令,或者组织到一个“显示列表”后再执行。几何数据像素数据显示列表求值器逐点操作和图元组装像素操作光栅化纹理组装片元操作帧缓存图4-2OpenGL工作流程图其中几何数据是由一组顶点和它所描述的图元,如点、线和多边形组成,OpenGL中的所有几何图元最终都是用顶点描述的,顶点数据除了包含顶点坐标之外,还包含法向量、RGBA颜色值、纹理坐标和其它的数据,这些数据沿着箭头方向传输,求值器将这些数据转换为顶点并对每一个顶点执行相应的顶点计算,随后光栅化为片元,并在执行完每个片元操作后将光栅化后的数据送入帧缓存。\n对于像素数据(包括像素、位图和图像),其处理方式和顶点数据的处理方式是不同的,从内存中读出的像素数据经过像素操作(缩放、偏置和映射)后,将结果数据限制在适当的取值范围内,然后送入纹理内存中进行组装,供纹理映射使用,或者把这些结果数据光栅化为片元后,执行每个片元的操作,最后送入帧缓存;从帧缓存中读出的数据经过像素操作后被送入到处理器内存中。4.2.2OpenGL数据类型OpenGL中定义的数据类型均以GL开头,与C++语言中的数据类型的对照关系如表4.1所示。表4.1OpenGL中的数据类型缩写字符数据类型C++中的数据类型OpenGL中的数据类型bubsusiuifb8位整数8位无符号整数16位整数16位无符号整数32位整数32位无符号整数32位浮点数64位浮点数signedcharunsignedcharshortunsignedshortlongunsignedlongfloatdoubleGLbyteGLubyte,GLboolenGLshortGLushortGLuint,GLsizeiGLuint,GLenum,GLbitfieldGLfloat,GLclampfGLdouble,GLclampdOpenGL的数据类型主要是描述三维物体空间位置及其属性的整数和浮点数。虽然OpenGL的数据类型可以由其他语言的相应数据类型表达,但在编程时使用规范的OpenGL图形库定义的数据类型有利于提高程序的可读性。4.2.3模型重构OpenGL采用有序排列的顶点集合来构造几何图元,而不是将线段、多边形组合起来构造集合图元。例如:glVertex2s(3,8);//整数定义的二维坐标glVertex3f(1.0,2.0,3.0);//浮点数定义的齐次坐标在OpenGL中,同一个几何图元的所有被定义的顶点均放在glBegin()和glEnd()函数之间,同时定义这些顶点之间的关系。在glBegin()和glEnd()函数之间可以指定顶点的颜色、法向和纹理坐标等信息,只需在该顶点的空间位置定义之前,调用相关的函数即可。glBegin()和glEnd()之间可以调用的函数如表4.2所示。\n表4.2glBegin()和glEnd()之间可以调用的函数函数名称函数功能说明glCalllist()glColor*()glMaterial*()glNormal*()glTexCoord*()glVertex*()执行显示列表设置当前颜色设置材质设置法向坐标设置纹理坐标设置顶点坐标4.2.4光照模型在OpenGL的简化光照模型中,光线大致分为:辐射光(EmittedLight)、环境光(AmbientLight)、漫射光(DiffuseLight)和镜面光(SpecularLight)。辐射光是最简单的光源形式,它直接从物体或光源发出去,不会受到任何其它光源的影响;环境光是由光源发出经过环境多次散射而无法确定其方向的光,即可能来自任何方向;漫射光来自一个方向,在光源方向上漫射的分量最大;镜面光来自特定的方向并沿另一个方向反射出去,一个平行光束在理想镜面上的放射率为100%。a)启用与关闭光照在OpenGL中需要显式地启用(或取消)光照计算。如果没有启动关照,当前的颜色只是简单地被映射到当前顶点上,不会进行任何关于法向量、光源、光照模型和材质的计算。启动和取消光照的函数如下:glEnble(GL_LIGHTING);//启用光照glDisable(GL_LIGHTING);//关闭光照如果在环境中定义了光源,则需要为每个光源指定打开或关闭,启用或关闭光源的函数如下:glEnble(GL_LIGHTi);//启用光源(其中i为非负的整数)glDisable(GL_LIGHTi);//关闭光源(其中i为非负的整数)b)光照属性光源有许多特性,如颜色、位置、方向等,在OpenGL中可以通过函数定义光照属性:voidglLightfv(GLenumlight,GLenumpname,constGLfloat*p);\n上述函数中第一个参数light为光源的序号,可以是非负的整数,第二个参数是状态变量。GL_AMBIENT:用第3个参数数组p设置环境光的色彩。缺省值为(0.0,0.0,0.0,1.0)。GL_DIFFUSE:用第3个参数数组p设置漫反射光的色彩。缺省值为(1.0,1.0,1.0,1.0)。GL_SPECULAR:用第3个参数数组p设置镜面反射光的色彩。缺省值为(1.0,1.0,1.0,1.0)。GL_POSITION:用第3个参数数组p设置光的位置。缺省值为(0.0,0.0,1.0,1.0)。函数定义光源的位置采用数组齐次坐标(x,y,z,w):如果w为0,该光源为定向光源,照射方向是原点指向(-x,-y,-z),位置在无穷远;如果w不为0,OpenGL认为是点光源,光源位于(x/w,y/w,z/w)。4.2.5材质设置材质的设置是相对光照而言的,如果定义了光照,则OpenGL采用默认材质;如果定义了材质而没有启用光照,材质也不会启用。材质的启用分为两种:一种是完全被动的,也就是被动地接受或只是材质与光照的作用;另一种是材质色彩占主导,结合材质变换和光照影响。a)定义材质颜色OpenGL应用函数与状态变量启用与取消材质色彩的定义为:glEnble(GL_COLOR_MATERIAL);//能使用glColor()函数定义的顶点颜色glDisable(GL_COLOR_MATERIAL);//不能使用glColor()函数定义的顶点颜色b)材质属性OpenGL应用函数与状态变量定义材质的其他属性:voidglMaterialfv(GLenumface,GLenumpname,constGLfloat*p);函数中第一个参数face为状态变量,可以定义为GL_FRONT,GL_BACK,GL_FRONT_AND_BACK。第二个参数pname为状态变量。GL_AMBIENT:用第3个参数数组p设置材质反射环境光的色彩。缺省值为(0.2,0.2,0.2,1.0)。\nGL_DIFFUSE:用第3个参数数组p设置材质反射漫反射光的色彩。缺省值为(0.8,0.8,0.8,1.0)。GL_AMBIENT_AND_DIFFUSE:用第3个参数数组p设置材质反射环境光和漫反射光的色彩。GL_SPECULAR:用第3个参数数组p设置材质反射镜面反射光的色彩。缺省值为(0.0,0.0,0.0,1.0)。c)材质改换在OpenGL中提供了两种方式来改变场景中的材质。一种方法是利用glMaterial*()来改变材质,调用此函数时需要同时保存当前矩阵,即调用glPushMatrix()和glPopMatrix()。由于调用函数glMaterial*()本身的开销比较大,因此使用此函数来改变材质时需要考虑其对性能的影响。另一种方法是使用函数glColorMaterial(),调用此函数使材质的特性色和当前颜色一致。在使用glColorMaterial()函数时,还需要调用glEnble(GL_COLOR_MATERIAL)使之有效,当不再使用glColorMaterial()功能时,调用glDisable(GL_COLOR_MATERIAL)使之无效,以减少系统的消耗。4.2.6纹理映射OpenGL在改变屏幕像素的基础上支持物体表面的纹理贴图。纹理贴图分为两种:一种作用在物体的颜色上,通常称为颜色纹理;另一种作用在物体表面的法线上,通常称为法线纹理。两种纹理只是作用原理不同,但最终都将改变物体的显示颜色。a)启用与关闭纹理同光照和材质的启用和关闭一样,OpenGL采用glEnable()与glDisable()两个函数定义后续的状态变量,完成纹理贴图模式的启用和关闭:glEnble(GL_TEXTURE_2D);//启用纹理处理glDisable(GL_TEXTURE_2D);//关闭纹理处理b)定义纹理纹理可以是一维的,也可以是二维的,二维纹理映射的函数定义如下:voidglTexImage2D(GLenumtarget,GLintlevel,Glintcomponents,GLsizeiwidth,GLsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels)参数target对应GL_TEXTURE_2D,表示定义二维纹理。参数level表示控制纹理分辨率的级别,若只有一种分辨率,则level=0。参数components\n是一个从1到4的整数,表示纹理的分量选择。1表示选择R分量,2表示选择R和Alpha两个分量,3表示选择R、G、B三个分量,4表示选择R、G、B和Alpha四个分量。参数width和height给出了纹理的长度和宽度。参数border定义了纹理的边界宽度,通常为0。width和height必须是一个偶数加上两倍的border。纹理映射的最大尺寸依赖于OpenGL,但它必须至少使用64*64。若width和height均设置为0,则纹理映射有效地关闭。参数format描述了纹理映射的格式,可以是GL_COLOR_INDEX、GL_RGB、GL_RGBA等。参数type描述了纹理映射的数据类型,可以是GL_BYTE、GL_UNSIGNED_BYTE、GL_INT、GL_GLOAT、GL_BITMAP等。指针pixels存储纹理图像的数据地址,包含纹理图像本身及其边界的数据。c)控制纹理OpenGL的巍峨美丽控制即定义纹理如何包裹物体的表面,因为纹理的外观不会与物体的万幸总保持一致。控制纹理的函数定义如下:voidglTexParameteri(GLenumtarget,GLenumpname,GLfloatp);参数target与纹理的定义一样。参数pname和p的对应形式如表4.3。表4.3pname与p的对应表参数pname取值参数p取值GL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_TGL_TEXTURE_MAG_FILTERGL_TEXTURE_MIN_FILTERGL_CLMAP或GLREPEATGL_CLMAP或GLREPEATGL_NEAREST或GL_LINEARGL_NEARESTGL_LINEARGL_NEAREST_MIPMAP_NEARESTGL_NEAREST_MIPMAP_LINEARGL_LINEAR_MIPMAP_NEARESTGL_LINEAR_MIPMAP_LINEAR表中,GL_TEXTURE_WRAP_S设置纹理在S方向上的控制;GL_TEXTURE_WRAP_T设置纹理在T方向上的控制;GL_TEXTURE_MAG_FILTER设置一个像素纹理点对应多个物体顶点的纹理控制;GL_TEXTURE_MIN_FILTER设置多个像素纹理点对应一个物体顶点的纹理控制。\n4.33DS文件导入系统采用场景建模及模型导入技术实现虚拟漫游,这种技术在开发可视化系统中是十分便捷高效,在一定程度上缩短了复杂物体建模的时间。3DS格式文件的导入大致可以分为两大部分,首先将3DS格式文件中的内容读入OpenGL环境中,然后将读入的模型数据重新整理,并生成处理对象列表,在OpenGL中重新绘制,并且显示出来。4.3.13DS文件导入数据结构在OpenGL环境中导入外部3DS格式文件,首先对程序中涉及的数据结构进行设计,定义各种结构体和类,如顶点坐标、材质信息、模型信息、对象信息等,具体定义内容见头文件Load3DS.h。除了数据类型,还要定义一个3DS格式文件的读入类CLoad3DS,该类的主要作用是将3DS格式文件中的各项内容读入上述各个结构体和类的对象中。程序中涉及3DS文件读入的函数很多,主要用于读取不同的内容,表4.4列出读取3DS格式文件的主要函数及其注释。表4.4读取3DS模型文件主要函数函数名称注释Import3DS(t3DModel*pModel,char*strFileName)CreateTexture(UINTtextureArray[],LPSTRstrFileName,inttextureID)GetString(char*pChunk)ReadChunk(tChunk*pChunk)ReadNextChunk(t3DModel*pModel,tChunk*pPreChunk)ReadNextObjChunk(t3DModel*pModel,t3DObject*pObject,tChunk*pPreChunk)ReadNextMatChunk(t3DModel*pModel,tChunk*pPreChunk)ReadColor(tMatInfo*pMaterial,tChunk*pChunk)ReadVertices(t3DObject*pObject,tChunk*pPreChunk)ReadVertexIndices(t3DObject*pObject,tChunk*pPreChunk)ReadUVCoordinates(t3DObject*pObject,tChunk*pPreChunk)ReadObjMat(t3DModel*pModel,t3DObject*pObject,tChunk*pPreChunk)3DS文件导入模型结构创建纹理读取字符串读取块的ID和字节长度读取下一块结构读取下一个对象块读取下一个材质块读取对象颜色的RGB值读取对象的顶点读取对象顶点索引读取对象的UV纹理坐标读取对象的材质\n4.3.23DS文件的导入OpenGL环境设置完成之后,开始导入3DS格式文件,在OpenGL中重新构建并显示运动场模型。开始结束OpenGL环境设置图形显示从3DS文件读取数据整理读取的数据生成显示列表OpenGL图形控制功能判断是否为3DS文件?报销NY图4-33DS文件导入流程图在读入3DS格式文件时,首先要判断该文件是不是3DS格式,若不是则直接返回,不进行任何操作,若是3DS文件则进入下一步操作,即读取文件中的模型数据。在读取数据时,可以根据实际需要选择性地读入需要的块,忽略一些未知的块。在读入块结构数据时,可以用递归的方法实现,返回上一级的条件是当前已经读入的块的字节数是否等于块的长度;从父块转向读入其子块,用switch语句实现,通过子块的ID号来判断进入哪个分支。程序流程图如图4-3所示。3DS文件读入后,将模型数据重新整理生成显示列表,在OpenGL环境中重新绘制的实现函数为glBegin(g_ViewMode)。由于OpenGL中的所有几何图元都是用顶点描述的,因此此函数的实现过程就是对顶点法向量的计算。\n4.4漫游控制作为一个虚拟场景的漫游系统,最主要的是实现漫游动作的控制。对于普通配置的微机,系统主要响应的交互工具主要是键盘和鼠标。实现漫游时,观察者可以通过鼠标或键盘来控制视点的位置、方向和参考点。当视点的位置、方向和参考点发生改变时,场景中的物体相对于观察者的方位也发生了改变,从而产生了“动感”。系统中,视点即为人的眼睛,其功能与现实世界的照相机类似,视线方向可由参考点位置确定。漫游过程的实质就是通过不断移动视点或改变视线方向而产生三维动画的过程。对场景显示的漫游控制在OpenGL中可以利用gluLookat()函数,通过设置相应的参数来达到漫游的效果。值得一提的是,OpenGL的坐标系和3DSMax的坐标系是不同的,3DSMax中的模型的Z轴是指向上的,而OpenGL中模型的Z轴是垂直屏幕指向用户的,因此需要将顶点的坐标的Y轴和Z轴翻转过来。4.4.1键盘操作系统中由键盘执行的漫游命令包括场景左右旋转、场景缩放、视点改变等。响应左、右旋转命令时,视点保持不变,分别绕Z轴沿逆、顺时针旋转一定角度;响应场景缩放命令时,视点分别沿视线方向移动一定距离。按照这种响应方法,通过空间向量分解运算,即可计算出新的视点和参考点坐标。例如当响应场景旋转命令时视点与参考点坐标的计算公式为:SceneCamera.angle+=Ratotespeed;//顺时针旋转SceneCamera.angle-=Ratotespeed;//逆时针旋转SceneCamera.rand_xz=float(3.13149*SceneCamera.angle/180.0f);//旋转角度式中,SceneCamera.angle表示场景中视点的角度位置;SceneCamera.rand_xz表示旋转的角度;Ratotespeed表示旋转的速度。4.4.2鼠标操作为了方便用户使用,系统还提供了鼠标的控制,通过单击鼠标左键和右键可以进行场景的推进和后退。关键代码如下:voidCS3DManageView::OnLButtonDown(UINTnFlags,CPointpoint){intxPos=point.x;//光标水平位置intyPos=point.y;//光标垂直位置SceneCamera.zpostion+=(float)0.5*sin(SceneCamera.rand_xz)*flyspeed;\nSceneCamera.xpostion+=(float)0.5*cos(SceneCamera.rand_xz)*flyspeed;CView::OnLButtonDown(nFlags,point);}voidCS3DManageView::OnRButtonDown(UINTnFlags,CPointpoint){SceneCamera.zpostion-=(float)0.5*sin(SceneCamera.rand_xz)*flyspeed;SceneCamera.xpostion-=(float)0.5*cos(SceneCamera.rand_xz)*flyspeed;CView::OnRButtonDown(nFlags,point);}4.4.3自动播放系统除了利用键盘和鼠标实现运动场的交互式漫游控制,还设计了场景的自动播放功能。通过自动播放功能,初次使用系统的用户可以方便快捷地对学校运动场的各个场地及各项设施有个概要的了解。实现自动播放功能的关键代码如下:if(IsAutoRotateScene){SceneCamera.angle+=1;//场景方位角变化SceneCamera.pitch+=1;//场景俯仰角变化SceneCamera.rand_xz=float(3.13149*SceneCamera.angle/180.0f);//计算左右旋转角度SceneCamera.xdir=float(SceneCamera.xpostion+10*cos(SceneCamera.rand_xz));SceneCamera.zdir=float(SceneCamera.zpostion+10*sin(SceneCamera.rand_xz));SceneCamera.ydir=SceneCamera.ypostion+SceneCamera.pitch;if(SceneCamera.pitch>360)SceneCamera.pitch=360;if(SceneCamera.pitch<-360)SceneCamera.pitch=-360;}5系统测试\n系统开发完成后,为了保证系统运行的稳定性和可靠性,进行切实有效的系统测试是十分关键的步骤。对于虚拟场景的漫游系统,其场景导入的速度、漫游的实时性显示以及键盘和鼠标的交互控制都是测试的重点。a)系统运行速度由于运行3DSMax等软件对内存的要求比较高,系统开发环境的内存在512M以上。在低内存环境中,因为模型数据量太大,载入模型时内存负载加重,直接影响运行速度。排除内存因素测试系统运行速度。运行速度测试表见表5.1。鉴于模型数据量太大的原因,简化模型是加快运行速度的一个重要途径。一方面减少模型的层面,另一方面简化球网、栏杆等复杂的构造。改进后速度有明显的提升,但还是不够理想。基于场景建模和模型导入技术开发虚拟漫游系统在很大程度上减少了建模的时间,但是对于复杂模型的加载速度是个不容忽视的问题。表5.1运行速度测试表测试内容载入时间处理结果载入单个足球场载入单个排球场载入单个篮球场载入整个运动场载入简单模型载入复杂模型46秒59秒47秒93秒76秒121秒b)模型重构显示为了使运动场的显示更加逼真,模型中使用大量的纹理贴图。模型显示测试主要是测试模型在OpenGL环境中重新构建以后颜色及纹理贴图的显示是否正常。在模型中使用了三种着色形式,一种是直接使用3DSMax软件中自带的调色板对个别物体进行着色,一种是使用软件材质库中的材质,还有一种就是预先创建复杂物体的贴图,然后再贴入物体表面。模型显示测试表见表5.2。表5.2模型显示测试表测试内容测试记录处理结果3DSMax调色板颜色材质库中的自带材质新创建的纹理贴图显示正常显示正常显示异常已处理在使用纹理贴图时,\n难以保证所有纹理贴图均与纹理内存相符合,因为决定纹理是否与纹理内存相符合的因素包括纹理像素格式、颜色成分分量以及纹理的尺寸等。系统中,纹理创建函数如下:CreateTexture(UINTtextureArray[],LPSTRstrFileName,inttextureID)在函数中添加以下代码,用于控制纹理和像素的存储,保证贴图纹理的正常显示。{//生成纹理glGenTextures(1,&textureArray[textureID]);//设置像素对齐格式glPixelStorei(GL_UNPACK_ALIGNMENT,1);glBindTexture(GL_TEXTURE_2D,textureArray[textureID]);gluBuild2DMipmaps(GL_TEXTURE_2D,3,pBitmap->sizeX,pBitmap->sizeY,GL_RGB,GL_UNSIGNED_BYTE,pBitmap->data);}c)交互式漫游控制在虚拟场景漫游系统中,实现人机交互式漫游控制是整个漫游系统的核心,要求使用者通过对键盘和鼠标的操作,能够实现准确且实时的控制。漫游控制测试表见表5.3。表5.3漫游控制测试表测试内容结构记录处理结果按下“←”键按下“→”键按下“↑”键按下“↓”键按下“PageUp”键按下“PageDown”键单击鼠标左键单击鼠标右键向走旋转向右旋转视点升高视点下降场景放大场景缩小场景拉近场景退远经检测,通过人机交互,能够较为理想地实现漫游控制,键盘操作的实时性和鼠标操作的精确性均能满足普通用户的需求。\n结论OpenGL在三维图形的开发及虚拟现实等方面有着广泛的应用前景,不仅是三维加速卡硬件和三维图形应用程序之间一座非常重要的沟通桥梁,同时也为二维地理信息系统的开发技术向三维地理信息系统和虚拟现实技术的过渡提供了可靠的图形保障。系统基于OpenGL三维图形库,利用3DSMax7.0进行运动场的建模,通过VisualC++6.0开发语言编程导入三维模型数据,并利用OpenGL语言渲染场景、设计交互动作,实现了预期设想的虚拟运动场的漫游控制功能,能够通过对键盘和鼠标的操作方便快捷地进行场景的简单浏览、实时旋转、视点控制等。系统采用外部3DS格式文件直接导入OpenGL场景的开发技术,在一定程度上缩短了复杂物体的建模时间,同时也提高了系统的开发效率。但是,由于本人能力限制,系统还有许多需要改进的地方,比如对建模软件的应用不够娴熟,运动场的建模略显粗糙,3DSMax有待更深一步学习和研究;碰撞检测技术研究得很浅显,停留于表面,没有在系统中具体实现,有待进一步完善改进;编程能力还需加强等等。\n致谢经过3个多月的努力终于完成了毕业设计,期间得到了许多老师和同学的热心帮助,在此对他们的无私奉献一并表示感谢。感谢导师于长辉老师在整个毕业设计期间的悉心指导和热心帮助。在完成毕业设计过程中遇到许多意料不到的困难,于老师一如继往的鼓励和支持给予很大的动力。感谢于永彦老师不厌其烦地在技术上给予指导,为本人顺利完成毕业设计提供了保证。于老师严谨的治学态度,渊博的学术知识,务实的工作作风为本人以后的学习工作树立了很好的榜样。感谢王丽萍、陶艳、屠怡清、刘绘、王夏英等同学在生活和学习上给予的帮助和鼓励。特别感谢钱万同学在整个毕业设计过程中给予的帮忙。衷心感谢所有于百忙之中抽出宝贵时间来参加论文审阅和答辩的老师们。此外,还要感谢母校四年的培养,在这四年中,不仅系统地学习了专业知识和技能,自身修养和综合素质也得到进一步的锻炼和提升。最后,感谢父母在本人学习和生活中的无私奉献,正因为有了他们的支持和鼓励,本人才能顺利完成学业,并且有着不断前进的动力。\n参考文献1乔林,费广正,林杜,芦丽丹,马晓峰.OpenGL程序设计.北京:清华大学出版社,20002郭兆荣,李菁,王彦.VisualC++OpenGL应用程序开发.北京:人民邮电出版社,20063孙波.OpenGL编程实例学习教程.北京:北京大学出版社,20004王锦.3DSMAX7三维制作入门与实例教程.北京:机械工业出版社,20055杨格,陈立,郑鸿标,王炳兰.3dsmax三维建模与动画创作实例课堂.北京:人民邮电出版社,20066和平鸽工作室.OpenGL高级编程与可视化系统开发.高级编程篇.北京:中国水利水电出版社,20027和平鸽工作室.OpenGL高级编程与可视化系统开发.系统开发篇.北京:中国水利水电出版社,20028李颖,薛海斌,朱伯立,朱仲立.OpenGL技术应用实例精粹.北京:国防工业出版社,20019SamuelR.Buss著.唐龙译.3D计算机图形学(OpenGL版).北京:清华大学出版社,2006.1010DaveShreiner著.孙守迁,王剑,林宗谐译.OpenGL参考手册(第三版).北京:机械工业出版社,200111DaveShreiner,MasonWoo,JackieNeider,TomDavis著.邓郑祥译.OpenGL编程指南(第四版).北京:人民邮电出版社,2005.412姚领田,高守传.MFC窗口程序设计.北京:中国水利水电出版社,200713王长波,殷红.VC++6.0中用OpenGL实现建筑物虚拟漫游.电脑编程技巧与维护,(2002.3):73~7714郭景,雷鸣.3DSMAX模型在OpenGL中的读取与重现.自动化与仪表,(2002.5):46~4915向世明.OpenGL编程与实例.北京:电子工业出版,199916百建军,朱亚平.OpenGL三维图形设计与制作[M].北京:人民邮电出版社,199917潇湘工作室.OpenGL超级宝典[M].北京:人民邮电出版社,200118贾志刚.精通OpenGL[M].北京:电子工业出版社,l998

相关文档