带有物理引擎的赛车游戏研究与探索_第1页
带有物理引擎的赛车游戏研究与探索_第2页
带有物理引擎的赛车游戏研究与探索_第3页
带有物理引擎的赛车游戏研究与探索_第4页
带有物理引擎的赛车游戏研究与探索_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、摘要摘要现代 PC 游戏一般需要物理引擎的支持,合理的安排和控制物理引擎是完美游戏的保障。本课题介绍了物理引擎的基本概念,分析物理引擎的工作原理,最后完成了一个带有物理引擎的游戏设计与实现。通过对物理引擎的研究和探索,讨论了一些碰撞检测算法和汽车动力学知识,并成功地利用了 OGRE、Newton、OgreNewt、FMOD、CEGUI 等库实现一个赛车游戏,在实时性和高精度性做出了很好的平衡,效果良好。关键词关键词: 物理引擎,赛车游戏,碰撞检测算法ABSTRACTGenerally, modern PC games require the support of physics engine,

2、 a reasonable arrangement and control of the game physics engine is a protection of the perfect game. This paper introduces the basic concepts of physics engine, analyzes the working principle of physics engine, and finally completed a game with the physics engine design and implementation. Physics

3、engine of research and exploration, this paper discusses a number of collision detection algorithms and vehicle dynamics knowledge, and is successful to use the OGRE, Newton, OgreNewt, FMOD, CEGUI to complete a racing game which keeps a very good balance in real time and high precision, and has a go

4、od effect.Keywords: physics engine, a racing game, collision detection algorithm,目录目录摘要.IABSTRACT .II第 1 章 绪论.11.1 背景 .11.2 研究内容 .1第 2 章 带有物理引擎的赛车游戏框架.32.1 总体技术框架 .32.2 物理引擎技术 .3物理引擎的概念.3物理引擎的现状.4物理引擎的特性.5物理引擎发展方向.52.3 图形渲染引擎技术 .6图形渲染引擎的概念.6着色器与着色语言.72.4 设备输入技术 .72.5 UI 系统.72.6 声音系统 .82.7 本章小结 .8第 3

5、 章 赛车游戏总体设计.93.1 物理引擎 .9动力学与刚体的运动.9汽车动力.10碰撞检测.11现有的物理引擎.133.2 赛车总体设计架构 .13赛车游戏运行机制结构.13系统.14竞技场编辑系统.15录像回放功能系统和设置系统.153.3 本章小结 .15第 4 章 赛车游戏详细设计.164.1 基于 OGRE 的窗口框架设计.16对象.17渲染系统.17场景管理和资源管理.18创建窗口.18创建帧监听器.194.2 OgreNewt 使用.194.3 车模型设计 .21车身.21车轮.21车模型实现.214.4 UI 控件设计.23基本的对话框设计.23其余对话框设计.24控件实现.2

6、44.5 声音系统设计 .25声音.25声音管理.26声音系统实现.264.6 录像和回放设计 .284.7 道具管理 .30道具.30道具管理与实现.314.8 不同类型物体碰撞行为回调 .324.9 剩余类设计 .334.10 本章小结 .34第 5 章 游戏测试与分析.355.1 测试环境 .35硬件配置.35软件配置.355.2 测试项目 .35测试车子驾驶.35碰撞测试.375.3 测试分析 .385.4 本章小结 .38第 6 章 结论.396.1 总结 .396.2 对未来的展望 .39致谢.40参考文献.41附录: 一些相关设计详细资料.42A.1 汽车模型例子.42A.2 录

7、像文件例子.44第第 1 章章 绪论绪论1.1 背景背景计算机技术时刻地改变着人们的工作和生活。随着科技的发展,人们从单核CPU 到多核 CPU,从三角形等简单的图形显示到 GPU 进行复杂的纹理显示,从简单的 2D 世界跨越到复杂的 3D 世界,从简单的碰撞到越来越复杂的粒子系统、AI 系统等,以及 PPU 的出现,早已受到物理引擎的影响。从 Ageia 制造独立的 PhysX 物理卡开始,人们进行进入了物理加速的时代。人们已经不需要 CPU 来处理物理引擎(是一个计算机程序,对牛顿物理模型的模拟1) ,而且 PPU 处理也比 CPU 快多了,也能提高另外事物的处理效率。虽然当时一块 PPU

8、 就要需要 2000 多美元,但 Ageia 的营销模式促使 PPU 的生存,免费提供给游戏开发厂商 SDK2。游戏厂商使用了 SDK 来进行开,只需要玩家买PhysX 物理卡就能支持物理加速,得到更加真实的画面。在 2008 年 2 月 Ageia被 nVIDIA 收购后,PhysX 技术被应用到了 CUDA(Compute Unified Device Architecture,译为计算统一设备架构)运算技术中。所有支援 CUDA 技术的显卡,就可以直接硬件支援 PhysX 加速,因此在 PC 平台,PPU 最终会被 GPU 取代,但在 PS3 等平台还是存在。GPGPU(General-

9、purpose computing on graphics processing units 的缩写,译为图形处理器通用编程)的出现,显存的提高,着色语言(Shading Language,是着色器编程语言,进行 GPU 的编程)的产生,使得人们利用显卡来加速,从而GPU 来处理物理引擎变成了事实。而且 GPU 在浮点数上的处理速度远大于 CPU的处理,更能提高物理引擎的处理速度。因此用 GPU 来处理物理引擎已经很热门的方向。nVIDIA 的 CUDA 提供很好的环境来处理这些。随着科技的发展,人们从 CPU 频率的提高,转到了多核的发展。多核的出现,还是挽救了一部分物理引擎用 CPU 处理

10、,提高效率。物理引擎的加速最终会走向何方,只有等待时间给出解答。1.2 研究内容研究内容本论文首先围绕着一个赛车游戏的设计与实现,介绍了物理引擎的现况和物理引擎存在的一些问题,简述碰撞检测技术。简单讨论了物理引擎的动力学相关技术,碰撞检测相关算法技术和 3D 渲染技术等。分模块详细的介绍了赛车游戏设计,主要是基于 OGRE 的窗口框架设计,车模型设计、UI 设计、声音系统设计、录像和回放设计、道具设计等。第第 2 章章 带有物理引擎的赛车游戏框架带有物理引擎的赛车游戏框架2.1 总体技术框架总体技术框架在一个赛车游戏中,车子都以一种格式被表示,车子在接受玩家指令时,根据当前环境、动力、以及指令

11、的要求,处理相关的反应,比如碰撞、倒退等动作,然后最终被渲染出来。以上的过程涉及到设备输入技术,物理引擎,和图形渲染。图 2-1 显示了一个带有物理引擎的赛车游戏技术框架。图图 2-1 带有物理引擎的赛车游戏技术框架带有物理引擎的赛车游戏技术框架下面将分小结介绍物理引擎技术,图形渲染技术和设备输入技术,UI 系统,模型格式,声音系统。模型格式技术在后面讲述。2.2 物理引擎技术物理引擎技术物理引擎是一个计算机程序,模拟牛顿物理模型,使用质量、速度,摩擦力和空气阻力等变量,预测不同情况下的效果。它主要用于科学模拟和电子游戏中。物理引擎涉及到动力学和碰撞检测等相关知识。动力学,是一门力学的分支,主

12、要是应用牛顿运动第二定律与能量观念研究质点或刚体在空间中的运动与受力的状况,研究的课题是质点运动学(kinematics) ,质点动力学(kinetics) ,刚体运动学 ,刚体动力学,振动学,解析力学等。碰撞检测在物理引擎中占有很重要的地位。它用于测试两个或者多个物体是否发生碰撞,为之后的变化提供可靠的依据。碰撞检测算法划分依据有基于时间和空间两种,一般有:1) 基于时间域的碰撞检测算法可分为静态碰撞检测算法,离散碰撞检测算法和连续碰撞检测算法等。静态碰撞检测算法,顾名思义就是静态时碰撞的算法。离散碰撞检测算法,就是在每一时间的离散点上进行的碰撞检测,但有些问题,比如存在刺穿的现象和遗漏的应

13、该发生的碰撞,这些都是由于取离散点的造成的。连续碰撞检测算法,在连续的时间间隔内进行碰撞检测,但计算速度还太慢。2) 基于空间域的碰撞检测算法可分为基于物体空间的碰撞检测算法和基于图像空间的碰撞检测算法。基于物体空间的碰撞检测还分为采用一般表示模型的碰撞检测,和采用空间结构的碰撞检测。采用空间结构的碰撞检测,主要是空间剖分法和层次包围体树法,空间剖分法,一般均匀剖分、BSP 树、k-d 树和八叉树(Octree)等;层次包围体树法由包围体类型的不同来加以区分为:层次包围球树、AABB 层次树(Aligned Axis Bounding Box) 、OBB 层次树(Oriented Boundi

14、ng Box) 、k-dop 层次树(Discrete Orientation Polytope) 、QuOSPO 层次树(Quantized Orientation Slabs with Primary Orientations) 、凸块层次树、混合层次包围体树等。虽然有这么多碰撞检测算法,在物理引擎的实时性或高精度性不高,所以碰撞检测还是需要完善。现状现状在硬件上,以时间的先后顺序可划分一下几类:1) 单核 CPU 来处理物理引擎。在物理引擎发展初期,那时硬件发展还不完善,一般都会选用 CPU 来处理。CPU 并不是用来单独处理物理引擎,但物理引擎的实时性和高精度性要求,从而使 CPU 的

15、负担加重。毕竟游戏就是需要实时去表现。因此人们开始从下面三方面来发展。2) PPU(Physics Processing Unit 的缩写,译为物理处理器)独立处理物理引擎3。当 CPU 处理越来越多的事物时,就忙不过来了。而 Ageia 公司发明的Physx 物理卡(现在已经被 nVIDIA 公司收购)就是为了减轻 CPU 的负担。虽然当时一块 PPU 就要需要 2000 多美元,但 Ageia 的营销模式促使 PPU 的生存,免费提供给游戏开发厂商 SDK。如果游戏厂商用了 PhysX SDK,只要玩家买 PhysX物理卡就能支持物理加速。在 2008 年 2 月 Ageia 被 nVID

16、IA 收购后,PhysX 技术被应用到了 CUDA 运算技术中,支援 CUDA 技术的显卡,就可以直接硬件支援PhysX 加速,因此在 PC 平台最终会被 GPU 取代。但在 PS3 等平台上,PPU 还是会独立存在。3) GPU 来处理物理引擎。随着 GPU 的发展,显存的提高,它已经不局限于图形上的处理,正因为它的浮点数处理速度快于了 CPU 处理速度,GPU 的编程从而促使物理引擎在 GPU 的发展。Havok FX(2007 年 Inter 收购了 Havok)可以使用多 GPU 的技术来加速物理计算,包括了 nVIDIA 的 SLI 和 ATI 的CrossFire。4) 多核 CP

17、U 处理物理引擎。随着 CPU 从单核从多核过渡,用一个 CPU 来处理物理引擎也不是件困难的事情。完整的物理引擎会还包括刚体模拟、柔体模拟、流体模拟。主要研究是刚体的模拟,随着硬件的发展柔体模拟和流体模拟正在快速发展。国外的物理引擎研究起步早,商业的如 Havok、Physx 等,开源的有OPCODE、ODE 等,免费使用的有 Newton 等。Havok 是使用多核 GPU 加速,Physx 使用物理卡(现在已经被 GPU 取代) ,OPCODE、ODE 等都用 CPU 来处理。特性特性物理引擎具有两大特性:1、 实时性,物理引擎需要即时反应当前的状况,决定着物体的运行的方和形式。2、 高

18、精度性,这一般用于碰撞检测时提出的要求,模型越来越复杂,从而造成这处理需要多步,先检测大体是否能碰撞,然后细分检查碰撞的具体位置。由于这两个特性都需要大量时间来计算,因此需要硬件更好的支持。 物理引擎技术的实现无疑是电子游戏和科学研究的一次重要飞跃,它的影响力将是巨大的,它的前景也是无限光明的。正如每一次技术革命都带来人类社会质的改变,物理引擎技术也会给科学研究和电子游戏的发展带来强大的动力。现在物理引擎技术有很多的研究方向,因为新的技术需要大家从各个方面加以扩展和深化。合理利用硬件资源将是物理引擎技术发展的主流方向。未来的物理引擎将逐步走向智能化,模拟更多的物体运动,粒子爆炸,AI 发展。2

19、.3 图形渲染引擎技术图形渲染引擎技术图形渲染引擎在 PC 平台下一般都是基于 OpenGL(Open Graphics Library 的缩写)或者 DirectX 的图形处理 Direct3D 包装。PC 平台上,OpenGL 和 DirectX是主流的图形渲染硬件加速,充分利用 GPU 的硬件加速,提供图形的渲染效率,以及图形效果。OpenGL 是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于生成二维、三维图象。OpenGL 常用与 CAD,虚拟现实,科学视觉化程式和电子游戏开发。它的高效现实(利用图形加速硬件)存在于 Windows,LINUX,大多数的 UNIX 和 Mac

20、OS。OpenGL 规范由 1992 年成立的 OpenGL 架构评审委员会(ARB)维护。当独立厂商建立一种新技术时,OpenGL 标准允许它们通过扩展的方法提供所扩展的功能。然后一个扩展就分成两部分发布:包含扩展函数原型的头文件和作为厂商的设备驱动。每个厂商有一个用于命名它们的新函数和常量的字母缩写。例如,nVIDIA 的缩写(“NV” )用于定义它们的专有函数“glCombinerParameterfvNV()”和它们的常量“GL_NORMAL_MAP_NV” 。而ARB 提供的扩展一般使用缩写“ARB” 。第一个 ARB 扩展是GL_ARB_multitexture。DirectX(D

21、irect eXtension,简称 DX)是由微软公司建立的游戏编程接口。由 C+编程语言实现,遵循 COM。因为 DX 的功能比 OpenGL 更全面而被多数PC 游戏开发商采用。DirectX 包含DirectGraphic、DirectPlay、DirectSound、DirectInput、DirectSetup 等部份。而图形渲染一般都是用 Direct3D 组件完成 3D 的渲染,DirectDraw 完成 2D 的渲染。两者区别:1、 OpenGL 只是负责图形渲染,而 DirectX 是则很全面,包含图形渲染,声音播放,联网,输入系统等。2、 OpenGL 能跨平台工作,而

22、DirectX 一般用于 Windows 和 XBOX360 上3、 OpenGL 用于科学研究多,而 DirectX 一般用于游戏开发。总的来说,两者各有各的长处。着色器,英文名为 Shader,是应用于计算机图形学领域,指一组供计算机图形资源在执行渲染任务时使用的指令。程序员将着色器应用于图形处理器(GPU)的可编程流水线,来实现三维应用程序。这样的图形处理器有别于传统的固定流水线处理器,为 GPU 编程带来更高的灵活性和适应性。着色语言,英文名为 Shading Language,是着色器编程语言。着色语言的出现,让 GPGPU(General-purpose computing on

23、graphics processing units,译为图形处理器通用编程)普及化。人们能像使用 CPU 一样操控 GPU,提高了图形渲染速度。而且更好的利用了资源。OpenGL 从版本 1.5 开始集成了一种类 C 语言的着色语言,称为 OpenGL 着色语言(GLSL) 。同时 nVIDIA 也开发了 CG,其语法与 GLSL 类同。在Direct3D 里,着色器使用高级着色器语言(HLSL) 。OpenGL 和 Direct3D 的都包含这 3 种顶点着色器,几何着色器,像素着色器。为了改善渲染速度,一般都用着色语言来进行优化,而模型的渲染等开始慢慢使用顶点着色器来渲染。GPGPU 的发

24、展,让物理引擎能利用 GPU 来处理,提供效率。2.4 设备输入技术设备输入技术设备输入,这里指的是键盘鼠标的按键处理。这里有 3 方式:第一种,通过Windows 消息 WM_KEYDOWN、WM_KEYUP 和鼠标相关的消息处理,但效率有点慢;第二种,使用 GetKeyboardState()函数,但这只能处理键盘按下,效率不错,访问硬件得到,所以不适合;第三种,通过 DirectX 的组建 DInput8 组件来处理,DInput8 是 DirectX 家族专门负责输入的组件,通过访问硬件来获取状态,效率高,除了包含鼠标,键盘的处理,还有手柄的处理。2.5 UI 系统系统一个好的 UI(

25、User Interface)系统,能给用户带来很多便利。CEGUI(Crazy Eddies GUI 的缩写)是一个免费的提供窗口和工具的不错 UI 系统,支持 OpenGL、DirectX、OGRE、Irrlicht(一个基于 OpenGL 和 DirectX 的3D 渲染引擎)渲染,支持 Windows、Linux 和 Mac OS。CEGUI 的接口调用简单,还通过 Lua(Lua 是一个简洁、轻量、可扩展的脚本语言)支持脚本编程,能迅速开发出一个美观的游戏界面。本毕业设计正是利用它来处理 UI。2.6 声音系统声音系统声音系统,是游戏的一个重要组成部分。而游戏主要声音系统都是由Ope

26、nAL、FMOD 和 DirectX 的声音组件 DirectSound 等来处理。OpenAL(Open Audio Library)是自由软件界的跨平台音效 API。它设计给多通道三维位置音效的特效表现。其 API 风格模仿自 OpenGL。最初是由 Loki Software 所开发,是为了将 Windows 商业游戏移植到 Linux 上。Loki 倒闭以后,这个专案由自由软件与开放源代码社区继续维护。不过现在最大的主导者是创新科技,得到来自 Apple 和自由软件与开放源代码爱好者的持续支援。主要的游戏代表 ID Software 的 DOOM3、QUAKE 4 和 Unreal 的

27、 Unreal 2 等。FMOD4是专为程序开发而设计的自由,跨平台多媒体音效系统。可运行于Windows、Linux、Windows CE,现在更可支持 Mac OS、GameCube、PS2 和Xbox。FMOD 支持三维环绕声、MIDI、MOD、MP3、OGG、WMA、AIFF、CD、互联网流媒体、DSP 效果、频谱分析、建立采样、同步、C/C+/VB/Delphi/MASM 等。当不是商业发布的,就不用收费。主要的游戏代表暴雪的星际争霸 2、魔兽争霸 3 和网易的梦幻西游等。DirectSound 等 DirectX 的声音组件是免费使用的,使用也很广泛。比如我公司上海奥盛正在制作的山

28、海志 ,用的就是这个声音系统。2.7 本章小结本章小结本章对物理引擎的相关知识和游戏的一些基本理论知识做了介绍和分析。主要分物理引擎和图形渲染方面,特别讨论了现有物理引擎状态和技术的发展,以及图形渲染的方面和游戏相关知识。物理引擎方面粗略介绍了在硬件上和软件商物理引擎的发展方向和物理引擎的问题所在。图形渲染方面粗略介绍了 OpenGL和 DirectX。游戏相关知识方面主要是 UI 系统、设备输入、声音系统等。第第 3 章章 赛车游戏总体设计赛车游戏总体设计3.1 物理引擎物理引擎由上章可看出研究刚体的物理引擎一般可划分两部分,动力学和碰撞检测。 动力学与刚体的运动动力学与刚体的运动力学的发展

29、,从阐述最简单的物体平衡规律,到建立运动的一般规律,经历了大约二十个世纪。前人积累的大量力学知识,对后来动力学的研究工作有着重要的作用。 动力学以牛顿第二定律为核心,这个定律指出了力、加速度、质量三者间的关系。牛顿首先引入了质量的概念,而把它和物体的重力区分开来,说明物体的重力只是地球对物体的引力。在牛顿的作用和反作用定律建立以后,人们开展了质点动力学的研究。 动力学一般是指刚体的动力学。刚体描述了现实世界中一大类物体,变形很小,或者在运动中变形忽略不记的物体都可以抽象成刚体。刚体的运动由质心的平移运动和绕质心的旋转运动合成,相应的有两套运动微分方程组,描述刚体的质心运动规律的方程组5,如图

30、3-1 所示:图图 3-1 刚体的质心运动规律的方程组刚体的质心运动规律的方程组即 F=ma 的合力形式,加速度是位移对时间的二阶导数和描述刚体绕质心的转动规律的方程组,如图 3-2 所示:图图 3-2 位移对时间的二阶导数和描述刚体绕质心的转动规律的方程组位移对时间的二阶导数和描述刚体绕质心的转动规律的方程组L(t)为刚体的角动量,即 L(t)=I(t)(t),I(t)是惯性张量,(t)是角速度;惯性张量用来描述物体的质量分布,相同形状的物体,质量分布不同,产生的旋转运动也各不相同。当力的作用通过刚体的质心时,刚体受到的力矩为零,不产生旋转运动;当作用线偏离质心时,会产生一个作用于质心的力和

31、一个力矩,刚体会同时作平移和旋转运动。 汽车动力汽车动力汽车的动力性指标主要由最高车速、加速能力和最大爬坡度来表示,是汽车使用性能中最基本的和最重要的性能。这些指标是汽车制造厂根据国家规定的试验标准,通过样车测试得出来的。6最高车速:指在无风条件下,在水平、良好的沥青或水泥路面上,汽车所能达到的最大行驶速度。按我国的规定,以 1.6 公里长的试验路段的最后 500 米作为最高车速的测试区,共往返四次,取平均值。加速能力(加速时间):指汽车在行驶中迅速增加行驶速度的能力,通常用加速时间和加速距离来表示。加速能力包括两个方面,即原地起步加速性和超车加速性。现多介绍原地起步加速性的参数。因为起步加速

32、性与超车加速性的性能是同步的,起步加速性性能良好的汽车,超车加速性也一样良好。原地起步加速性是指汽车由静止状态起步后,以最大加速强度连续换档至最高档,加速到一定距离或车速所需要的时间,它是真实反映汽车动力性能最重要的参数。有两种表示方式:车速 0 加速到 1000 米(或 400 米,或 1/4 英里)需要的秒数;车速从 0 加速到 100 公里/小时(80 公里/小时、100 公里/小时)所需要的秒数,时间越短越好。最大爬坡度,是指汽车满载时在良好路面上用第一档克服的最大坡度,它表征汽车的爬坡能力。爬坡度用坡度的角度值(以度数表示)或以坡度起止点的高度差与其水平距离的比值(正切值)的百分数来

33、表示。对于经常在城市和良好公路上行驶的汽车,最大爬坡度在 10左右即可。对于载货汽车,有时需要在坏路上行驶,最大爬坡度应在 30%即 16.5左右。而越野汽车要在无路地带行驶,最大爬坡度应达 30以上。因此设计车子模型时需要进行各种参数规定。指定 rpm(Rotate Per Minute,中文为每分钟转速) ,转矩,档位等。例如图 3-3 所示:图图 3-3 汽车的一些动力等参数设置汽车的一些动力等参数设置由此可见,上面是一个 XML(eXtensible Markup Language,译为可扩展标记语言)格式的文件。配置一些汽车的动力参数。详细说明文件格式在后面说明。碰撞检测,是物理引擎

34、的一个重要部分7。至从第一款角色扮演游戏开始,物理引擎就存在,只是一个简单的碰撞检测。碰撞检测就是要检测空间中的几何形体是否相交,只针对物体的几何属性,碰撞检测中简单几何形体的碰撞容易检测,凸体的碰撞容易检测,而复杂几何形体、凹体不易检测或非常耗时8。例如球体的碰撞检测,只须测试两个球的球心距是否大于两个球的半径之和,如果大于就没碰撞,如果小于活等于就碰撞了。对于形状复杂的一些物体的碰撞检测,采用层次包围盒(bounding box)的方法能提高效率,整个物体由一个大的包围盒包裹住,物体再分成两部分,各自用一个包围盒再包住,这样细分下去,到每个包围盒只包裹一个简单几何体为止。这形成了一颗包围盒

35、二叉树,碰撞检测时,如果两颗树的根节点(根节点是包围盒)不相交,两物体不相交,否则,层次遍历两颗二叉树;如果检测到叶节点的包围盒相交,则要检测简单几何体是否相交就行,提高精确度9。在不同的软件应用中,对于碰撞检测的要求不同。在一些三维 CAD 软件中,提供干涉检查,可以很好的检测复杂零部件是否发生干涉,及时修正设计缺陷。三维 CAD 软件检测碰撞是精确度非常高,但速度不高,按下干涉检查等待 12 秒得出结果。而在虚拟现实 3D 模拟器项目中,如果碰撞检测耗时 1 秒,将使画面停顿,真实性大打折扣,这时碰撞检测的速度是关键,用户操纵一个虚拟物体与另一个物体碰撞,画面上就要实时显示出来。10本设计

36、采用了一个基于 AABB(axis-aligned bounding boxes,按坐标轴排列的包围盒)的碰撞检测算法。11下面是 AABB 的碰撞检测算法的伪代码:/ A 和 B 是 AABB / A0 和 A1 是 A 的两个孩子 / B0 和 B1 是 B 的两个孩子 test(A, B) if(A 和 B 的包围盒重叠)/ A0 和 B0if(A0 是叶节点) if(B0 是叶节点) 进行图元与图元相交测试 else 进行图元与包围盒快速相交测试 else if(B0 是叶节点) 进行图元与包围盒相交测试 else 进行包围盒与包围盒相交测试/对 A0 和 B1 重复操作/对 A1 和

37、 B0 重复操作/对 A1 和 B1 重复操作虽然 AABB 算法还有很多分支,都是改进 AABB 的存储或者三角片与包围盒和三角形片与三角片的碰撞检测等。物理引擎有很多,主要流行有 nVIDIA 的 Physx 和 Inter 的 Havok 这两款。前者可以通过 nVIDIA 的 GPU 来加速,如果不是 nVIDIA 的 GPU,就用 CPU 来处理;后者是通过多个 GPU 来处理,如果没有多个 GPU,就得用 CPU 来处理,所以在速度上要比 Physx 慢。本课题选用 Newton 物理引擎,是由于它易用。Newton 物理引擎是为物理环境的实时仿真提供了一个综合性解决方案,该API

38、 提供场景管理,碰撞检测,动态行为,而且它是小型,快速,稳定,易于使用。不仅能应用到游戏,还能使用在实时仿真。支持的碰撞元有球(Sphere) 、盒子(Box) 、胶囊状体(Capsule) 、圆柱(Cylinder) 、圆锥(Cone) 、倒角圆柱体(Chamfer Cylinder) 、前面几种混合物(Compound) 、凸体(Convex Hull) 、用户网格(User Mesh)和树碰撞(Tree collision)等12。3.2 赛车总体设计架构赛车总体设计架构系统运行机制如图 3-4。图图 3-4 赛车游戏运行机制设计图赛车游戏运行机制设计图本赛车游戏是带有物理引擎赛车游戏。

39、本赛车游戏有四个基本要求:(1) 汽车的动力加速和碰撞检测。(2) 赛车和粒子渲染。(3) 声音播放。(4) 输入系统处理。本游戏在物理引擎方面使用 Newton 来处理,在声音方面上使用的是FMOD,在图形方面使用 OGRE。OGRE(Object-oriented Graphics Rendering Engine 的缩写,译为面对对象的图形渲染引擎)是一个开源的图形渲染引擎,通过 OpenGL 插件或 Direct3D 插件来实现 3D 渲染的硬件加速。虽然 OGRE 没有 DirectX 包含各种组件,如声音组件,网络组件,但它的面对对象,跨平台,调用简单,合理利用模式设计,开源等优点

40、,值得学习。粒子系统使用了 OGRE 的内部粒子系统插件。输入系统用 OIS 库。OIS(Object Oriented Input System,面对对象输入系统)是跨平台,开源的输出处理系统,在 Windows 平台下是用 DInput8 组件来处理输入。 UI 系统系统UI 系统处理如图 3-5 所示。图图 3-5 UI 系统结构图系统结构图输入设备输入的数据通过 OIS 进行事件归类处理,然后传递给 CEGUI 来处理,然后进行 CEGUI 用 OGRE 来渲染出来。竞技场编辑系统是通过选择物体,布置到场景内,然后通过鼠标和键盘改变物体所在的位置,方向等,最终保存到竞技场文件中。竞技场

41、文件也是 XML 格式的文件,主要记录了物体位置。 录像回放功能系统和设置系统录像回放功能系统和设置系统录像和回放功能都是通过关键帧来处理。录像功能是每隔一定时间记录变动物体的位置,然后保存到文件。而回放功能是从文件里读取关键帧,渲染出此帧时场景中各个物体。记录文件格式是 XML 格式。记录的文件名来表示是哪个场景。主要记录了车模型,每帧车框架的位置和各个轮胎的位置,还记录变动物体的位置。如果物体没变动就不记录。设置系统,在程序运行时读取配置文件,然后给出界面,如果被修改,然后直接影响游戏,保存到配置文件。配置文件也是 XML 格式,设置阴影和反射,是否手动档,声音大小控制等。3.3 本章小结

42、本章小结本章对整个系统作了简单的介绍。先分析和讨论了物理引擎,主要讲述了刚体、汽车动力和碰撞检测,在碰撞检测介绍了基于 AABB 的碰撞检测算法。接着对本系统的总体设计进行了介绍。简单介绍了游戏的各个子模块,分析了各模块的主要功能。第第 4 章章 赛车游戏详细设计赛车游戏详细设计4.1 基于基于 OGRE 的窗口框架设计的窗口框架设计在 Windows 平台下,OGRE 的窗口框架有两种,一种是让 OGRE 自己管理消息处理,一种是用户(这里指的是用 OGRE 做渲染的)自己去管理窗口消息,只是利用 OGRE 做渲染。当然不管 OGRE 自己管理消息处理,还是用户自己去管理消息处理。一些必要的

43、步骤还是不会变的。图图 4-1 OGRE 框架创建的基本流程框架创建的基本流程如图 4-1 是 OGRE 框架创建的必要的基本流程。基本的代码如下:mRoot = new Root(plugins.cfg,LopezOgre.cfg,LopezOgre.log); / 配置资源 setupResources();/ 配置渲染 bool carryOn = configure(); if (!carryOn) return false; / 选择场景管理器 chooseSceneManager(); / 创建摄像机 createCamera();/ 创建视图窗口 createViewports(

44、);/ 创建一个资源监听createResourceListener();/ 载入资源loadResources();/ 创建场景 createScene();/ 创建帧监听 createFrameListener();/ OGRE 自带消息处理渲染mRoot-startRendering();/ 清理 destroyScene();OGRE 框架基本流程,包含 Root 对象创建。由图 4-1 可得,利用 OGRE 做渲染必须要有一个 Root 对象。Root 对象是OGRE 系统的入口。而且必须首先被创建,最后被销毁。Root 对象让你能够配置系统,例如通过 Root:showConfig

45、Dialog()方法来提供一个渲染方式的选择,包含了 Direct3D 与 OpenGL 的选择(这需要硬件支持) ,还有 Direct3D 和 OpenGL的一些配置选择。OGRE 还要获取渲染窗口,场景管理和各种资源的指针。13渲染系统(Render System) ,是一个接口,是由 D3DRenderSystem 和GLRenderSystem 来最终实现所有的渲染。通过调用 Root:initialise()方法来实现渲染系统的初始化。可以通过 Root:getRenderSystem()方法获取一个当前激活的渲染系统。场景管理和资源管理场景管理和资源管理场景管理,是负责创建和管理场

46、景的摄像机、移动对象、灯光、材质等。场景管理自动渲染系统调用,而不需要自己手动调用SceneManager:_renderScene() 。场景管理通过 Root:createSceneManager()方法传递一个场景类型值来创建。允许开发人员自己指定一个场景管理,而不需要改变代码。资源管理,能管理很多资源,支持纹理、字体、材质、模型等,不仅能能读取文件,还能读取 ZIP 格式的压缩包,还能对资源载入进行监听。 创建窗口创建窗口在 Windows 平台下,创建窗口和消息管理一样,都有两种方式,一种是OGRE 自己创建,只需要调用 Root:initialise()方法,传递一个 true 值

47、就行了。第二种是自己创建窗口,传递一个 false 值给 Root:initialise()方法,然后进行手动注册,图 4-2 所示一些基本步骤。图图 4-2 手动创建窗口的步骤手动创建窗口的步骤一个基本的 Windows 窗口就是这样创建出来。创建一个监听器,这样我们可以对每帧前进行处理,渲染后进行处理,当然还进行一些输入的处理。LopezOgreFrameListener 是一个类,从Ogre:FrameListener 类继承而来,把输入系统的键盘输入,鼠标输入和输入管理等作为静态变量,使他们只有一个实例。而本设计中使用了两个从LopezOgreFrameListener 继承的 CEG

48、UIFrameListener 类和 MainFrameListener 类,前者是负责 CEGUI 的控件的一些处理,后者负责渲染以及在游戏中的案件处理。经过上面几个步骤,一个简单的 OGRE 框架构架完成。MainFrameListener 的 frameStarted()方法进行了物理引擎的处理。4.2 OgreNewt 使用使用OgreNewt 是 Newton 库的 OGRE 包装,利用 Newton 进行物理碰撞等处理,利用 OGRE 来进行图形渲染。Newton 库有一些基本元素来描述物理世界,它们是:World,这个是包含物体的空间,在 Newton 是 NewtonWorld

49、 类来实现,相对应是 OgreNewt:World 类。所有的物体必须要有一个 World 来创建。但可以创建多个 World。本设计就创建了一个 World。Rigid Body,也就是刚体的意思,在 Newton 是 NewtonBody 类来实现,相对应是 OgreNewt:Body 类。刚体在上面已有描述。这个是在物理世界最基本的一个类。它代表一个固体,能和场景中其它物体进行互动。物体可以有质量,大小和形状。基本上受力影响的物体都可以创建一个刚体。Collision,碰撞类型,描述物体是什么形状,并为之后的碰撞做准备,可以重复使用碰撞类型。如果有 100 个不同箱子,只需要创建 100

50、 个刚体,加一个碰撞类型,而不需要 100 个 Collision。Newton 支持这几种方法:第一,基本图元,包含球(Sphere) 、盒子(Box) 、胶囊状体(Capsule) 、圆柱(Cylinder) 、圆锥(Cone) 、倒角圆柱体(Chamfer Cylinder) 、前面几种混合物(Compound) ;第二,凸体(Convex Hull) ,就是用空间里一系列点创建一个最小凸型,一般用模型上的点来创建,可以变得 3D 模型差不多的碰撞类型;第三,树碰撞(Tree Collision) ,也就是多边形碰撞,一般用于固定不会动的物体,被赋予一个无限大的质量,所以完全不能运动,比

51、如一个球场。因此树碰撞不能被使用在活动的物体。不能把这 3 种类型进行组合。Joint,表示两个物体的连接。它们将影响之间的互动。如果把两个物体用hinge jiont 来连接,就创建了一个门。Material,材质,描述物体的类型,可以被使用者调整两个物体相互运动的方式。简单的可以调整摩擦系数,还有更复杂的用途。首先需要创建一个MaterialID 来表示系统里可能需要的 Material,然后用创建一个 MaterialPair,用于描述两个物体碰到的行为。比如为车和铁的碰撞创建一个 MaterialPair,然后它会创建火花和音效等。当两个物体碰撞,发生定义好的行为。从上面得出,Ogre

52、Newt 创建刚体的基本流程,如图 4-3 所示。图图 4-3 OgreNewt 创建刚体的基本流程创建刚体的基本流程首先,需要创建一个 World,也就是 OgreNewtWorld 类的变量,在这里只需要一个就行。接着,需要为刚体定义好 MateriaID 和 MaterialPairerialPair, 。然后,通过 OgreNewtWorld 和 MateriaID 来创建一个刚体。最后,为刚体创建Collision。物理引擎的更新就很简单,在每帧渲染前调用 OgreNewtWorld:update()方法就行。4.3 车模型设计车模型设计这里将详细介绍车模型,一辆车划可分成两个部分,

53、车身和车轮。 车身车身车身主要确定了车的动力性能,比如基本的转速和扭矩。下面是选取车模型的重要部分进行解释:表示定义了车的名字是 Cabrio。 表示定义了车身文件是 cabrio.rb,质点位中心的偏移了(0.0,-0.28,0.0)的位置。表示了当每分钟转速是 500 时,扭矩为 100。表示当前的档位提速为比率 4.6。另外一下参数请参考附录 A.1。车子状态有 4 种,第一:4 个轮子都着地;第二:2 个轮子着地;第三:在空中降落;第四:翻倒。而不同的状态都影响着车的速度等。车轮是车的一个重要组成部分。车轮在游戏中所在环境有 3 种,第一:在路上;第二:在泥土上;第三,是在道具(指放入

54、场景的障碍物)上。车子通过发动机的动力,最终转化为车轮的转矩,让车子能运动。车轮数据结构包含了位置,转动方向,转速。Car 是从 OgreNewt:Vehicle 类继承而来,而 OgreNewt:Vehicle 类是 Newton类 Vehicle 的 OGRE 封装。Tire 作为 Car 的内部类被封装在里面,是从OgreNewt:Vehicle:Tire 类继承而来。类之间关系图 4-4 所示:图图 4-4 车模型相关类之间关系车模型相关类之间关系一些主要代码如下:/! Car 类,基本车子实体。class Car : public OgreNewt:Vehiclepublic:/!

55、车子状态,4 轮着地,2 轮着地,空降,翻车enum VehicleStateVS_4ONFLOOR,/! 4 轮着地VS_2WHEELS, /! 2 轮VS_AIRBORNE,/! 空降VS_UPSIDEDOWN /! 颠倒;/! 轮子状态,路上,泥土,道具上enum TireState TS_ONROAD,TS_ONDIRT, TS_ONPROP ;/!hide();/ 是否点击了确定按钮bool wasOkClicked() return mWasOkClicked; public:bool mWasOkClicked; /用于判断是否确定按钮被点击 bool mPlaySounds;/

56、用于判断点击按钮时是否要播放声音CEGUI:FrameWindow* mWindow;/ CEGUI 窗口StandardButton* mButtonOK;/确定按钮StandardButton* mButtonCancel;/取消按钮;通过调用 BasicDialog:BasicDialog()方法进行基本对话框的初始化,窗口创建,确定按钮和取消创建以及点击事件处理方法的绑定,和播放点击按钮事件事件播放出来。BasicDialog:show()和 BasicDialog:hide()方法用于显示窗口和隐藏窗口。BasicDialog:wasOkClicked()方法被外部调用来判断是否确定

57、按钮被点击,然后编写相关的代码。4.5 声音系统设计声音系统设计 声音声音一个游戏离不开声音。声音能烘托出一个环境,使得游戏更逼真,可玩性更高。声音播放是通过调用 FMOD:System 类来实现。声音播放控制有 3 种状态:正在播放、暂停和停止。除此之外,还可以设置声源的位置,是否循环播放等。 声音管理声音管理声音管理是管理声音的类,从声音文件读取,然后进行解码,存储起来。设置 3D 音效等。以下是声音系统实现的主要代码:/! 声音类class Sound public:/! 播放状态,停止,正在播放,暂停enum PlayState PS_STOPPED, PS_PLAYING, PS_P

58、AUSED;/ 播放函数,无参数void play();/ 播放函数,参数传入音量void play( int vol );/播放函数,参数传入音量,位置,速度,用于 3D 音效void play( int vol,const Ogre:Vector3& pos,const Ogre:Vector3& vel = Ogre:Vector3:ZERO );/ 停止,暂停和判断是否在播放void stop();void pause();bool isPlaying();/ 设置声音位置和速度,用于 3D 音效void setPositionVelocity( const Ogre:

59、Vector3& pos, const Ogre:Vector3& vel = Ogre:Vector3:ZERO );/ 获取位置和速度,用于 3D 音效void getPositionVelocity( Ogre:Vector3& pos, Ogre:Vector3& vel ); private:FMOD:Channel * mChannel; / 声音管道,用于设置 3D 音效PlayState mState;/ 播放状态std:string mName; / 声音名FMOD:System*mSystem; /!FMOD:System 类指针,用于播放

60、; / 声音管理类 class SoundManager public:/ 单件,获取 SoundManager 实例static SoundManager& getSingleton();/ 从文件里读取,增加声音Sound* addSound( std:string name, std:string filename );/ 移除声音,参数传入声音名void removeSound( std:string name );/ 播放声音,参数传入声音名void playSound( std:string name );/ 设置听者位置,参数传入听者位置,速度,向前和向上方向void setListenerPosition( Ogre:Vector3& pos, Ogre

温馨提示

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

评论

0/150

提交评论