常见3D游戏物理引擎总结

1.  Havok:

老牌的君王,支持功能如下:

http://www.havok.com

·         Collision Detection - including Continuous Physics™

·         MOPP™ Technology - for compact representation of large collision meshes

·         Dynamics and Constraint Solving

·         Vehicle Dynamics

·         Data Serialization and Art Tool Support

·         Visual Debugger for in-game diagnostic feedback 

有不少游戏和软件都选择了他做物理引擎,比如HOLO3,失落星球,HL2, 细胞分裂,指环王Online ..etc现在Havok被Intel收购了,Intel使出了扩展Havok物理引擎市场的杀手锏——免费!Havok在网站上开始提供其物理和动画引擎产品的全免费下载。内容包括Havok SDK库、样例、技术文档以及支持Maya、3ds Max和Avid XSI等3D建模软件的格式转换工具。所有的一切只要简单注册一下姓名邮箱就可以免费下载。

下载地址
http://tryhavok.intel.com/

 

2. NovodeX --- AGEIA PhysX

新兴的王者,支持功能如下:

http://www.ageia.com/

·           Massively Parallel Physics Architecture

·           High-speed GDDR3 Memory Interface

·           AGEIA Universal Continuous Collision Detection

·           AGEIA Physical Smart Particle Technology

·           AGEIA Complex Object Physics System

·           AGEIA Scalable Terrain Fidelity

·           AGEIA Dynamic Gaming Framework

因为特有的硬件卡(物理加速卡-PPU)支持,所以能处理大量的物理运算,其他几款暂时没得比。Unreal3,GameBryo, Reality Engine等多款商业引擎和游戏都使用了他。

(Tip: NovodeX2.2及以前的版本,可以在没有硬件卡的情况下使用所有功能,晚上能下载到)

NovodeX是虚幻引擎3中功能强大的新一代物理引擎,其性能决不输给Havok Physics。NovodeX支持速度、加速度和弹性碰撞等物理概念,并且含有布娃娃系统令人物动作更加逼真。 

复杂而强大的声音仿真效果是NovodeX物理引擎的另一亮点,它不仅能够模拟出音调随着发音物体的速度而变化的多普勒效应(最明显的例子是运动着的火车汽笛声调会变的现象),甚至连同一物体中材质不同的位置也能够发出不同的声音。 

 

要使用NovodeX,我们首先需要在自己的项目中
包含 NxPhysics.h 这个头文件
然后在项目或者IDE中(以下都以VC为例),加入两个link libs
NxPhysics.lib NxFoundation.lib

以上三个文件都可以在下载的sdk中找到


下面我们正式开始使用NovodeX
第一步,让我们来创建一个nx所支持的物理世界
先来定义两个变量
NxPhysicsSDK PhysicsSDK;
NxScene* Scene;

PhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION, 0, 0);  
创建PhysicsSDK
PhysicsSDK->setParameter(NX_MIN_SEPARATION_FOR_PENALTY, -0.0001f);
这一步设置了物理叠代的最小精度
NxSceneDesc sceneDesc;
声明一个scene描述
sceneDesc.gravity = NxVec3(0, -98.0, 0);
设全局重力加速度方向和大小
sceneDesc.broadPhase = NX_BROADPHASE_COHERENT;
设叠代算法
sceneDesc.collisionDetection = true;
是否允许碰撞检测
Scene = PhysicsSDK->createScene(sceneDesc);
创建一个physics scene

OK ,到此我们已经拥有了一个物理环境,下一步该加入一些物体看看效果了
在NovodeX里,如果想要把物体和物理世界交互,比如创建一个actor,而actor又是根据形状(shape)和
刚体(body)来创建的
NovodeX里提供了4种基本的刚体形状
盒子,球,胶囊以及平面
我们先给世界加个底,设置一个地面
NxPlaneShapeDesc PlaneDesc;
声明一个平面描述
PlaneDesc.normal = NxVec3(0, 1, 0);  /// 法线朝上
PlaneDesc.d = 0; //位置在原点
NxActorDesc ActorDesc;
声明一个actor描述
ActorDesc.shapes.pushBack(&PlaneDesc);
把形状描述加入到actor的形状列表里
Scene->createActor(ActorDesc);
创建这个平面的actor

下一步。。。做个盒子好了
NxBoxShapeDesc BoxDesc;
声明一个盒子描述
BoxDesc.dimensions = NxVec3(5, 5, 5);
定义盒子的大小
NxActorDesc ActorDesc;
声明一个actor描述
ActorDesc.shapes.pushBack(&BoxDesc);
把形状描述加入到actor的形状列表里
ActorDesc.density = 1.0f;   // 设置actor的密度
ActorDesc.globalPose.t  = NxVec3(0, 50, 0); // 设置actor的初始位置
NxActor* boxActor = Scene->createActor(ActorDesc);
创建盒子actor

上面会发现和平面不同的是,出现了两个新的属性globalPose和density
globalPose是一个NxMat34类,我们一般取它的两个成员t和M
其中t是一个3元向量,确定位移,而M是一个3X3的矩阵,确定旋转,以后会经常用到
density则代表的是actor的密度,NovodeX会根据密度和物体体积来求出物体的质量,当然
我们也可以直接设置质量,成员是mass,需要注意的是,如果设置了质量,那么密度就
必须设置为0

有了物体,我们就开始让他们动起来
叠代物理世界
Scene->startRun(1/60.f);
Scene->flushStream();
Scene->finishRun();
这三个函数就完成了一次物理叠代,如果没有自定义的Stream,可以忽略掉第2个函数
在第一个函数中我们使用了1/60作为参数,这个代表了一次叠代的时间间隔
在实际应用中,最好是用我们应用程序的每帧间隔时间来代替固定的时间间隔

恩,让我们看看我们的成果吧
boxActor是我们刚才创建的盒子物体,每一祯,我们可以用
float mat[16];
boxActor->getGlobalPoseReference().getColumnMajor44(mat);
得到它的object matrix,那么就用这个矩阵把它画出来看看
怎么,在高处没动静 :), 原谅我卖了个关子
刚才我们只是加入了box的形状,而形状本身只能起到构建物理环境的作用
在我们不主动移动它位置的时候,它是不会动的,若要建立一个符合物理特性的物体
我们还需要给它加上一个刚体,回到刚才创建box actor的地方
加上这两句
NxBodyDesc BodyDesc;
BodyDesc.angularVelocity = NxVec3(0.0f, 20.0f, 0.0f);
加上一个初始的角速度
ActorDesc.body = &BodyDesc;

好了,再运行看看? 盒子一边旋转一边落下来了吧,这个就是基本的应用。

这款引擎的相关文档在网上还是比较多的。
 

3. Bullet

开源届的霸主,支持功能如下:

http://www.bulletphysics.com

·           Multi Platform support

·           Supports various shape types:

·           Discrete Collision Detection for Rigid Body Simulation

·           Single Queries:

·           Sweep and Prune Broadphase

·           Documentation and Support

·           Auto generation of MSVC project files, comes with Jam build system

·           Bullet Collision Detection works with Bullet Dynamics, but there is also a sample integration with Open Dynamics Engine.

·           Framework with 2 different Constraint Solvers

·           Hinge, Point to Point Constraint, Twist Cone Constraint (ragdolls)

·           Automatic de-activation (sleeping)

·           Generic 6 Degree of Freedom Constraint , Motors, Limits

·           LCP Warm starting of contact points

·           Collada 1.4 Physics Import using FCollada and COLLADA-DOM

·           Convex Decomposition Code

这款物理引擎的历史也比较久了,但似乎国内知道的ODE的人更多一些,这款物理引擎被Nvidia的开发人员所关注(Nvidia前些时候说过,要用GPU来实现物理加速,可能会最先在这款物理引擎上实现。)

(Tip: 这款引擎是开源的,有兴趣的朋友,可以看看。)

 http://hi.baidu.com/kenshin1987/blog/item/9fe00afb8134878f9f51468c.html这篇文章给了一个简单的使用示例。

4. ODE

开源的名角,支持功能如下:

http://www.ode.org/

·           Rigid bodies with arbitrary mass distribution.

·           Joint types: ball-and-socket, hinge, slider (prismatic), hinge-2, fixed, angular motor, linear motor, universal.

·           Collision primitives: sphere, box, cylinder, capsule, plane, ray, and triangular mesh, convex.

·           Collision spaces: Quad tree, hash space, and simple.

·           Simulation method: The equations of motion are derived from a Lagrange multiplier velocity based model due to Trinkle/Stewart and Anitescu/Potra.

·           A first order integrator is being used. It's fast, but not accurate enough for quantitative engineering yet. Higher order integrators will come later.

·           Choice of time stepping methods: either the standard ``big matrix'' method or the newer iterative QuickStep method can be used.

·           Contact and friction model: This is based on the Dantzig LCP solver described by Baraff, although ODE implements a faster approximation to the Coloumb friction model.

·           Has a native C interface (even though ODE is mostly written in C++).

·           Has a C++ interface built on top of the C one.

·           Many unit tests, and more being written all the time.

·           Platform specific optimizations.

·           Other stuff I forgot to mention...

 免费、开源、授权合理,所以基本上很多游戏引擎都有绑定ODE作为物理引擎,
但是其缺点之一就是在多物件时,相较其他物理引擎,会比较慢,但是,
部分修改过的商业版本情况好一点,但却不是开源的了。
其实说穿了,同时使用图形引擎和物理引擎,就是创建在图形世界中创建一个物体,然后在物理引擎的世界里也创建同样的物体,图形引擎关注的是物体图形属性(比如material texture等),而物理引擎关注的是物体的物理属性(比如质量等);
来看代码:
world = dWorldCreate();//创建物理世界,用于模拟动力学属性
space = dHashSpaceCreate (0);//创建space,用于模拟碰撞检测之类的几何体属性;

 

//创建图形对象
if(!LoadSimpleXFile("box.x",&g_MS[0]))
return E_FAIL;
if(!LoadSimpleXFile("sphere.x",&g_MS[1]))
return E_FAIL;
//按1,或2键,创建动力学对象
bool DropBox(void);
bool DropSphere(void);
//
dBodyCreate (world); //用于模拟动力学,相当于我们物理课中的质点,没有大小
dCreateSphere (space,50);//创建几何体,用于碰撞检测
//下面将质点于几何体联系起来,这是关键
dGeomSetBody(SphereObj[curSphereNum].geom,SphereObj[curSphereNum].body);

//剩下就没什么了,都交给ode引擎去忙吧
void simLoop (int pause)
{
  dSpaceCollide (space,0,&nearCallback);
  if (!pause)
  dWorldQuickStep (world,0.05);
  
  // remove all contact joints
  dJointGroupEmpty (contactgroup);

}

这里有一个简单的学习示例http://www.cnitblog.com/updraft/articles/38375.html

 

5. TOKAMAK

最近想通了,决定开源了。支持功能如下:

http://www.tokamakphysics.com/

·           Joints

·           Friction

·           Stacking

·           Collision Detection

·           Rigid Particle

·           Breakage

这个物理引擎出现也比较早了,作者是日本人,其实日本的游戏也很发达的,能把技术共享出来,难得啊。

Tokamak是一个速度极快的物理引擎,基本上他只能被使用於Windows平台,
但是速度上的优势让他佔有一席之地,当然这引擎也是免费提供的,
Tokamak有被应用为Blitz3D的插件,所以您若是Blitz3D用户,可能见过其身影。

Tokamak适合于应用在关节比较多的角色,以及赛车之类的游戏,
在这些场合中它的表现相当流畅,并且能相当程度符合真实物理。

碰撞侦测的部分也是相当快速的一部分,而且可以处理不规则形状,
不过,必须使用SDK中附的颇为简陋的工具,缺乏可视化的方式。

总结来说,优点还是比较多的

6. Newton

更多的专注于生活中的实例模拟。

http://www.newtondynamics.com

这款物理引擎名声可能不是很响,但是功能上绝对不差。比较出名的作品有:TV3D, Quest3D

(Tip:这款引擎支持Delphi;在后面这个非官方的Wiki上,有一套不错的教程: http://walaber.com/newton_wiki/index.php?title=Main_Page )
这个物理引擎是跨Win32/Mac/Linux三个平台的,同时也有3DGameStudio插件,
在速度和功能上很不错,你也可以找到大量范例,虽然没有开源,但广为使用,
有兴趣的人,从这个开始是不错的选择,他也是OGRE游戏引擎的组件之一。

 

6. Simple Physics Engine

国产精品,支持功能如下:

http://spehome.cn/

·  使用独创的快速而稳定的Tri-Mesh碰撞检测算法,使载入模型数据异常简单。SPE的碰撞检测系统从一开始就是针对三角形网格(Tri-Mesh)而设计,所以用户可以方便地使用mesh文件创建任意形状的刚体,SPE内部将自动处理所有工作。同时,SPE支持球和胶囊两种基本几何形状,方便用户创建粒子特效和ragdoll系统。此外,SPE支持一定条件下的连续碰撞检测,可以正确地处理大多数情况下的高速运动物体。

·  碰撞信息分析。SPE对碰撞检测系统产生的数据进行智能化分析,为碰撞反应计算提供更可靠更正确的原始数据,极大地提高了系统的稳定性。

·  稳定的碰撞与接触解决系统。从1.5版开始,SPE采用全新的解决算法,更正确地计算摩擦与反弹,而且更稳定。

·  SPE提供一种稳定的基本Joint功能,支持最大距离、弹性系数以及破坏力等参数的配置,用户可以使用它方便地创建各种其他类型的Joint。

·  实时刚体破碎。(Beta)。SPE提供“形状操作”的功能,任何模型均可被一组平面或另一个模型切成小块,SPE生成的模型中包括用于区分原始表面与切面的属性信息,方便用户更合理地渲染出新的形状。目前,可破坏刚体的API已经开放。

 

·  高并行计算。SPE已经完成了多线程化以充分利用多核心CPU的性能. 90%以上的计算任务都可均匀地分配到任意数量的线程中去. 与单线程相比,双线程至少能提供60%的性能提升,而四线程可以带来150%以上的性能提升。使用SPEWorld::SetNumThreads( )即可在任何时候开启多线程计算。

·  简单易用而人性化的接口,极大地降低了SPE与其他软件系统结合的难度,使用户在瞬间即可建立一个具有真实物理属性的世界。

·  更多的功能正在不断开发中……

呵呵,国人做的一款物理引擎,关注….

 

 

你可能感兴趣的:(游戏开发)