免费预览已结束,剩余37页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于opengl的3d游戏设计摘要:随着时代进步,从简单的色块堆砌而成的画面到数百万多边形组成的精细人物,游戏正展示给我们越来越真实且广阔的世界。对于近几年游戏的发展来说,老式2d游戏的画面、游戏性、互动性已经无法满足各类玩家的需要,而3d游戏无论是在游戏画面的真实程度、操作的流畅程度、以及故事背景方面的优越性都非常突出。在这种发展趋势下,2d游戏所占领的市场将会变得微乎其微,3d游戏的开发将会成为整个游戏制作领域的一种趋势。针对于3d游戏开发,opengl作为一个3d的应用程序编程接口(api)来说,是非常合适的。openggl作为与硬件无关的软件接口,只要操作系统使用了openggl适配器就可以打到相同的效果。它又是一个开放图形库,在跨平台领域上非常便利。并且它具有优良的移植性,是广大3d游戏开发者的首选。本论文为利用openggl进行3d射击游戏的设计与开发,采用碰撞检测、粒子系统、md2模型绘制、3d声效等技术,最终实现一个射击游戏。关键词:游戏, 基于openggl,三维, 射击游戏2design the 3d game based on openglabstract: along with the progress of the times,fine characters from simple color swatch built the picture to the millions of polygons, the game is to show us more and more real and the wide world.for the development of the game in recent years, the old 2d games screen ,games andinteractive have been unable to meet all kinds of game player needs, while 3d regardless of the game on the game screen reality, smooth operation, and the background of the story of the superiority is very prominent.in this trend, 2d game occupied market will become very little, the development of 3d games will become the game made a trend in the field.for 3d game development, opengl as the application programming interface of a 3d (api), is a very suitable. openggl as the interface of the software and hardware independence, as long as the operating system uses the openggl adapter can reach the same effect. it is also an open graphics library, cross-platform in areas very convenient. and it has good transplantation, is the 3d game developers choice.in this paper, the design and development of 3d shooting game is to use openggl, the collision detection, particle system, md2 model, 3d sound rendering technology, the ultimate realization of a shooting game.keywords game, openggl, 3d, shooting game西安石油大学毕业设计(论文)39目 录1 引言.11.1 课题的背景及意义11.2 毕业设计的任务11.3 国内外现状的研究21.4 开发技术与开发平台31.4.1 开发技术31.4.2 开发平台32 opengl简介与3d图形学相关52.1 opengl简介52.1.1 opengl特点52.1.2 opengl功能62.1.3 opengl渲染72.2 3d图形学相关82.2.1 向量与矩阵82.2.2 变换82.2.3 投影92.2.4 3d裁剪93 游戏设计113.1 游戏的组成113.2 游戏的结构123.3 本游戏设计124 关键技术154.1 摄像机漫游154.2 碰撞检测164.3 粒子爆炸194.4 云雾效果204.5 简易ai214.6 3d模型234.7 3d音效264.8 游戏场景随机地形285 运行游戏30结论36参考文献37致谢38附录. 391 引 言1.1 课题的背景及意义随着社会的进步,人们生活节奏在逐渐加快,在工作学习之余,游戏娱乐成为了人们释放压力的一种途径,而电子游戏所具有的操作多样、内容丰富、不受场地限制等特点,成为了人们业余生活的一部分。而伴随着电子产品的不断发展,家用计算机的配置越来越高,越来越多的人们对于游戏的要求已经不仅仅只是好玩而已。游戏的耐玩程度,内容的丰富程度,操作的复杂程度,画面的逼真程度等,都是一款游戏好坏的判定依据。3d游戏作为集立体感、真实感于一身的强表现力游戏,已经占据了电脑游戏领域绝大部分市场。3d游戏的设计与开发则会成为当下游戏发展的一种趋势。opengl作为一个专业的图形程序接口,配合c+等开发语言,对于3d游戏的设计与实现是非常占优势的。opengl是一个与硬件无关的软件接口,它具有非常良好的移植性,而且它是行业领域中最为广泛接纳的 2d/3d 图形 api,这些特点都使它深受大部分3d游戏开发者的喜爱。基于opengl三维场景的强大功能是它的实时观察与漫游技术能够绘制高真实三维图形和实现交互式视景仿真和虚拟现实,因此被广泛应用与三维游戏、虚拟现实等领域。1.2 毕业设计的任务在此次毕业设计中,需要完成的任务有:阅读计算机图形学和相应的动画设计技术、用opengl/3dmax实现三维场景建模和游戏设计、vc或vb图形编程等文献和技术资料。分析一些典型的基于opengl/3dmax的三维场景游戏设计实例的特点,掌握三维场景建模和游戏动画设计技术,以及在游戏开发中的交互式技术。掌握用vc或vb、opengl/3dmax建模工具等开发交互式三维场景游戏软件的基本方法。开发相应的软件系统,建立交互式三维场景游戏模型,设计并实现各游戏的功能和任务模块,要求有良好的交互性和3d视觉效果。软件中应包括各游戏开发的基本原理说明和实例功能演示。根据3d游戏设计的实际需求,以及基于opengl的特点上,此次应用c+与opengl来设计开发3d游戏。系统设计的基本内容:本文以基于游戏拥有虚拟性这一特性来设计开发。重点讨论了3d虚拟游戏与现实的人机交互方式、数据的分析处理以及3d游戏开发底层的支持,本文中我们的主要研究内容如下:3d游戏数据处理设计:针对现实游戏与3d游戏的区别,设计合适虚拟游戏开发技术的游戏数据处理系统,对玩家的动作数据进行捕获,传输和计算;3d游戏人机交互设计:针对3d游戏特点以及玩家对人机交互需求的变化,对游戏人机交互进行设计;3d游戏三维底层支持设计:提供对3d游戏系统开发和实现的技术支持;我们对3d虚拟游戏系统的设计采用模块化设计思想,不同功能之间使用接口方式相互调用,方便对游戏系统的连接,调试和扩展。1.3 国内外现状的研究3d游戏开发方面:从技术上来看,国外的3d游戏开发技术已经趋于成熟,3d游戏引擎也日渐完善,大多数高质量的3d游戏均产于国外。无论从画面的真实细腻程度上讲,还是从整个游戏操作的流畅程度来讲,亦或者从游戏的故事情节上来看,国外的3d游戏均已达到一个很高的境界。反观国内,3d游戏近年来在刚刚起步,技术不够成熟,也没有很好的游戏引擎,要达到国外的水平,3d游戏的开发在国内还是有很多要解决的问题。从经济上来看,国外的3d游戏制作公司规模大,不仅有商品的收入,而且版权上也有法律的保障。在国内,由于盗版软件的泛滥,版权问题很难得到保障,游戏开发商制作出来的游戏很难保证不被破解,开发商损失严重,经济利益难以保证。从社会的支持上来看,对于3d游戏的发展,由于文化区域的不同,社会上对这不是采取一种打压的态度,这使得游戏的开发有一个很安稳的环境。而国内,因为文化原因,大多数的家长害怕自己的孩子沉迷于游戏,而荒废正业,这使得3d游戏的开发处在一个艰难的阶段,因为有绝大多数的家长还是希望自己的孩子能远离这些东西。无论从技术上、还是经济上,还是社会的态度上,相比于国外,3d游戏的制作开发都有非常长的一段路要走。opengl方面:在国外openg是具有一定的生命力的,唯一能够取代微软对3d图形技术的完全控制的api。但是由于silicon graphics公司已经不再以任何让微软不悦的方式推广opengl,所以采用opengl开发游戏还是具有一定风险。鉴于opengl的特点,还是有许多非常重要的开发人员仍然在使用opengl进行游戏的开发与创作。因此,硬件开发商目前正在想法设法地加强硬件对opengl的技术支持。现阶段,opengl在图形设备以及相关专业占据着统治地位,这是因为direct3d目前还不能支持这些领域的应用。目前,国内的3d游戏开发技术正处于赶超国外的发展时期,从游戏的创意、游戏的策划、游戏的研究开发与游戏的实现,再到到游戏的运营与维护,都需要大量的知识值得学习。现阶段,由于 linux 操作系统免费开放源码,以及在程序开发方面有很大的优势,所以在开发领域linux平台被大力推广,基于linux 的各种应用软件也层出不穷,因此跨平台3d游戏开发也越来越受重视。由于opengl是一种与平台无关的三维图形开发库,在各种语言结合应用opengl 函数进行主框架开发并都可以开发出3d游戏。但是由于框架开发的平台相关性使得开发出来的游戏无法跨平台编译运行,因此glut+opengl 的方式成了一种很好的选择。1.4 开发技术与开发平台1.4.1 开发技术3d游戏设计是以计算机三维图形学作为游戏的技术基础。在游戏的设计制作阶段,3d游戏世界里所有物体都是以模型的方式建立的,游戏中的立体感和光影效果都是通过对不同的光源和光照的特点进行实时3d渲染而成。3d游戏把游戏世界中的每个物体都看作是一个立体的对象,三维图形可以包含对象360度的信息,能从各个角度去观察游戏场景。3d游戏设计主要的功能模块有:3d引擎模块:除了对游戏提供异常处理、日志系统、资源管理等功能,主要是对游戏提供3d图形的效果渲染以及3d图形的显示。系统支持模块:主要提供了包括定时器管理、窗口管理等功能在内,操作系统功能使用的封装以及引擎在当前操作系统下驱动的功能。场景管理模块:主要提供了对3d游戏引擎中的场景的管理与维护功能,采用多叉树的方法对总场景进行管理与分割的功能。人机交互模块:主要提供了对输入设备的管理,获取记录输入设备产生的响应,例如键盘管理、手柄管理、鼠标管理等功能。数学库:主要提供了对3d游戏游戏引擎所需要的数学库的支持,包括三角函数计算、四元数、矩阵、向量等;音频处理模块:主要提供了对音频文件相关支持,如音频效果的处理、音频文件的播放等。1.4.2 开发平台关于3d游戏开发,一般是使用c+与opengl结合或是采用c+与directx结合的方式进行设计开发,这对程序员有很高的要求。当开发大型3d游戏时,这种方式的工作量与困难程度会达到一个令人难以想象的地步。如今最有效的开发还是利用游戏引擎进行游戏的开发。本文主要是研究3d射击游戏的制作,设计开发一个很简单的3d射击类游戏。利用vc+6.0与opengl结合,进行游戏制作,模型则是采用的md2模型。opengl(全写open graphics library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。opengl是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。visual c+ 6.0,是微软推出的一款c+编译器,简称vc或者vc6.0,是一款将“高级语言(编程序言)”翻译为“低级语言(机器语言)”的程序。visual c+是一个功能强大的可视化软件开发工具。自微软公司推出visual c+后,随着其版本的更新换代,visual c+已经成为专业程序员开发软件的首选工具。2 opengl简介与3d图形学相关2.1 opengl简介opengl(全写open graphics library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。opengl是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。opengl适用于从普通pc到大型图形工作站等各种计算机,并可与各种主流操作系统兼容,从而成为占据主导地位的跨平台专业3d图形应用开发包,进而也成为该领域的行业标准。2.1.1 opengl特点opengl作为一个性能卓越的图形应用编程接口(api),适用于广泛的计算机环境,并已成为目前三维图形开发标准,是从事三维图形开发工作的技术人员所必须掌握的开发工具。opengl的应用领域十分广泛,如军事、电视广播、cad/cam/cae、娱乐、艺术造型、医疗影像、虚拟现实等。它具有以下特点,如图2-1:特点图形质量好行业标准稳定性可适应性可移植性可靠性易用性高性能图2-1 opengl特点图形质量好、性能高:无论是三维动画、cad,还是可视化计算机、视觉模拟等,都利用了opengl高性能、高图形质量的特点。这个特点使得程序员在医学图像、虚拟现实、cam/cad/cae、广播和等领域中创造和显示出超乎想象的图形。行业标准:opengl arb作为独立的联合委员会,制定了opengl的规范文档。伴随硬件厂商对opengl的硬件支持,opengl成为了是唯一独立于供应商的、真正开放的跨平台图形标准。 稳定性:在任何平台上都能执行opengl,而且它高版本兼容低版本,用来保证已经开发完成的应用程序不会失效。 可靠性和可移植性:利用opengl技术开发的应用图形软件与硬件无关,只要硬件支持opengl api标准就可以了,也就是说,opengl应用可以运行在支持opengl api标准的任何硬件上。 可扩展性:opengl是低级的图形api,它具有充分的可扩展性。只要厂商提供opengl扩展,就可以轻松实现硬件特有功能。利用opengl扩展,opengl实现者可以添加新的处理算法。可适应性:基于opengl api的图形应用程序可以运行在许多系统上,有次,opengl应用程序可以适应开发人员选择的各种目标平台。 易用性:opengl具有良好的结构、直观的设计和逻辑命令。与其它的图形程序包相比,opengl应用程序只有很少的代码,因此执行速度快。此外,opengl封装了有关基本硬件信息,使开发人员无须针对具体的硬件进行专门的设计。2.1.2 opengl功能opengl是一个独立于操作系用和窗口系统开放的三维图形软件包,以opengl为基础开发的应用程序可以十分方便地在各种平台间进行移植;opengl还可以与vc+紧密接口,便于实现图形的有关计算和图形算法,可保证算法的正确性和可靠性;opengl使用简便,效率高。它具有以下功能:功能建模变换颜色模式设置光照和材质设置纹理映射双缓存动画位图显示图2-2 opengl功能建模:opengl图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。变换:opengl图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、缩放、镜像四种变换,投影变换有平行投影(又称正射投影)和透视投 影两种变换。其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。颜色模式设置:opengl颜色模式有两种,即rgba模式和颜色索引(color index)。光照和材质设置:opengl光有自发光(emitted light)、环境光(ambient light)、漫反射光(diffuse light)和高光(specular light)。材质是用光反射率来表示。场景(scene)中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。纹理映射(texture mapping)。利用opengl纹理映射功能可以十分逼真地表达物体表面细节。位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合(blending)、抗锯齿(反走样)(antialiasing)和雾(fog)的特殊图象效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果。双缓存动画(double buffering)双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。此外,利用opengl还能实现运动模糊、深度暗示等特殊效果,利用这些效果可以实现消隐算法。2.1.3 opengl渲染实现绝大部分opengl操作顺序都十分相似,即就是opengl渲染管线的一系列相关的处理阶段。它的操作顺序如图2-2:片段操作评估纹理装配基于定点的操作和图元装配缓冲帧区像素操作光栅化显示列表像素数据顶点数据图2-3 opengl渲染流程显示列表:任何数据,不管它所描述的是几何图形还是像素,都可以保存在显示列表中,供当前货以后使用。求值器:所有的几何图元最终都要根据定点来描述。基于顶点的操作:对于顶点数据,接下里的一个步骤就是“基于顶点的操作”,就是把顶点变换为图元。图元装配:图元装配的一个主要部分就是裁剪,它的任务是消除那些位于一个半空间之外的那部分几何图元,而这个班空间是有一个平面所定义的。点裁剪就是简单地接受或拒绝顶点,直线或多边形裁剪则能够添加额外的顶点,具体取决于直线或多边形是如何进行裁剪的。像素操作:首先,来自系统内存的一个数组中的像素进行解包,从多种格式之一的解包为适当数量的成分。接着,数据被缩放、便宜,并根据像素图进行处理。处理结果先进行截取,然后或者写入到纹理内存,或者发送到光栅化阶段。纹理装配:opengl应用程序可以在几何物体上应用纹理图形,使它们看上去更为逼真。光栅化:光栅化就是把几何数据和像素数据转换为片段的过程。片段操作:在数据使劲存储到帧缓冲区前,将要执行一系列操作。这些操作可能会修改甚至丢弃这些片段。所有这些操作都可以被启用或者禁用。2.2 3d图形学相关2.2.1 向量与矩阵向量 ,在数学中的定义是,既有大小又有方向的量。三维的向量,分别表示的是沿x坐标方向、y坐标方向和z坐标方向的位移。3d程序是使用4d向量,这样主要方便进行移动变换,第四维通常只取 “1” 。矩阵 ,在数学中的定义是,纵横排列的二维数值列阵。3d程序是使用的44 的矩阵对向量,这样主要方便进行移动变换。2.2.2 变换变换可以分为平移变换、旋转变换、缩放变换。平移变换:可以被认为是把一个点从3d空间中的一个坐标位置移动到另一个坐标位置。要对一个点进行平移变换,只需要将每个坐标轴的增量值,或者说沿每个坐标轴的平移数值,加上要平移坐标点的原始坐标值就行了。旋转变换:在x轴旋转时,其x轴坐标表示不变。关于y轴的旋转与z轴的旋转也是同样的道理。要让一个点绕某一坐标轴旋转,就用此坐标轴旋转矩阵乘以这个点。旋转变换所形成的连续组合变换的思路是合并矩阵,将几个变换矩阵合并成一个变换矩阵,先绕z轴转,再绕y轴转,最后绕x轴旋转。缩放变换:通过将顶点与一个缩放因子相乘的方法来缩放顶点。2.2.3投影在3d图形学中,要涉及到两种投影,一种是平行投影,另一种则是透视投影。平行投影,即就是在一束平行光线照射下形成的投影。平行投影可以分两步来完成,第一步先将投影的平面转换到3d空间中的xy平面上,第二部就是除去所有可见点z项的坐标信息。透视投影,则是用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图。透视投影符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失,成为灭点,如图2-4:图2-4 投影2.2.4 3d裁剪当物体的世界坐标超值超过屏幕视区范围时,对物体进行透视变换操作就可能引起错误。特别在z值为0时,错误就会发生;当z轴为负数时,物体处在观察者后面,就无需进行变换。解决这一问题通常是创建一个视体(视体其就是3d空间中相对于观察者为可见的一个区域)。在视体外的任何物体都不能被观察者看到,因此就不能对其进行变换。对于透视投影来说,视体为金字塔形,如图2-5:图2-5 透视投影的物体总是金字塔形状3 游戏设计3.1 游戏的组成一个游戏作品可以分为游戏引擎和游戏资源两大部分。游戏引擎是一个为运行某一类游戏的机器设计的能够被机器识别的代码(指令)集合。它像一个发动机,控制着游戏的运行。游戏资源包括声音、图象、动画等部分,游戏=引擎(程序代码)+资源(声音、动画、图象等)。游戏引擎则是按游戏设计的要求顺序的调用这些资源。对于一个游戏的开发来说,游戏资源反映了一个游戏所能带给人们的感官刺激,而游戏引擎的优良程度则是这款游戏可玩性的一个重要指标。对于一个简单的游戏来说,它的游戏引擎可以分成输入设备、游戏逻辑、场景数据库、音频子系统、场景物体对象、纹理处理、物理子系统、粒子系统。它们之间的关系如图3-1:输入设备游戏逻辑粒子系统物理子系统场景物体对象纹理处理场景数据库音频子系统图3-1 游戏引擎组成在实际运行中,引擎通过设备输入子系统接受输入,并向游戏逻辑子系统发送相应的消息,然后游戏逻辑子系统处理相应的消息,并执行相应的一个游戏循环。在单一游戏循环之中,游戏逻辑子系统对如如做出反应,对游戏物体对象之星所需要的所有物理计算、处理碰撞检测和反应、载入和销毁物体对象、在场竞争移动视点、以及播放游戏运行时所需要的所有声音。3.2 游戏的结构对于游戏的开发,需要有一个游戏结构的设计,可以开发更多的组件以实现特殊的性能和功能,来保障游戏软件的平稳运行。游戏与其它应用软件有着一定的区别,它不是我们的单线、事件驱动或顺序逻辑的程序。一个3d游戏本质上是一个持续不断的while循环,它执行逻辑并在屏幕上不间断的绘制更新图像,如图3-2:其它纹理音乐声音三维模型物理游戏数据库输入输入游戏逻辑游戏逻辑输入游戏逻辑图3-2 一个游戏的组成3.3 本游戏设计在本次设计中所展示的是一个3d射击类游戏,要求玩家在限时内,在场景冲找出所有敌人并将其消灭。游戏中所包括的性能有粒子爆炸效果、md2模型的载入、动画和边界碰撞检测、视点的控制和移动、声音效果、简易ai系统、地形的绘制与生成。在组成上则是采用游戏引擎+游戏资源的设计方法来设计并实现游戏。游戏框架结构如图3-3、图3-4、图3-5和图3-6:图3-3 游戏工程结构图3-4 source files内含结构图3-5 header files内含文件结构图3-6 external dependencies内含文件结构下面,这里主要说明一下,此游戏中所采用的关键技术。4 关键技术4.1 摄像机漫游在3d游戏中,用户通常可以通过鼠标或者键盘操作角色在场景中移动,进而完成各种有意思、富有挑战的任务,大道场景漫游的效果。这是人机交互的一种重要体现,能够大大提高游行可玩性,这就需要用到漫游。而在三维场景漫游中,观察各可以通过鼠标或键盘来控制视点的位置、视向和参考方向。当视点的位置、视向和参考方向发生改变时,场景中的物体相对于观察者的方位也发生了变化,从而产生了“动感”。系统中,视点即就是人的“化身”。其功能与现实世界的摄像机类似,视线方向可由参考点位置确定(参考点位置减去视点位置即可得到视线方向的向量)。在游戏中,由摄像机来成为人在游戏中的视点,通过摄像机发生变化,从而引起视角的变化,这样就模拟了游戏角色所观察到的景物的变化。在游戏中,需要通过键盘上的方向键实现先后左右的移动,通过鼠标的拖拽实现旋转视图以从多角度观察地物。实际上,在场景漫游时可以通过设置视点以及观察方向来实现,需要用到opengl辅助函数库中的glulookat()函数,通过设置相应参数实现场景漫游。void glulookat(gldouble eyex,gldouble eyey, gldouble eyez, gldouble centerx,gldouble centerxy, gldouble centerxz, gldouble upx,gldouble upy, gldouble upz);该函数的9个参数定义了一个视图矩阵,并使用该矩阵与当前矩阵相乘。前三个参数(eyex,eyey, eyez)定义了视点位置,即观察者位置;中间三个参数(centerx, centery, centerz)定义了摄像机的参考点,即摄像机的朝向;最后三个参数(upx, upy, upz)定义了摄像机的向上向量,一般定义为(0, 1, 0)。在计算机看到图形时,我们的观察点为(0,0,0),也就是为什么我们总要把图形z坐标设为小于0的原因(z大于0是图形在屏幕外面)。在opengl中观察虚拟世界的主要函数是glulookat(),它的主要作用是可以改变我们在opengl场景中的观察点,看到前面的景物越来越近,两边的物体在向后退,这就是我们的观察点在场景中的位置改变的结果。glulookat(视点,目标点,视点方向)其中视点(观察点)是一个三维坐标向量。x量的变化就像是我们在场景中的横向移动。y量的变化就像是我们的身体高度的变化(游戏中角色的站立或卧倒)。z量的变化就像是我们在场景中前后移动。目标点,视点方向也分别是三维向量。视点的变化,相当于我们人在场景中移动。目标点的变化,相当于我们人站着不动时,头或者手中的相机上下左右移动的效果。视点方向y=1表示我们的头始终是正立的。图4-1反映了摄像机类相关:根据鼠标设置摄像机观察方向左右移动前后移动放置摄像机位置摄像机类设置速度位置旋转方向与键盘关联图4-1 摄像机类的组成4.2 碰撞检测我们知道,几乎所有的3d游戏都离不开碰撞检测无论是各物体之间的碰撞检测,还是物体与场景之间的碰撞检测。比如说人物在场景中可以平滑移动,遇到一定高度内的台阶可以自动上去,而过高的台阶则把人挡住,遇到斜率较小的斜坡可以上去,斜率过大则把人挡住,人物到场景边缘而不会掉出场景等。碰撞检测算法主要有三种:基于包围盒的碰撞检测算法,基于距离计算的碰撞检测算法,基于维诺图的碰撞检测算法。4.2.1包围盒算法4.2.1.1 轴平行包围盒aabb算法在一个aabb包围盒的描述中,需要六个坐标量,这是因为在进行碰撞检测时,aabb是每条边都平行于坐标轴3d几何体的外接平行六面体。在构造轴平行包围盒aabb的时候,需要aabb包围盒在方向上具有一致性,这就使得构造时要沿着物体局部坐标系的轴向来构造包围盒。轴平行包围盒aabb的算法相对来说比较简单,很容易就能实现,但aabb的紧密性相对来说比较差。aabb需要跟着几何体的旋转而一起旋转,这样的操作,会使得计算量相对增加,从而使得算法效率下降。轴平行包围盒aabb的计算重点在于对aabb的中心以及盒子长、宽、高的计算,从而得出包围盒的大小。aabb内的任意一点v(x,y,z)都需要满足公式4.1:(4-1)式4-1 aabb内的任一点v(x,y,z)满足条件公式中xmax指模型中各个点在x轴方向的最大值、xmin指模型中各个点在x轴方向的最小值;ymax指模型中各个点在y轴方向的最大值,ymin指模型中各个点在y轴方向的最小值;zmax指模型中各个点在z轴方向的最大值,zmin指模型中各个点在z轴方向的最小值。要计算包围盒的中心点,需要得到两个重要的点pmin= xmin,ymin,zmin,pmax=xmax,ymax,zmax,得到两点后可以计算中心点。中心点m和长、宽、高a,b,c分别为,如式4-2(4-2)式42 中心点m和长、宽、高a,b,c4.2.1.2 包围球算法在进行碰撞检测时,包围球是3d几何体的最小外接球。包围球算法也比较简单,很容易就能实现,但包围球的紧密性相对来说也比较差。包围球在旋转上不同于aabb,它不需要跟随3d模型的旋转而旋转。包围球的球心和半径的计算是得到包围球的重点。其球心的计算方法与aabb的计算方法相同。包围球的半径是长、宽、高的最大值。在aabb算法的基础上,包围球的球心及半径的计算满足公式4.3:(4-3)式4-3 球心m和半径r4.2.1.3沿任意方向包围盒obb(onented bounding box)算法在aabb、包围球、obb算法中,obb是包含这个3d物体并且相对于坐标轴方向任意的平行六面碰撞体,它是最接近3d几何体的平行六面体。obb包围盒方向的任意性是它区别与其他两个包围盒的最大特点。这个特点使得obb可以根据碰撞对象外形的不同来尽可能得包围对象。在包围的对象进行旋转操作时,只需要对obb的基底进行一样的旋转,这使得运算不会变得非常复杂,并且场景的运行速度也不会受到影响,算法效率有一定影响。寻找最适合的方向,以及确定这个方向上obb包围盒的最小尺寸,是构造obb包围盒的关键。obb包围盒需要计算包围盒的尺寸、方向以及中心位置。尺寸是计算位置和方向得到的,中心位置是用均值和协方差矩阵来计算的。由于组成要进行碰撞检测的物体是多个三角形面,所以这里设三角形中第i个三角形面的定点矢量为为n,qi和ri,组成包围盒包围对象的三角形面数为n。那么协方差矩阵元素cjk的计算如公式4.4式4-4 包围盒的中心位置m那么obb的中心位置m计算如公式4.5:式4-5 协方差矩阵元素cjk其中,公式qi=qm,ri=rim和pi=pim都是3*1向量。利用上述公式得出矩阵的特征向量,并将其进行单位化,由于矩阵c的特征向量具有相互垂直的特点,所以矩阵c是obb的方向轴。要得到包围盒的尺寸,需要把包围对象在顶点方向进行投影操作,找出方向上的投影区间,计算出投影区间的尺寸,该尺寸就是包围盒的尺寸。 包围盒的简单性与其包裹几何体的紧密性是一对矛盾,包围盒越简单它对几何体的包裹紧密性就越差。4.2.2 bsp算法bsp trees英文全称为binary space partioning trees,二维空间分割树,简称为二叉树。bsp树原理很简单:它将场景中所有的三角形面组织存储于一颗二叉树内,每个平面均将空间分为前后两个空间,这两个空间又被其它面分成更小的空间直到最后,按照前面的算法,确定每个房间相对于摄像机的遮档顺序。这是一个非常标准的二分法,仅按照“前”和“后”两个逻辑上的概念来划分空间。如图4-2所示:图 4-2 bsp原理简要解析图空间abc由a、b、c三个独立的空间组成,首先,分割平面1将空间分成了平面正向的a空间和平面负向的bc空间,bc空间被2紧接着分割为平面2正向的c空间和负向b空间。如果一个人处于c房间内,那么如何判断空间的遮挡顺序呢?从根结点开始,由于处于平面1的“后面”,所以,bc空间应该先于a空间,然后,由于人处于分割平面2的“前”面,所以,c空间应该先于b空间。这样,整个空间离人由近到远的顺序就可以确定了:c-b-a。仅需要通过两次平面的前后判断就可以确定空间的先后顺序,算法威力可见一斑。4.3 粒子爆炸在游戏中,火箭是玩家射向敌人的抛射体,当玩家点击鼠标左键时,就会发射。程序中用crocket类来表示火箭,这个类用来载入火箭的md2模型,绘制并进行相关物理计算。public:float pitch;float distancetravel;/ 火箭已经飞行的距离cvector forward;/ 火箭的向前矢量bool isexplosion;/ 火箭爆炸,则为true ctexture *explosiontex;/ 爆炸纹理cexplosion *explosion;/ 爆炸粒子效果只要火箭命中一个物体,它则产生爆炸。cexplosion对象则是用来生成爆炸效果的。当火箭与其他物体发生碰撞时,布尔变量isexplosion就会被设置为true。cexplosion类将crocket类中所指定的explosiontex作为纹理来绘制爆炸效果。4.4 云雾效果游戏中,如果整个场景都在玩家的视野中,那么游戏将变成非常简单,这里为了给游戏增加难度而采用了云雾效果。所谓云雾效果,就是为了给玩家视野可见度,视野之外的物体将会被云雾遮挡,玩家只有行进才能开拓新的视野,当然已经可见的物体,在超出视野范围会再次被云雾遮盖。opengl内置的云雾是依靠每个像素与云雾的颜色相混合而实现的,其混合因子的设置则是根据其视点的距离、雾的密度以及当前所选的云雾的模式。为了开启云雾效果,我们首先要启用它。控制云雾的相关状态的函数为glfog()glfogi(glenum pname, glfloat param);glfogfv(glenum pname, glfloat param);glfogf(glenum pname, glfloat *params);glfogf(glenum pname, glfloat *params);这些函数中,param代表单一的一个参数,而params则代表一个或多个参数组。这些参数的含义根据pname参数的值而定,参数如表4-1:表4-1 glfog()参数说明参数说明gl_fog_mode可以为gl_linear,gl_exp或gl_exp2,其用于指定三个雾方程中的哪一个来计算混合因子gl_fog_density单一的值,指定用于三个雾方程的雾的密度,必须为正gl_fog_start单一的值,指定用于三个雾方程的起始范围值gl_fog_end单一的值,指定用于三个雾方程的终止范围值gl_fog_index使用8bit颜色时,指定雾的颜色索引值gl_fog_color指定雾的颜色,是一个数组尽管opengl雾很容易使用,并且在大多数情况下效果也非常不错,但是并不完美。最大的缺点是为了每个雾的顶点所进行的雾颜色的计算,此计算是根据顶点与垂直于视线的平面之间z距离进行的。如果在玩家视野边缘处存在一些物体,虽然他们距离视点很远,但是其z距离很小,那么,本应被雾包围的物体就变得非常清楚。为了解决这样的问题,需要采取体积雾的方法。将雾作为球、粒子或者雾纹理,在绘制其他物体时,先计算观察此物体需要透过多少体积的雾,从而相应地调整此物体的光照和颜色,以达到云雾的效果。4.5 简易ai作为一款单机游戏,ai(人工智能)是必不可少的。对于本次设计的游戏来说,如果敌人一直站着不动,等玩家去消灭,游戏就显得很单薄。为此,特别设计了简单的ai系统,来增加游戏的可玩性。在本次游戏中,设计了两种敌人,一种普通类型敌人,另一种跑动速度稍快,而且相对智能的ai。敌人ai实际上是根据状态值(也就是状态机)来确定敌人在游戏中的行为的。敌人的状态是aistate_t类来定义的:enum aistate_tai_uncaring,/ 敌人不会恐惧也不会关心玩家ai_scared,/ 敌人会恐惧并且逃避ai_dead/敌人死亡;在游戏中,敌人恐惧玩家,那么敌人就会逃离玩家当前位置。如果敌人不在乎玩家,那么它则会自由地乱跑,或者保持空闲状态。ogro是一种移动缓慢的怪物,在其逃离玩家的时候闲的不是特别聪明。当处于ai_uncaring状态时,它有很大几率是无所事事的。当处于ai_scared状态时,如果玩家距离它有100个场景单位距离,它将以45角度范围逃跑。如图4-3:图4-3 ogro智能示意图敌人ogro状态是由 cogroenemy:onprocessai()完成的。cvector diff = player-position - position; / 计算与玩家之间距离if (aistate != ai_dead) /敌人必须在活着的前提下 istfromplayer = sqrt(diff.x*diff.x + diff.y*diff.y + diff.z*diff.z);/ 如果玩家靠的够进,敌人则会恐惧 if (distfromplayer position.x; /求取敌人到玩家的矢量 diff.z = position.z - player-position.z; /求取敌人到玩家的矢量 diff.normalize(); 在得到了敌人与玩家间的距离之后,根据数值判断就要赋予敌人智能,判断其应该处于一个什么样的状态 。 case ai_scared:/敌人恐惧状态 direction = (dirtoplayer - 90) + (rand()%90)-45); / 设置敌人方向 modelstate = model_run; velocity = cvector(0.0, 0.0, 15.0); break; case ai_uncaring:/敌人不恐惧状态 direction = float(rand() % 360);/面朝任意方向行走 if (rand() % 4) != 0)/75%s时间为闲置状态 modelstate = model_idle;/模型状态 velocity = cvector(0.0, 0.0, 0.0); else velocity = cvector(0.0, 0.0, 15.0); modelstate = model_run; /模型状态:跑动 如果敌人与其它敌人发生碰撞,那么它将进入ai_uncaring状态,并停止移动。如果与地形发生了碰撞,则需要获取其当前位置相应的高度值,并检测此时的x与z分量,确保其不超过边界。如果敌人与火箭发生碰撞,那么敌人则进入ai_dead状态。场景中还有一种敌人sod,与ogro基本相同,只是更加智能一些。当玩家距离其有125个场景单位时,它就会进入逃跑,如图4-4:图4-4 sod智能示意图图4.6 3d模型在实际的3d图形程序,构建3d模型一般来说都比较复杂。opengl虽然提供了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 术后胆漏的个案护理
- 儿童腹泻护理个案分析
- 有理数乘方课件
- 怎样下载多媒体知识课件
- 数学老师实习总结
- 期末小学教师工作总结
- 安全生产承诺书模板集锦九篇
- 酒店感恩节活动策划8篇
- 安全培训完成总结
- 执行力心得体会15篇
- 2024年21起典型火灾案例及消防安全知识专题培训(消防月)
- 人教版四年级上册数学【选择题】专项练习100题附答案
- DL-T 1476-2023 电力安全工器具预防性试验规程
- 校本课程:中国象棋(课堂PPT)
- 砼路面拆除及恢复施工方案
- ApoE基因分型检测
- 监狱监区年度工作总结
- 石灰窑烘炉及开炉方案
- 复苏囊的使用PPT
- (完整版)工业与民用配电设计手册
- 教学论文】《自制教具应用于初中物理有效教学的研究》课题研究报告【教师职称评定】
评论
0/150
提交评论