§13.2物理引擎
有了基本物理学的新知识,现在你可以较容易地比较现有的物理引擎了。实现了基本的东西和确定在系统中已定义了正确的常量并感觉良好之后,你应该考虑一下游戏的需求。物理引擎往往可以做很多不同的东西,许多物理演示和教程看上去很酷,但往往不能用于大多数游戏。第一次看到一堆箱子互相碰撞很有趣,但很少有游戏允许直接控制箱子并推动它们,而且看多了箱子翻倒就会觉得无趣,这就好象再一次回到了幼儿园一样。
但是,并非所有的演示仅仅是一堆方块。有许多很好的示例向你展示物理引擎的特殊功能,但我的观点是,大多数游戏只需要某些特定功能。第一人称射击游戏可能会用到大多数的功能,这点你可以在近几年中发售的游戏中看到。几乎所有的第一人称射击游戏都会实现某些物理系统,但其他类型的游戏,如角色扮演游戏、策略游戏等等,要么没有物理系统或只有最基本的物理系统,而且往往只是用来改善视觉效果而不是游戏逻辑本身。
我个人不喜欢在策略游戏中使用物理效果,因为它们实现得并不好,往往只是添加更好的视觉效果,比如周围建筑物倒塌时你的单位也会被压死。这就像在下棋时发生地震,这破坏了游戏规则,因为一切都在摇晃,你将无法作出任何聪明的举动。也许要过一段时间后开发商才会弄清楚如何正确地使用物理效果,并使游戏仍然是可预见的,而不是靠运气。
我真正喜欢的物理效果是爆炸,特效和视觉质量的改进。有几个游戏非常好地模拟了水,爆炸,烟雾效果,而且这些效果还能与周围的环境互动。
正如我前面所说,当在Xbox 360上使用XNA时你将无法使用任何物理引擎,因为它们都是基于非托管代码的,而这在XNA中不被支持。在Windows平台上可以使用任何你喜欢的物理引擎,但即使在Windows平台上很多物理引擎也没有适当的. NET接口可让你在游戏中轻松地使用和处理物理效果。.NET的可能性将在接下去讨论。总之,快速浏览一下现今的物理引擎提供的一些功能:
- 诸如像重力,摩擦力,动力和接触摩擦,浮力等等的一些力。
- 基本的物理物体支持,用来定义并处理方块,球,圆柱,平面等等。通常,这些引擎也支持连接物体和更复杂的预定义模型,如汽车、飞机、气垫船、船舶等等。
- 物体间的碰撞检测,特别是物体不一定是球体时。因为碰撞计算使用得非常频繁,需要检查大量的物体,包围球体甚至是多边形为基础的检测,所以这通常也是优化的主要地方。Rocket Commander游戏展示了一个如何检测许多碰撞的解决方法,这个方法通过分区进行优化,极大地提高了性能。
- 碰撞反应,这是在碰撞被检测到时执行的。要么你让物体反弹(如在Rocket Commander),或者你也可以破坏它们(碰撞的力转化为动能并破坏模型)。游戏通常使用预定义的爆炸、残骸或破损的三维模型,因为实时产生这些模型很难,但如果美工很棒的话效果还是会很好。
- 弹丸物理学处理子弹、火箭弹和其他发射的弹丸。你上一章中你看到弹丸是如何被使用的,如果你有一个物理引擎,你只需添加弹丸,并设置物理参数,并根据环境增加特殊的行为(例如,子弹在水中会减速),物理引擎会帮你处理弹丸。
- 完整的粒子系统也要用到物理学,正如我前面所说,我很喜欢利用物理引擎实现的特效系统,但特效系统要做大量的工作。
- 物理引擎还有更多的功能,如支持刚体模拟,布娃娃系统,像衣服,旗帜,液体之类的可变形物体和其他复杂的物体。
PhysX
PhysX是AGEIA公司的物理引擎和SDK的名称,以前被称为NovodeX SDK,PhysX也是Ageia开发的PPU(物理处理单元)的名称。PhysX PPU是世界上第一个专门用于计算物理的硬件,可用于任何使用PhysX SDK的游戏。目前支持PhysX物理引擎的游戏还不是很多,但许多引擎和即将发布的游戏已经获得了PhysX SDK的授权,而索尼公司也获得在Playstation 3游戏机使用PhysX的授权。
即使没有PPU,PhysX引擎也是强大的,开发商研究物理引擎已经很长一段时间了。它可能是仅次于Havok引擎排名第二的物理引擎,后者的应用更加广泛,不仅在游戏,而且在诸如3D Studio Max之类的3D建模程序中。将繁重的物理计算交于一个特殊的硬件处理,这个想法虽然不错,但PPU太贵了(250美元~300美元),有这种卡的人也不多。多数买这种物理卡的人是开发者或艺术家,他们可以从中受益,但你不能指望玩家要有物理卡才能运行你的游戏。但是PhysX在多核CPU也运行良好,只是不像在PPU上这么优异。
现在没有多少游戏使用PhysX,你只能找到屈指可数的几个。例如幽灵行动,哥特3,联合特遣部队以及最近的战争机器(Xbox 360游戏机)。但未来有虚幻竞技场2007和虚幻3引擎,细胞分裂,Monster Madness等等。
PhysX关注于游戏、游戏引擎、特效处理、利用物理学的游戏逻辑,有许多看上去很酷的例子和教程。它们的主要优势是:借助PPU硬件,运行速度比其他物理引擎快很多,PhysX还采用了统一架构以相同方式处理所有的物理计算。你可在PhsyX官方网站http://www.ageia.com上找到更多信息。
Havok
Havok是非常受欢迎的Havok Game Dymamics SDK(目前是第4版,在2006年发布)的名称,它也是开发这个SDK的公司的名称。这个公司成立于1998年,第一个SDK(v1.0)于2000年公布。今天有超过100个游戏使用Havok物理引擎,最有名的是游戏是半条命2和Valve公司的Source引擎,Source引擎也用在了许多以半条命为基础的改编游戏。Havok主要用于第一人称射击游戏,但其他一些游戏类型也已使用了Havok引擎。
Havok可用在许多平台上,包括个人电脑(Windows和Linux )和几乎每一种家用机(Xbox,Xbox 360,PS2,PS3,Wii,Game Cube)。它用C / C++编写,在允许编译C代码的任何系统上是非常精简的。但对.NET开发者来说没太多支持,我没听到过任何使用Havok的.NET游戏或引擎。
这个物理引擎不仅用于游戏,也可用于3D Studio Max,它利用了内部中间件,在模拟物理效果的3D艺术社区是很流行的。在以前的版本中通过一个叫reactor的插件实现,但最新版本已经在3D Studio Max的基本版中实现。Havok引擎甚至还用在了电影黑客帝国三部曲中。
Havok支持两个主要的物理操作。特效物理引擎可用于支持Shader Model 3.0的GPU如GeForce 7系列和8系列,特别是GPU很快时。然后是游戏物理引擎,这在CPU中计算。Havok是PhysX的主要竞争对手,它证明了无需额外的PPU你也可以干得很棒,2004年的半条命2游戏证明了实现很棒的物理效果是可行的,通过物理效果还能改进游戏。
你可以在Havok的官方网站http://www.havok.com/找到更多信息。
ODE
ODE表示“开放的动力学引擎(Open Dynamics Engine)”,与PhysX和Havok不同,它不是一个商业引擎,这也许是初级开发人员或小组最感兴趣的地方,初学者往往苦于没有足够的钱去使用一个大型的商业物理引擎。
ODE是一个开源物理引擎,它使用BSD许可证(或LGPL如果你喜欢)。它开始于2001年,已经有一些游戏通过这个引擎被开发出来,但它没有像PhysX或Havok那么完善的功能,也没那么成功。
ODE支持刚体动力学和碰撞检测。要提供更加先进的物理效果你仍然有很多工作要做,但ODE为你提供了一个很好的基本框架,给了你所有的基本几何形状(如正方体、球体、圆柱体等)和物理计算,你可以用来做一些基本的物理演示。还有一些框架是建立在ODE之上或使用ODE。
下面是酷的地方:ODE有一个很好的.NET包装叫做ODE.NET,可以在下面的网址找到。上面有几个示例,很多游戏引擎使用C++代码并只提供C++示例,很高兴能见到一些.NET代码了。示例展示了基本的物理处理,如堆箱子并推动它们,布娃娃物理和控制一些如汽车或玩具之类的基本物件。你也可以看看ODE的官方网站http://www.ode.org/。如果关闭了,可查看维基百科的有关条目。
其他
还有许多其他的物理引擎,我不可能全知道。也许还有其他引擎可用于.NET,但我尚未没有发现像ODE.NET那样有用的物理引擎。下面是我遇到过的一些其他物理引擎:
- Newton Game Dynamics是一个免费的物理引擎,有很好的示例和文档。它可用于业余爱好和商业用途,并支持Windows,Mac和Linux平台。像这样的一个免费引擎很不错了。我记得一年前看到国这个引擎的.NET包装,但源代码没有公开。这使得很难落实到.NET中,当你想改进引擎时也很难改变代码。而ODE能根据你的需求自由改编。可到网址http://www.newtondynamics.com/中查看。
- Tokamak Game Physics是另外一个不错的物理引擎,而且对非商业和商业项目都是完全免费的。它也有不少示例和教程,但仍没有提供源代码。引擎有近两年没有更新了,看来开发者好像放弃了。论坛上最新的留言在2005年3月。几年前我实现了一个简单的.NET包装,但我没时间改进。今天,我可能只是利用其他的现有引擎,特别是ODE.NET,因为它已经工作在.NET中。可访问http://www.tokamakphysics.com/。
- Physics and Math Library(也称为Game Physics Engine)是一个德国的引擎,最初是为一本书开发的。它着重于实现许多如Havok或PhysX之类的商业引擎的功能。它是免费使用的,但我无法找到许多截图或论坛的讨论。很难说这个引擎是否值得你花力气研究(使它运行你的项目中,甚至移植到.NET中),但看来这个项目非常有前途。该网站是http://game-physics-engine.info/。
- nV Physics Engine(也称为The Physics Engine)有一个很好的网站和一些截图(对网站介绍产品而言有截图总是好的)。它看起来很有希望,但所有示例使用的是C++,你可能没法改编源代码。该网站是http://www.thephysicsengine.com/ 。
- Bullet Physics Library是另一个免费的物理引擎,它包括完整的源代码,这很好。作者以前曾在Havok工作,这个引擎已经被其他几个引擎使用,尤其是开源引擎和三维建模工具Blender 3D。它也支持最新的文件格式,并有几个先进的功能。该网站是http://www.continuousphysics.com/Bullet/ 。
- 可能有更多的物理引擎,尤其是较小的。当你遇到某些问题时,尝试去寻找一些特定的引擎,通常无需一个成熟的物理引擎。
如你所见,有许多物理引擎可用,但在.NET环境中使用它们不是很容易。你也不能在Xbox 360上利用它们,因为它们都是用C++和非托管代码开发的,这意味着在Xbox 360上使用XNA时没有可用的。
但是,即使你最后不使用物理引擎而只是查看示例和教程,你也可以更清楚地了解物理引擎能干什么和哪些部分可能会很难重新自己实现。在赛车游戏不需要一个复杂的物理引擎。那么,这将有一个坚实的基础,但由于在.NET中实现物理引擎是如此困难,而且我想让游戏也能运行在Xbox 360上,所以你必须自己实现物理引擎。
发布时间:2008/11/11 上午8:04:51 阅读次数:8241