华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现
图2-4 物理引擎基本架构
碰撞检测模块是物理引擎的核心模块,建立在物理学世界的基础上的[5]。其由初步碰撞检测、精确碰撞检测和精确求交三个基本模块组成,各模块的执行顺序如图2-5所示:
图2-5 碰撞检测模块流程图
在初始化阶段,碰撞检测模块给虚拟世界每个物体建立包围盒,比较常用的包围盒算法有AABB(Axis-aligned bounding box)、包围球、胶囊体等。逐步求精阶段将整个虚拟世界进行空间划分,主要用到数据结构有八叉树、k-d树和BSP树等,通过自顶向下的层次结构不断判断物体是否可能发生碰撞。最后再精确求交模块中使用凸体算法和射线检测算法得到精确的碰撞信息[6]。
物理学世界模块,是现实世界的抽象模型。物理学世界包含两个部分,一个是刚体物理学世界,一个是柔体物理学世界。在力的作用下,体积和形状都不发生改变的
6
华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现
物体称作刚体。刚体按照其运动特征可以分为平动、定轴转动、平面运动、定点运动和一般运动等形式。在一般情况下,运动刚体上各点的轨迹、速度和加速度是各不相同的,但彼此之间存在着一定的关系。体积和形状在力的作用下能够发生变化的物体称作柔体,如流体、布料等。因此,物理学世界的模块结构如图 2-6 所示。
图 2-6 物理学世界模块结构图
3. Havok和PhysX的比较
物理引擎中需要大量的计算,并且不同物理引擎针对特定显卡有3D加速功能,因此,开发3D游戏前选择一款合适的物理引擎是及其重要的,否则会极大影响游戏的性能。目前 在游戏市场占重要地位的有Intel的Havok和Nvidia的PhysX。
Havok,全称为Havok Game Dynamics SDK,译作Havok游戏动力开发包,主要分为Physics、FX、Animation、Behavior、Cloth、Destruction、AI几大组件。Havok成立于1998年,总部位于爱尔兰首都都柏林。引擎基于C/C++语言而成,2000年在游戏开发者大会上发布了Havok 1.0,最新版本为5.5,2007年9月,Intel宣布收购Havok。在全平台上,共有353种游戏使用Havok引擎,超过了PhysX的309种,使用Havok的著名游戏有:《极品飞车:亡命天涯》、《星际争霸2》、《暗黑破坏神3》、《上古卷轴4》等,图为Havok的展示Demo:
图2-7 Havok引擎展示(左为Havok Physics,右为Havok Cloth)
PhysX物理运算引擎由五名年轻的技术人员开发,他们成立了AGEIA公司。由于
7
华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现
PhysX物理引擎在设计上就并不适合用CPU去计算,因此AGEIA公司还为PhysX引擎设计了专门的运算硬件,PhysX物理加速卡,其中的运算核心被称为PPU(Physics processing Unit)。图2-8为AGEIA当初设想的未来PC组成部分。
图2-8 AGEIA当初设想的未来PC组成部分
2008年,Nvdia收购了AGEIA,物理加速卡停止开发,而是将PhysX物理加速功能移植到Nvdia GPU中,用户不必额外购买PhysX物理加速卡就能享受到PhysX物理加速功能。在PC平台上,共有269种游戏采用PhysX引擎,而Havok为163种。
表4-1 Havok和PhysX在各方面的比较
物理引擎: 物理加速 执行效率 跨平台性 是否开源 游戏引擎集成 主要游戏平台
Havok 多线程加速 快 全平台 是 寒霜 Wii、Xbox 360、PS3 PhysX 只支持Nvdia GPU加速 不开启GPU加速下略逊一筹 全平台 否 Unity3D PC (三) Unity3D
1. Unity3D简介
Unity3D是由Unity Technologies开发的一款全面整合的专业游戏引擎,其具有的功能使得开发人员可专注于游戏的设计而忽略底层的技术实现,达到快速开发的目的。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件其编辑器运行在Windows 和Mac OS
8
华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现
X下。其主要的特色有[7]:
图形动力:内部封装了DirectX和OpenGL图形渲染库,并附带一些常用的渲染组件及着色器脚本。
物理仿真:Unity3d不但整合了Nvidia PhysX物理引擎,并在其基础上封装了游戏中常会用到的物理组件,如碰撞体、连接体等。
跨平台性:可发布游戏至Windows、Mac、iOS、Android、Xbox、Wii或PS3平台,也可以利用Unity web player或者Flash插件发布网页游戏,支持Mac和Windows的网页浏览。
资源商城:开发人员可在资源商城中购买其他人开发的资源(代码、模型等),进行高效复用。
资源服务器:Unity资源服务器是一个附加的版本控制的产品,但比起SVN更适合游戏团队中不同职位的人员共同使用(程序、策划、美术)。
性能分析器:引擎中自带一个Profiler分析器,开发人员可在编辑器或者设备连线进行性能分析CPU和GPU不同阶段的效率。
2. Unity3D基本概念
一个完整的lJnity3d程序是由若干个场景(Scene)组合起来的,每个场景中又包含有许多游戏对象(GameObject),每个对象可以具有若干组件(Component),其中的继承自MonoBehavior的脚本组件进行初始化、更新等操作,而我们在场景所看到的内容是由摄像头(Camera)来呈现并控制的。
场景(Scene):场景是Unity3D程序的基本组成单位,任何一个Unity3D程序都是由若干场景组合而成,程序通过脚本在这些场景之间跳转。场景通过场景图的形式组织,场景图实际上是一种树形结构,其中每个节点就是一个游戏对象。对象与对象之间存在父子关系,即当父级对象移动、旋转、缩放时,子级对象也跟着一起变换,如图2-9所示:
[8]
9
华东师范大学学士学位论文 基于Unity的车辆模拟游戏的设计与实现
图2-9 旋转一个父节点同时它的子节点也跟着旋转
游戏对象(GameObject):在场景中按照场景图形式组织,场景图实际上是一种树形结构,如图。树形层次结构中的节点,加入的特定组件后就成了有实际功能的对象,如可渲染网格、摄像机、光源等,游戏对象可以打包成.prefab格式的文件方便复用。
组件(Component):组件可以是网格(Mesh)、光源(Light)、摄像机(Camera)、粒子系统(Particle)、物理碰撞体(Collider)、布料(Cloth)、连接体(Joint)、声音(Audio)、动画(Animation)以及最重要的脚本(Script)。Unity3D的设计是以面向对象理论为基础,Unity3D支持C#、JavaScript和Boo三种脚本语言,如果对象继承自MonoBehavior脚本对象,生命周期将交给Unity3D来管理,如图2-10所示:
10