第7章  游戏开发的核心——
Box2D 物理引擎
汽车引擎是汽车的心脏,其决定了汽车的性能和稳定性,是人们在购车时最关注的。而游戏中物理引擎就如汽车的引擎一样,占据了非常重要的位置。一款好的物理引擎可以非常真实地模拟现实世界,使得游戏更加逼真,提供更好的娱乐体验。
经过前面章节的学习,读者可能对物理引擎已经有所了解,但那是远远不够的。本节将为读者简单介绍物理引擎的一些基本概念。
7.1.1  什么是物理引擎
物理引擎通过给物体赋予真实的物理属性来模拟物体的运动,包括碰撞、移动、旋转等。并不是所有的游戏都必须使用独立的物理引擎,一些简单游戏的物理功能可以通过自行开发碰撞检测及实现力学公式来实现对刚体及质点的模拟,就像前面的某些案例。
当游戏需要实现比较复杂的刚体碰撞、滚动或者弹跳时,通过全部自行编程的方式实现就非常困难,成本也很高。遇到这种情况时就可以使用独立的物理引擎来模拟物体的运动,使用物理引擎不仅可以得到更加真实的结果,对于开发人员来说也比自行开发要耗时短、效率高。
一款好的物理引擎不仅会帮助实现碰撞检测、力学公式模拟,而且还会提供很多机械结构的实现,如滑轮、齿轮、铰链等。这些主要是通过关节来实现的,详细内容在后续部分进行介绍。更高级的物理引擎不但可以提供刚体的模拟,甚至还可以提供软件及流体的模拟,这些都能帮助游提升真实感和吸引力。
7.1.2  常见的物理引擎
市面上存在的物理引擎数量是很多的,著名的物理引擎有Havok 、Bullet 、PhysX 、ODE 及Box2D 等。其中ODE 、Bullet 、Box2D 是开源的物理引擎,而PhysX 的前身是Novodex ,当被Ageia 收购之后改名为PhysX ,是一款可以免费用于非商业用途的引擎,商业用途及源代码需要付费,Havok 在许可方面也是如此。上述几种物理引擎的基本信息如表7-1所列。
表7-1
知名物理引擎的基本信息
物理引擎名称 Havok PhysX Bullet Box2D ODE 持有公司/人员 Intel Nvidia AMD Erin Catto Russell Smith 是否开源 否 否 是 是 是 是否支持C/C++
是 是
最新版本    5.5 9.13.1220 2.82    2.3    2.1 文档情况
详细
详细
尚可
尚可
一般
287
7.1  物理引擎很重要
提示
三大3D 物理引擎为Havok 、PhysX 和Bullet 。另外2008年2月4日,NVIDIA 成功收购AGEIA ,支援CUDA 技术的显卡,就可以启动硬件PhysX 加速。
y  Havok
Havok 成立于1998年,总部位于都柏林。在2000年游戏开发者大会上发布了Havok 1.0,最新版本为Havok 5.5,该引擎基于C/C++。2007年9月,Intel 宣布成功收购Havok 。之后,Intel 宣布Havok 引擎开放源代码,并允许游戏开发人员免费用于非商业用途。
因为Havok 全面为多线程与多平台优化,所以Havok 对各种先进的游戏平台提供了全面的支持,其中包括XBOX360数字游戏娱乐系统、PlayStation3娱乐系统、Windows 系列、iOS ,以及Mac OS 与Linux 等顶尖的平台。另外2011年3月6日,Intel 宣布Havok 引擎开始支持Android 平台。
由于Havok 的开放性和不依赖于特定硬件的特点,很多大型游戏均使用Havok 引擎。其中著名的有“星际争霸2”、“暗黑破坏神3”等,效果分别如图7-1和图7-2所示。
图7-1  星级争霸2 ▲
图7-2  暗黑破坏神3
y  PhysX
PhysX 不仅可以由CPU 计算,而且其程序本身在设计上可以使用独立的浮点处理器来计算(如PhysX 技术可利用GPU 的处理能力来执行复杂的物理特效计算)。正是由于这个原因,其可以非常轻松地完成像流体力学那样计算量非常大的物理模拟计算。该引擎可以在Windows 、Linux 、XBOX360、Playstation3,以及Mac 等多种平台上运行。
“无知之地2”以及“地铁:最后光芒”等流行游戏均采用PhysX 技术。该技术可为游戏带来充满动感的爆炸、撞击破坏效果、基于粒子的流体效果及逼真的动画,令游戏场景仿真度极高,给玩家身临其境的感觉。脍炙人口的游戏“雪域危机”和“虚幻竞技场3”采用的就是PhysX 引擎,其运行效果如图7-3和图7-4所示。
图7-3  雪域危机 ▲
图7-4  虚幻竞技场3
第7章游戏开发的核心——Box2D物理引擎
288
y Bullet
Bullet是一款开源的3D物理引擎,是AMD开放物理计划的成员之一。同时其也是一个跨平台的物理引擎,支持Windows、Linux、MAC、PlayStation3、XBOX360,以及Nintendo wii等主流游戏平台。主要特包括支持滚动摩擦、齿轮约束、力和力矩的联合反馈、可选的科里奥利力以及快速移动物体的投机性接触等,便于进行高质量的物理模拟。
使用Bullet物理引擎开发的游戏主要有“激流GP2”,其运行效果如图7-5 所示,从画面中可以看出。同时使用该引擎制作的电影也不乏好莱坞大作,如电影《2012》就是使用的该引擎,其效果如图7-6所示。
▲图7-5  激流GP2 ▲图7-6  电影《2012》场景
y ODE
ODE(Open Dynamic Engine)是一款免费的具有工业品质的刚体动力学引擎。其可以非常好地仿真现实中物体的移动、旋转等,具有快速、强健和可移植性的特点,并且内置碰撞检测系统。
ODE目前可以支持球窝、铰链、滑块、定轴、角电机和hinge-2等连接类型,还可以支持各种碰撞形式(如球面碰撞和平面碰撞)和多个碰撞空间。使用ODE来进行物理模拟的游戏有“泰坦之旅”、“粘粘世界”等,其运行效果如图7-7和图7-8所示。
▲图7-7  泰坦之旅 ▲图7-8  粘粘世界
y Box2D
Box2D是一款非常著名的2D物理引擎,主要用于2D刚体仿真,有C++、Flash和Java等版本,其可以使物体的运动更加真实可信,让世界看起来更具有交互性。Box2D最早是用可移植的C++开发的,后来随着需求的变化陆续推出了Java与Flash的版本。同时,Box2D也是本书准备详细介绍的物理引擎。
出自于法国设计师之手的游戏“搬运鼠”,一经推出便风靡欧洲,其就是基于该物理引擎开发的。此外,由RovioMobile开发的“愤怒的小鸟”,相对于前者更是风靡全球,其物理引擎同样是Box2D,运行效果如图7-9和图7-10所示。
289
7.2  2D 的王者
Box2D
图7-9  搬运鼠 ▲
图7-10  愤怒的小鸟
Box2D 是一款开源的2D 物理引擎,其能够根据开发人员设定的参数,如重力、密度、摩擦系数和恢复系数等,自动地进行2D 刚体物理运动的全方位模拟。
学习物理引擎时,首先需要弄明白的就是其中需要用到的一些基本概念。因此,本节将首先复习一些物理学中的基本概念。回顾了几个基本的物理学概念后,还会介绍一些Box2D 中的常用类,为后面在实际应用中使用Box2D 打下基础。
javascript游戏引擎
7.2.1  基本的物理学概念
很多游戏都是对现实世界的仿真,其中用到了许多物理学知识,如密度、质量、质心、摩擦力、扭矩以及恢复系数等。接下来,本小节将简要介绍用Box2D 开发游戏时经常涉及到的一些物理学概念。
y  密度
物理学中密度指的是单位体积的质量,符号为“ρ”,常用单位为kg/m^3。其是物质的一种物理属性,不随物体形状和空间地理位置的变化而变化,但会随着物质的状态、温度和压强的变化而变化。不同物质的密度一般不同,而同种物质在相同状态下的密度则是相同的。
y  质量
质量指的是物体中所含物质的量,即物体惯性的大小,国际单位为kg 。同一物体的质量通常是个常量,不因高度、经度或者纬度的变化而变化。但是根据爱因斯坦的相对论,同一物体的质量会随着速度的改变而改变。只有运动接近光速才能感觉到这种变化,因此,在游戏中一般不考虑速度对质量的影响。
y  质心
物体(或物体系)的质量中心,是研究物体(或物体系)机械运动的一个重要参考点。当作用力(或合力)通过该点时,物体只作移动而不发生转动;否则在发生移动的同时物体将绕该点转动。研究质心的运动时,可将物体的质量看作集中于质心。理论上,质心是对物体的质量分布用“加权平均法”求出的平均中心。
y  摩擦力
当两个互相接触的物体,如果要发生或者已经发生相对运动,就会在接触面上产生一种阻碍该相对运动的力,这种力就称为摩擦力。其基本情况如图7-11所示。
y  扭矩
扭矩在物理学中就是力矩的大小,等于力与力臂的乘积,国际单位是Nm (牛米)。在力臂不变的情
况下,力越大,扭矩越大,基本情况如图7-12所示。
第7章游戏开发的核心——Box2D物理引擎
290
▲图7-11  摩擦力示意图 ▲图7-12  扭矩示意图 y恢复系数
两物体碰撞后的总动能与碰撞前的总动能之间的比称之为恢复系数,其取值为0~1。如果恢复系数为1,则碰撞为完全弹性碰撞,满足机械能守恒;如果恢复系数小于1并且大于0,则为非完全弹性碰撞,不满足机械能守恒,这种情况时最常见的;如果恢复系数为0,则为完全非弹性碰撞,两个物体会粘在一起,基本情况如图7-13所示。
▲图7-13  各种碰撞情况
说明在图7-13中,两个小球质量相等,小球的初速度V1大于V2。
7.2.2 Box2D中常用类的介绍
在学习新技术时,首先要学习的就是该技术的一些基本概念和知识,这对于使用Box2D物体引擎有着非常重要的作用,因此,本小节将主要介绍Box2D中一些必知必会的结构体和类。
提示
由于Box2D中的类与结构体非常多,故本节中仅仅能列出作者觉得重要的一些。如果读者想进一步了解其他的类与结构体可以去查看Box2D源代码,这也是
开源项目的一大好处。作者自己通过阅读源代码就学到了很多有用的知识。
1.二维向量——b2Vec2结构体
b2Vec2结构体表示二维向量或者二维笛卡尔坐标,其是由两个float32类型的数组成,支持+=、-=和*=操作符。同时其还包括了一些方法,例如,获取向量长度的方法、将向量设置为零向量的方法等。二维向量b2Vec2结构体的基本含义如图7-14所示。
▲图7-14  二维向量示意图

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。