Notifications
Article
Unity中的Havok物理引擎
Updated a month ago
2.2 K
8
在今年的游戏开发者大会2019(GDC)上,我们宣布将Havok物理引擎加入到Unity中,在Package Manager包管理器上发布其预览版本包,这意味着所有Unity用户都能使用起这款著名的物理引擎。在当今主机世代中,Havok驱动了超过一半的顶尖游戏,出色地满足了用户的物理模拟需求。
作者:Shawn McClelland,2019年11月6日
原文链接:https://blogs.unity3d.com/2019/11/06/havok-physics-in-unity/

数据合作

当我们首次推出面向数据技术栈(DOTS),试图定义物理模拟的未来时,我们决定找寻一个有相同核心理念和价值观的伙伴。我们与Havok的合作可以让DOTS仅用C#语言就能表现出高度优化后的物理模拟,让Unity的物理引擎的泛用性与性能更上一层楼。同时,部分用户对物理模拟的需求比较复杂,需要一个顶尖的物理引擎。为此,我们认为Havok可以满足这些高端的模拟需求,将其整合到Unity中是一项明智之举。
大家可能会问:“行吧,但是为什么要加入两个物理系统,不做成一个?”我们非常了解用户们会有各式各样的使用方法,两个物理系统可以让用户根据需求自己选择。一般情况下,Unity的物理引擎可满足需求,而部分用户则希望能用到Havok物理引擎的优势和工作流。说到底,并没有什么正确或错误的选择,我们将在下文中继续讨论。用户其实可以在两种解算器之间自由切换,无需重新编写所有的内容。

整合后的Havok物理引擎


性能

整合到Unity中的Havok物理引擎使用了和Unity物理引擎相同的C# DOTS框架,并由原生C++语言编写的闭源私有Havok物理引擎支持。通过几个经典游戏的洗礼,Havok物理引擎已经有了极大的优化。核心算法打磨多年,而多种自动缓存策略(包括非互动对象的休眠)会将CPU的资源用到刀刃上。

行为

Havok物理引擎极具耐用性,可用于处理包含许多物理互动的复杂场景,满足大部分游戏在动态场景上的性能需求。Havok在与许多行业伙伴超过20年的合作中,遇到了许多实时物理引擎模拟中的难题,不仅解决了这些问题,还在不停地针对其进行迭代。
本次合作可让我们有更稳定的物理刚体堆栈,刚体快速移动时的瑕疵会更小,尤其是当碰撞几何形未经优化,我们可以得到更可控的行为。
Havok物理引擎可缓存不同的状态信息,表现出近乎智能的优化,并可在规模庞大的游戏中(如开放世界)实现极佳的性能。Havok还具备一种先进的摩擦力模型,可更好地处理互相接触的对象与近乎无限的堆栈,提供更多的稳定性。
Unity物理引擎(上)在单个帧中试图解决静态/动态的互相接触刚体,而Havok物理引擎(下)可在几帧中顺滑地解决整个设置。

可视化与调试

Havok Visual Debugger(VDB;Havok图像调试)应用是一款极具耐用性的调试工具。它可通过TCP/IP协议连接到应用上,从远程诊断出复杂的行为、性能或奔溃问题。当连接到网络时,应用中将显示出一个功能菜单,使用者可以根据需要解决的问题来打开/关闭某些功能。在一定的设置下,应用还可以为连接上的VDB用户创建一个服务器,提供必要信息。
在每个由Havok物理引擎驱动的游戏上,图像调试工具一直是开发团队使用的重要工具。使用者可以选择性地激活模组化的窗口,并且还能:
  • 在模拟中暂停并回滚查看前边的物理互动
  • 同时在图像和文本中查看性能数据
  • 查看世界中组成刚体的碰撞体
  • 查看刚体之间的关节和接触
  • 可视化刚体的长期动作路径
  • 查看动态刚体的激活(停用)状态
  • 查看模拟热力图,精确找到性能耗费巨大的区域,立即完成优化的第一步
  • 直接与物理模拟互动
VDB使用者还可以记录、保存和加载前一次模拟的截图,用于审查。在调试复杂的物理场景时,这些截图作为外部支援,可为开发者提供近乎无价的信息资源。

两个物理引擎,一种数据格式

正如上文中提到了,我们在开始开发DOTS物理时,一个关键目标便是使用一种单一的数据表达,在任何模拟后端都能使用。有了统一的编辑器数据布局,开发者们可编写未经模拟后端识别的工具、游戏代码或其它系统。我们希望将主动权归还给创作者们,让创作者们无需重编任何内容便能使用合适的模拟后端。下方图标展示了数据布局模型。
如上图所示,数据可直接从编写阶段流入到模拟系统中。在最底层,我们将编写的数据抽象化处理,让其变为未经系统识别的状态,依然能在两个模拟后端上构建出相同的工具和用户体验。接着数据通过转换管线流入Entity Data(实体数据)。Entity Data中我们有包括PhysicsCollider、PhysicsVelocity、PhysicsMass、PhysicsDamping、PhysicsGravityFactor及PhysicsCustomTags运行时组件。这些组件接着会传入Build Physics World(构建物理世界)系统,在这第二次转换中,将针对连续存储的优化数据转换为针对随机存储的优化数据。然后构建系统会生成一个Collision World(碰撞体世界),用于查询当前时间点上世界的状态,以及一个Dynamic World(动态世界),它含有现time step(时步)上模拟物理的所有信息。而将这些世界分离后,我们可以在Step Physics World更新Dynamic World数据的同时,执行Collision World中的查询操作,最大化利用多线程工作。
在图表中还可以看到,Unity物理引擎与Havok物理引擎在整个管线中使用的是同样的数据。这样一来,用户不仅可以使用统一的内容管线,还能使用系统未识别的数据协议和API操作面板。在两种后端间切换将不费吹灰之力。
在我们推出DOTS物理引擎架构时,想让Unity在未来可以支持许多的模拟后端,满足各种不同的使用需求,同时在这些物理系统中保持一种统一的创作体验。

开始使用Havok物理引擎吧

如果你坚持到了这里,可能会想:“好啦!这些功能看上去确实很不错。那么,不知在哪里可以买得到呢?”好消息是你可以在Unity包管理器中(Unity 2019.1以后的版本)下载Havok物理引擎整合包的预览版。也可以先来阅读Havok Physics for Unity(Unity的Havok物理引擎)说明文件。
如果你想与我们团队联系,或者提出什么问题,或展示下你用Havok物理引擎制作的炫酷玩意儿,可以来我们新的DOTS物理引擎论坛参与讨论!

开发过程中遇到问题?打开Unity Connect App或者Unity编辑器内置群聊工具 在“技术交流”群聊组中提问
Tags:
Unity China
710
Comments
CGBull
a month ago
Talk Artist
Destruction和Cloth有Roadmap嘛😋
1
N.K
a month ago
正式版要收费吗
0
s
shuisheng
a month ago
那么,不知什么时候可以用的到正式版呢
0
ZQY
a month ago
Havok提供确定性物理计算吗?
0
k
kuklyk
a month ago
叭错叭错 快点出吧
0