收藏 分销(赏)

带有物理引擎的赛车游戏研究与探索.doc

上传人:仙人****88 文档编号:9313381 上传时间:2025-03-21 格式:DOC 页数:50 大小:3.23MB 下载积分:10 金币
下载 相关 举报
带有物理引擎的赛车游戏研究与探索.doc_第1页
第1页 / 共50页
带有物理引擎的赛车游戏研究与探索.doc_第2页
第2页 / 共50页


点击查看更多>>
资源描述
摘要 现代PC游戏一般需要物理引擎的支持,合理的安排和控制物理引擎是完美游戏的保障。本课题介绍了物理引擎的基本概念,分析物理引擎的工作原理,最后完成了一个带有物理引擎的游戏设计与实现。 通过对物理引擎的研究和探索,讨论了一些碰撞检测算法和汽车动力学知识,并成功地利用了OGRE、Newton、OgreNewt、FMOD、CEGUI等库实现一个赛车游戏,在实时性和高精度性做出了很好的平衡,效果良好。 关键词: 物理引擎,赛车游戏,碰撞检测算法 ABSTRACT Generally, modern PC games require the support of physics engine, 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 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 good effect. Keywords: physics engine, a racing game, collision detection algorithm, 目录 摘要 I ABSTRACT II 第1章 绪论 1 1.1 背景 1 1.2 研究内容 1 第2章 带有物理引擎的赛车游戏框架 3 2.1 总体技术框架 3 2.2 物理引擎技术 3 2.2.1 物理引擎的概念 3 2.2.2 物理引擎的现状 4 2.2.3 物理引擎的特性 5 2.2.4 物理引擎发展方向 5 2.3 图形渲染引擎技术 6 2.3.1 图形渲染引擎的概念 6 2.3.2 着色器与着色语言 7 2.4 设备输入技术 7 2.5 UI系统 7 2.6 声音系统 8 2.7 本章小结 8 第3章 赛车游戏总体设计 9 3.1 物理引擎 9 3.1.1 动力学与刚体的运动 9 3.1.2 汽车动力 10 3.1.3 碰撞检测 11 3.1.4 现有的物理引擎 13 3.2 赛车总体设计架构 13 3.2.1 赛车游戏运行机制结构 13 3.2.2 UI系统 14 3.2.3 竞技场编辑系统 15 3.2.4 录像回放功能系统和设置系统 15 3.3 本章小结 15 第4章 赛车游戏详细设计 16 4.1 基于OGRE的窗口框架设计 16 4.1.1 Root对象 17 4.1.2 渲染系统 17 4.1.3 场景管理和资源管理 18 4.1.4 创建窗口 18 4.1.5 创建帧监听器 19 4.2 OgreNewt使用 19 4.3 车模型设计 21 4.3.1 车身 21 4.3.2 车轮 21 4.3.3 车模型实现 21 4.4 UI控件设计 23 4.4.1 基本的对话框设计 23 4.4.2 其余对话框设计 24 4.4.3 UI控件实现 24 4.5 声音系统设计 25 4.5.1 声音 25 4.5.2 声音管理 26 4.5.3 声音系统实现 26 4.6 录像和回放设计 28 4.7 道具管理 30 4.7.1 道具 30 4.7.2 道具管理与实现 31 4.8 不同类型物体碰撞行为回调 32 4.9 剩余类设计 33 4.10 本章小结 34 第5章 游戏测试与分析 35 5.1 测试环境 35 5.1.1 硬件配置 35 5.1.2 软件配置 35 5.2 测试项目 35 5.2.1 测试车子驾驶 35 5.2.2 碰撞测试 37 5.3 测试分析 38 5.4 本章小结 38 第6章 结论 39 6.1 总结 39 6.2 对未来的展望 39 致谢 40 参考文献 41 附录: 一些相关设计详细资料 42 A.1 汽车模型例子 42 A.2 录像文件例子 44 - 45 - 第1章 绪论 1.1 背景 计算机技术时刻地改变着人们的工作和生活。随着科技的发展,人们从单核CPU到多核CPU,从三角形等简单的图形显示到GPU进行复杂的纹理显示,从简单的2D世界跨越到复杂的3D世界,从简单的碰撞到越来越复杂的粒子系统、AI系统等,以及PPU的出现,早已受到物理引擎的影响。 从Ageia制造独立的PhysX物理卡开始,人们进行进入了物理加速的时代。人们已经不需要CPU来处理物理引擎(是一个计算机程序,对牛顿物理模型的模拟[1]),而且PPU处理也比CPU快多了,也能提高另外事物的处理效率。虽然当时一块PPU就要需要2000多美元,但Ageia的营销模式促使PPU的生存,免费提供给游戏开发厂商SDK[2]。游戏厂商使用了SDK来进行开,只需要玩家买PhysX物理卡就能支持物理加速,得到更加真实的画面。在2008年2月Ageia被nVIDIA收购后,PhysX技术被应用到了CUDA(Compute Unified Device Architecture,译为计算统一设备架构)运算技术中。所有支援CUDA技术的显卡,就可以直接硬件支援PhysX加速,因此在PC平台,PPU最终会被GPU取代,但在PS3等平台还是存在。 GPGPU(General-purpose computing on graphics processing units的缩写,译为图形处理器通用编程)的出现,显存的提高,着色语言(Shading Language,是着色器编程语言,进行GPU的编程)的产生,使得人们利用显卡来加速,从而GPU来处理物理引擎变成了事实。而且GPU在浮点数上的处理速度远大于CPU的处理,更能提高物理引擎的处理速度。因此用GPU来处理物理引擎已经很热门的方向。nVIDIA的CUDA提供很好的环境来处理这些。 随着科技的发展,人们从CPU频率的提高,转到了多核的发展。多核的出现,还是挽救了一部分物理引擎用CPU处理,提高效率。 物理引擎的加速最终会走向何方,只有等待时间给出解答。 1.2 研究内容 本论文首先围绕着一个赛车游戏的设计与实现,介绍了物理引擎的现况和物理引擎存在的一些问题,简述碰撞检测技术。简单讨论了物理引擎的动力学相关技术,碰撞检测相关算法技术和3D渲染技术等。分模块详细的介绍了赛车游戏设计,主要是基于OGRE的窗口框架设计,车模型设计、UI设计、声音系统设计、录像和回放设计、道具设计等。 第2章 带有物理引擎的赛车游戏框架 2.1 总体技术框架 在一个赛车游戏中,车子都以一种格式被表示,车子在接受玩家指令时,根据当前环境、动力、以及指令的要求,处理相关的反应,比如碰撞、倒退等动作,然后最终被渲染出来。以上的过程涉及到设备输入技术,物理引擎,和图形渲染。图2-1显示了一个带有物理引擎的赛车游戏技术框架。 图2-1 带有物理引擎的赛车游戏技术框架 下面将分小结介绍物理引擎技术,图形渲染技术和设备输入技术,UI系统,模型格式,声音系统。模型格式技术在后面讲述。 2.2 物理引擎技术 2.2.1 物理引擎的概念 物理引擎是一个计算机程序,模拟牛顿物理模型,使用质量、速度,摩擦力和空气阻力等变量,预测不同情况下的效果。它主要用于科学模拟和电子游戏中。 物理引擎涉及到动力学和碰撞检测等相关知识。动力学,是一门力学的分支,主要是应用牛顿运动第二定律与能量观念研究质点或刚体在空间中的运动与受力的状况,研究的课题是质点运动学(kinematics),质点动力学(kinetics),刚体运动学 ,刚体动力学,振动学,解析力学等。 碰撞检测在物理引擎中占有很重要的地位。它用于测试两个或者多个物体是否发生碰撞,为之后的变化提供可靠的依据。碰撞检测算法划分依据有基于时间和空间两种,一般有: 1) 基于时间域的碰撞检测算法可分为静态碰撞检测算法,离散碰撞检测算法和连续碰撞检测算法等。静态碰撞检测算法,顾名思义就是静态时碰撞的算法。离散碰撞检测算法,就是在每一时间的离散点上进行的碰撞检测,但有些问题,比如存在刺穿的现象和遗漏的应该发生的碰撞,这些都是由于取离散点的造成的。连续碰撞检测算法,在连续的时间间隔内进行碰撞检测,但计算速度还太慢。 2) 基于空间域的碰撞检测算法可分为基于物体空间的碰撞检测算法和基于图像空间的碰撞检测算法。基于物体空间的碰撞检测还分为采用一般表示模型的碰撞检测,和采用空间结构的碰撞检测。采用空间结构的碰撞检测,主要是空间剖分法和层次包围体树法,空间剖分法,一般均匀剖分、BSP树、k-d树和八叉树(Octree)等;层次包围体树法由包围体类型的不同来加以区分为:层次包围球树、AABB层次树(Aligned Axis Bounding Box)、OBB层次树(Oriented Bounding Box)、k-dop层次树(Discrete Orientation Polytope)、QuOSPO 层次树(Quantized Orientation Slabs with Primary Orientations)、凸块层次树、混合层次包围体树等。 虽然有这么多碰撞检测算法,在物理引擎的实时性或高精度性不高,所以碰撞检测还是需要完善。 2.2.2 物理引擎的现状 在硬件上,以时间的先后顺序可划分一下几类: 1) 单核CPU来处理物理引擎。在物理引擎发展初期,那时硬件发展还不完善,一般都会选用CPU来处理。CPU并不是用来单独处理物理引擎,但物理引擎的实时性和高精度性要求,从而使CPU的负担加重。毕竟游戏就是需要实时去表现。因此人们开始从下面三方面来发展。 2) PPU(Physics Processing Unit的缩写,译为物理处理器)独立处理物理引擎[3]。当CPU处理越来越多的事物时,就忙不过来了。而Ageia公司发明的Physx物理卡(现在已经被nVIDIA公司收购)就是为了减轻CPU的负担。虽然当时一块PPU就要需要2000多美元,但Ageia的营销模式促使PPU的生存,免费提供给游戏开发厂商SDK。如果游戏厂商用了PhysX SDK,只要玩家买PhysX物理卡就能支持物理加速。在2008年2月Ageia被nVIDIA收购后,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) 多核CPU处理物理引擎。随着CPU从单核从多核过渡,用一个CPU来处理物理引擎也不是件困难的事情。 完整的物理引擎会还包括刚体模拟、柔体模拟、流体模拟。主要研究是刚体的模拟,随着硬件的发展柔体模拟和流体模拟正在快速发展。 国外的物理引擎研究起步早,商业的如Havok、Physx等,开源的有OPCODE、ODE等,免费使用的有Newton等。Havok是使用多核GPU加速,Physx使用物理卡(现在已经被GPU取代),OPCODE、ODE等都用CPU来处理。 2.2.3 物理引擎的特性 物理引擎具有两大特性: 1、 实时性,物理引擎需要即时反应当前的状况,决定着物体的运行的方和形式。 2、 高精度性,这一般用于碰撞检测时提出的要求,模型越来越复杂,从而造成这处理需要多步,先检测大体是否能碰撞,然后细分检查碰撞的具体位置。 由于这两个特性都需要大量时间来计算,因此需要硬件更好的支持。 2.2.4 物理引擎发展方向 物理引擎技术的实现无疑是电子游戏和科学研究的一次重要飞跃,它的影响力将是巨大的,它的前景也是无限光明的。正如每一次技术革命都带来人类社会质的改变,物理引擎技术也会给科学研究和电子游戏的发展带来强大的动力。现在物理引擎技术有很多的研究方向,因为新的技术需要大家从各个方面加以扩展和深化。合理利用硬件资源将是物理引擎技术发展的主流方向。未来的物理引擎将逐步走向智能化,模拟更多的物体运动,粒子爆炸,AI发展。 2.3 图形渲染引擎技术 2.3.1 图形渲染引擎的概念 图形渲染引擎在PC平台下一般都是基于OpenGL(Open Graphics Library的缩写)或者DirectX的图形处理Direct3D包装。PC平台上,OpenGL和DirectX是主流的图形渲染硬件加速,充分利用GPU的硬件加速,提供图形的渲染效率,以及图形效果。 OpenGL是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于生成二维、三维图象。OpenGL常用与CAD,虚拟现实,科学视觉化程式和电子游戏开发。它的高效现实(利用图形加速硬件)存在于Windows,LINUX,大多数的UNIX和Mac OS。OpenGL规范由1992年成立的OpenGL架构评审委员会(ARB)维护。当独立厂商建立一种新技术时,OpenGL标准允许它们通过扩展的方法提供所扩展的功能。然后一个扩展就分成两部分发布:包含扩展函数原型的头文件和作为厂商的设备驱动。每个厂商有一个用于命名它们的新函数和常量的字母缩写。例如,nVIDIA的缩写(“NV”)用于定义它们的专有函数“glCombinerParameterfvNV()”和它们的常量“GL_NORMAL_MAP_NV”。而ARB提供的扩展一般使用缩写“ARB”。第一个ARB扩展是GL_ARB_multitexture。 DirectX(Direct eXtension,简称DX)是由微软公司建立的游戏编程接口。由C++编程语言实现,遵循COM。因为DX的功能比OpenGL更全面而被多数PC游戏开发商采用。DirectX包含DirectGraphic、DirectPlay、DirectSound、DirectInput、DirectSetup等部份。而图形渲染一般都是用Direct3D组件完成3D的渲染,DirectDraw完成2D的渲染。 两者区别: 1、 OpenGL只是负责图形渲染,而DirectX是则很全面,包含图形渲染,声音播放,联网,输入系统等。 2、 OpenGL能跨平台工作,而DirectX一般用于Windows和XBOX360上 3、 OpenGL用于科学研究多,而DirectX一般用于游戏开发。总的来说,两者各有各的长处。 2.3.2 着色器与着色语言 着色器,英文名为Shader,是应用于计算机图形学领域,指一组供计算机图形资源在执行渲染任务时使用的指令。程序员将着色器应用于图形处理器(GPU)的可编程流水线,来实现三维应用程序。这样的图形处理器有别于传统的固定流水线处理器,为GPU编程带来更高的灵活性和适应性。 着色语言,英文名为Shading Language,是着色器编程语言。 着色语言的出现,让GPGPU(General-purpose computing on graphics processing units,译为图形处理器通用编程)普及化。人们能像使用CPU一样操控GPU,提高了图形渲染速度。而且更好的利用了资源。 OpenGL从版本1.5开始集成了一种类C语言的着色语言,称为OpenGL着色语言(GLSL)。同时nVIDIA也开发了CG,其语法与GLSL类同。在Direct3D里,着色器使用高级着色器语言(HLSL)。 OpenGL和Direct3D的都包含这3种顶点着色器,几何着色器,像素着色器。 为了改善渲染速度,一般都用着色语言来进行优化,而模型的渲染等开始慢慢使用顶点着色器来渲染。 GPGPU的发展,让物理引擎能利用GPU来处理,提供效率。 2.4 设备输入技术 设备输入,这里指的是键盘鼠标的按键处理。这里有3方式:第一种,通过Windows消息WM_KEYDOWN、WM_KEYUP和鼠标相关的消息处理,但效率有点慢;第二种,使用GetKeyboardState()函数,但这只能处理键盘按下,效率不错,访问硬件得到,所以不适合;第三种,通过DirectX的组建DInput8组件来处理,DInput8是DirectX家族专门负责输入的组件,通过访问硬件来获取状态,效率高,除了包含鼠标,键盘的处理,还有手柄的处理。 2.5 UI系统 一个好的UI(User Interface)系统,能给用户带来很多便利。CEGUI(Crazy Eddie's GUI 的缩写)是一个免费的提供窗口和工具的不错UI系统,支持OpenGL、DirectX、OGRE、Irrlicht(一个基于OpenGL和DirectX的3D渲染引擎)渲染,支持Windows、Linux和Mac OS。 CEGUI的接口调用简单,还通过Lua(Lua是一个简洁、轻量、可扩展的脚本语言)支持脚本编程,能迅速开发出一个美观的游戏界面。 本毕业设计正是利用它来处理UI。 2.6 声音系统 声音系统,是游戏的一个重要组成部分。而游戏主要声音系统都是由OpenAL、FMOD和DirectX的声音组件DirectSound等来处理。 OpenAL(Open Audio Library)是自由软件界的跨平台音效API。它设计给多通道三维位置音效的特效表现。其 API 风格模仿自 OpenGL。最初是由 Loki Software 所开发,是为了将 Windows 商业游戏移植到 Linux 上。Loki 倒闭以后,这个专案由自由软件与开放源代码社区继续维护。不过现在最大的主导者是创新科技,得到来自 Apple 和自由软件与开放源代码爱好者的持续支援。主要的游戏代表ID Software 的DOOM3、QUAKE 4和Unreal 的 Unreal 2等。 FMOD[4]是专为程序开发而设计的自由,跨平台多媒体音效系统。可运行于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的声音组件是免费使用的,使用也很广泛。比如我公司——上海奥盛正在制作的《山海志》,用的就是这个声音系统。 2.7 本章小结 本章对物理引擎的相关知识和游戏的一些基本理论知识做了介绍和分析。主要分物理引擎和图形渲染方面,特别讨论了现有物理引擎状态和技术的发展,以及图形渲染的方面和游戏相关知识。物理引擎方面粗略介绍了在硬件上和软件商物理引擎的发展方向和物理引擎的问题所在。图形渲染方面粗略介绍了OpenGL和DirectX。游戏相关知识方面主要是UI系统、设备输入、声音系统等。 第3章 赛车游戏总体设计 3.1 物理引擎 由上章可看出研究刚体的物理引擎一般可划分两部分,动力学和碰撞检测。 3.1.1 动力学与刚体的运动 力学的发展,从阐述最简单的物体平衡规律,到建立运动的一般规律,经历了大约二十个世纪。前人积累的大量力学知识,对后来动力学的研究工作有着重要的作用。 动力学以牛顿第二定律为核心,这个定律指出了力、加速度、质量三者间的关系。牛顿首先引入了质量的概念,而把它和物体的重力区分开来,说明物体的重力只是地球对物体的引力。在牛顿的作用和反作用定律建立以后,人们开展了质点动力学的研究。 动力学一般是指刚体的动力学。 刚体描述了现实世界中一大类物体,变形很小,或者在运动中变形忽略不记的物体都可以抽象成刚体。刚体的运动由质心的平移运动和绕质心的旋转运动合成,相应的有两套运动微分方程组,描述刚体的质心运动规律的方程组[5],如图3-1所示: 图3-1 刚体的质心运动规律的方程组 即F=ma的合力形式,加速度是位移对时间的二阶导数和描述刚体绕质心的转动规律的方程组,如图3-2所示: 图3-2 位移对时间的二阶导数和描述刚体绕质心的转动规律的方程组 L(t)为刚体的角动量,即L(t)=I(t)ω(t),I(t)是惯性张量,ω(t)是角速度;惯性张量用来描述物体的质量分布,相同形状的物体,质量分布不同,产生的旋转运动也各不相同。当力的作用通过刚体的质心时,刚体受到的力矩为零,不产生旋转运动;当作用线偏离质心时,会产生一个作用于质心的力和一个力矩,刚体会同时作平移和旋转运动。 3.1.2 汽车动力 汽车的动力性指标主要由最高车速、加速能力和最大爬坡度来表示,是汽车使用性能中最基本的和最重要的性能。这些指标是汽车制造厂根据国家规定的试验标准,通过样车测试得出来的。[6] 最高车速:指在无风条件下,在水平、良好的沥青或水泥路面上,汽车所能达到的最大行驶速度。按我国的规定,以1.6公里长的试验路段的最后500米作为最高车速的测试区,共往返四次,取平均值。 加速能力(加速时间):指汽车在行驶中迅速增加行驶速度的能力,通常用加速时间和加速距离来表示。加速能力包括两个方面,即原地起步加速性和超车加速性。现多介绍原地起步加速性的参数。因为起步加速性与超车加速性的性能是同步的,起步加速性性能良好的汽车,超车加速性也一样良好。 原地起步加速性是指汽车由静止状态起步后,以最大加速强度连续换档至最高档,加速到一定距离或车速所需要的时间,它是真实反映汽车动力性能最重要的参数。有两种表示方式:车速0加速到1000米(或400米,或1/4英里)需要的秒数;车速从0加速到100公里/小时(80公里/小时、100公里/小时)所需要的秒数,时间越短越好。 最大爬坡度,是指汽车满载时在良好路面上用第一档克服的最大坡度,它表征汽车的爬坡能力。爬坡度用坡度的角度值(以度数表示)或以坡度起止点的高度差与其水平距离的比值(正切值)的百分数来表示。 对于经常在城市和良好公路上行驶的汽车,最大爬坡度在10°左右即可。对于载货汽车,有时需要在坏路上行驶,最大爬坡度应在30%即16.5°左右。而越野汽车要在无路地带行驶,最大爬坡度应达30°以上。 因此设计车子模型时需要进行各种参数规定。指定rpm(Rotate Per Minute,中文为每分钟转速),转矩,档位等。例如图3-3所示: 图3-3汽车的一些动力等参数设置 由此可见,上面是一个XML(eXtensible Markup Language,译为可扩展标记语言)格式的文件。配置一些汽车的动力参数。详细说明文件格式在后面说明。 3.1.3 碰撞检测 碰撞检测,是物理引擎的一个重要部分[7]。至从第一款角色扮演游戏开始,物理引擎就存在,只是一个简单的碰撞检测。 碰撞检测就是要检测空间中的几何形体是否相交,只针对物体的几何属性,碰撞检测中简单几何形体的碰撞容易检测,凸体的碰撞容易检测,而复杂几何形体、凹体不易检测或非常耗时[8]。例如球体的碰撞检测,只须测试两个球的球心距是否大于两个球的半径之和,如果大于就没碰撞,如果小于活等于就碰撞了。对于形状复杂的一些物体的碰撞检测,采用层次包围盒(bounding box)的方法能提高效率,整个物体由一个大的包围盒包裹住,物体再分成两部分,各自用一个包围盒再包住,这样细分下去,到每个包围盒只包裹一个简单几何体为止。这形成了一颗包围盒二叉树,碰撞检测时,如果两颗树的根节点(根节点是包围盒)不相交,两物体不相交,否则,层次遍历两颗二叉树;如果检测到叶节点的包围盒相交,则要检测简单几何体是否相交就行,提高精确度[9]。 在不同的软件应用中,对于碰撞检测的要求不同。在一些三维CAD软件中,提供干涉检查,可以很好的检测复杂零部件是否发生干涉,及时修正设计缺陷。三维CAD软件检测碰撞是精确度非常高,但速度不高,按下干涉检查等待1~2 秒得出结果。而在虚拟现实3D模拟器项目中,如果碰撞检测耗时1 秒,将使画面停顿,真实性大打折扣,这时碰撞检测的速度是关键,用户操纵一个虚拟物体与另一个物体碰撞,画面上就要实时显示出来。[10] 本设计采用了一个基于AABB(axis-aligned bounding boxes,按坐标轴排列的包围盒)的碰撞检测算法。[11] 下面是AABB的碰撞检测算法的伪代码: // A 和 B是AABB // A0 和 A1 是 A的两个孩子 // B0 和 B1 是 B的两个孩子 test(A, B) { if(A和B的包围盒重叠) { // A0和B0 if(A0是叶节点) if(B0是叶节点) 进行图元与图元相交测试 else 进行图元与包围盒快速相交测试 else if(B0是叶节点) 进行图元与包围盒相交测试 else进行包围盒与包围盒相交测试 //对A0和B1重复操作 //对A1和B0重复操作 //对A1和B1重复操作 } } 虽然AABB算法还有很多分支,都是改进AABB的存储或者三角片与包围盒和三角形片与三角片的碰撞检测等。 3.1.4 现有的物理引擎 物理引擎有很多,主要流行有nVIDIA的Physx 和Inter的Havok 这两款。前者可以通过nVIDIA的GPU来加速,如果不是nVIDIA的GPU,就用CPU来处理;后者是通过多个GPU来处理,如果没有多个GPU,就得用CPU来处理,所以在速度上要比Physx慢。 本课题选用Newton物理引擎,是由于它易用。 Newton物理引擎是为物理环境的实时仿真提供了一个综合性解决方案,该API提供场景管理,碰撞检测,动态行为,而且它是小型,快速,稳定,易于使用。不仅能应用到游戏,还能使用在实时仿真。支持的碰撞元有球(Sphere)、盒子(Box)、胶囊状体(Capsule)、圆柱(Cylinder)、圆锥(Cone)、倒角圆柱体(Chamfer Cylinder)、前面几种混合物(Compound)、凸体(Convex Hull)、用户网格(User Mesh)和树碰撞(Tree collision)等[12]。 3.2 赛车总体设计架构 3.2.1 赛车游戏运行机制结构 系统运行机制如图3-4。 图3-4 赛车游戏运行机制设计图 本赛车游戏是带有物理引擎赛车游戏。本赛车游戏有四个基本要求: (1) 汽车的动力加速和碰撞检测。 (2) 赛车和粒子渲染。 (3) 声音播放。 (4) 输入系统处理。 本游戏在物理引擎方面使用Newton来处理,在声音方面上使用的是FMOD,在图形方面使用OGRE。 OGRE(Object-oriented Graphics Rendering Engine的缩写,译为面对对象的图形渲染引擎)是一个开源的图形渲染引擎,通过OpenGL插件或Direct3D插件来实现3D渲染的硬件加速。 虽然OGRE没有DirectX包含各种组件,如声音组件,网络组件,但它的面对对象,跨平台,调用简单,合理利用模式设计,开源等优点,值得学习。 粒子系统使用了OGRE的内部粒子系统插件。 输入系统用OIS库。OIS(Object Oriented Input System,面对对象输入系统)是跨平台,开源的输出处理系统,在Windows平台下是用DInput8组件来处理输入。 3.2.2 UI系统 UI系统处理如图3-5所示。 图3-5 UI系统结构图 输入设备输入的数据通过OIS进行事件归类处理,然后传递给CEGUI来处理,然后进行CEGUI用OGRE来渲染出来。 3.2.3 竞技场编辑系统 竞技场编辑系统是通过选择物体,布置到场景内,然后通过鼠标和键盘改变物体所在的位置,方向等,最终保存到竞技场文件中。竞技场文件也是XML格式的文件,主要记录了物体位置。 3.2.4 录像回放功能系统和设置系统 录像和回放功能都是通过关键帧来处理。 录像功能是每隔一定时间记录变动物体的位置,然后保存到文件。 而回放功能是从文件里读取关键帧,渲染出此帧时场景中各个物体。 记录文件格式是XML格式。记录的文件名来表示是哪个场景。主要记录了车模型,每帧车框架的位置和各个轮胎的位置,还记录变动物体的位置。如果物体没变动就不记录。 设置系统,在程序运行时读取配置文件,然后给出界面,如果被修改,然后直接影响游戏,保存到配置文件。配置文件也是XML格式,设置阴影和反射,是否手动档,声音大小控制等。 3.3 本章小结 本章对整个系统作了简单的介绍。 先分析和讨论了物理引擎,主要讲述了刚体、汽车动力和碰撞检测,在碰撞检测介绍了基于AABB的碰撞检测算法。接着对本系统的总体设计进行了介绍。简单介绍了游戏的各个子模块,分析了各模块的主要功能。 第4章 赛车游戏详细设计 4.1 基于OGRE的窗口框架设计 在Windows平台下,OGRE的窗口框架有两种,一种是让OGRE自己管理消息处理,一种是用户(这里指的是用OGRE做渲染的)自己去管理窗口消息,只是利用OGRE做渲染。当然不管OGRE自己管理消息处理,还是用户自己去管理消息处理。一些必要的步骤还是不会变的。 图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(); // 创建一个资源监听 createResourceListener(); // 载入资源 loadResources(); // 创建场景 createScene(); // 创建帧监听 createFrameListener(); // OGRE自带消息处理渲染 mRoot->startRendering(); // 清理 destroyScene(); OGRE框架基本流程,包含Root对象创建。 4.1.1 Root对象 由图4-1可得,利用OGRE做渲染必须要有一个Root对象。Root对象是OGRE系统的入口。而且必须首先被创建,最后被销毁。Root对象让你能够配置系统,例如通过Root::showConfigDialog()方法来提供一个渲染方式的选择,包含了Direct3D与OpenGL的选择(这需要硬件支持),还有Direct3D和OpenGL的一些配置选择。OGRE还要获取渲染窗口,场景管理和各种资源的指针。[13] 4.1.2 渲染系统 渲染系统(Render System),是一个接口,是由D3DRenderSystem和GLRenderSystem来最终实现所有的渲染。通过调用Root::initialise()方法来实现渲染系统的初始化。可以通过Root::getRenderSystem()方法获取一个当前激活的渲染系统。 4.1.3 场景管理和资源管理 场景管理,是负责创建和管理场景的摄像机、移动对象、灯光、材质等。场景管理自动渲染系统调用,而不需要自己手动调用SceneManager::_renderScene()。场景管理通过Root::createSceneManager()方法传递一个场景类型值来创建。允许开发人员自己指定一个场景管理,而不需要改变代码。 资源管理,能管理很多资源,支持纹理、字体、材质、模型等,不仅能能读取文件,还能读取ZIP格式的压缩包,还能对资源载入进行监听。 4.1.4 创建窗口 在Windows平台下,创建窗口和消息管理一样,都有两种方式,一种是OGRE自己创建,只需要调用Root::initialise()方法,传递一个true值就行了。第二种是自己创建窗口,传递一个false值给Root::initialise()方法,然后进行手动注册,图4-2所示一些基本步骤。 图4-2 手动创建窗口的步骤 一个基本的Windows窗口就是这样创建出来。 4.1.5 创建帧监听器 创建一个监听器,这样我们可以对每帧前进行处理,渲染后进行处理,当然还进行一些输入的处理。LopezOgreFrameListener是一个类,从Ogre::FrameListener类继承而来,把输入系统的键盘输入,鼠标输入和输入管理等作为静态变量,使他们只有一个实例。而本设计中使用了两个从LopezOgreFrameListener继承的CEGUIFrameListener类和MainFrameListener类,前者是负责CEGUI的控件的一些处理,后者负责渲染以及在游戏中的案件处理。 经过上面几个步骤,一个简单的OGRE框架构架完成。 MainFrameListener的frameStarted()方法进行了物理引擎的处理。 4.2 OgreNewt使用 OgreNewt是Newton库的OGRE包装,利用Newton进行物理碰撞等处理,利用OGRE来进行图形渲染。 Newton库有一些基本元素来描述物理世界,它们是: World,这个是包含物体的空间,在Newton是NewtonWorld类来实现,相对应是OgreNewt::World类。所有的物体必须要有一个World来创建。但可以创建多个World。本设计就创建了一个World。 Rigid Body,也就是刚体的意思,在Newton是NewtonBody类来实现,相对
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服