Unity 2022.1版本 | Physics功能更新,让机器人感知更复杂的环境

来源:Unity官方平台


使用新的反向动力学力传感器来模拟可感知环境的复杂机器人。在最新的 Unity 2022.1 版本里,我们更新了 Physics Debugger,将助你更好地分析力的相互作用。此外,插值、批量查询等功能的性能也得到了改进。

物理调试器(Physics Debugger)改进

物理调试器(Physics Debugger)是了解物理引擎内部运作的重要工具,也是观察项目内特殊物理行为的主要手段。一个好的调试器在编写逼真、现代、丰富的物理模拟上起着关键作用。基于这点考虑,我们重新设计了调试器的用户界面(UI)并增加了一些有趣的功能。

为了在相同的空间内容纳更多的信息,我们将各个属性分为几组标签,并且还添加了几组新的检测属性。

Unity 2022.1版本 | Physics功能更新,让机器人感知更复杂的环境

此前,Rigidbody 和 ArticulationBody 组件在检视器内包含有一个可折叠的“Info”部分,它展开后会显示当前线性矢量等其他信息。但这样导致编辑器的整体性能出现了明显的下降。在以前,比较多个运动物体的参数很复杂,你需要同时打开两个检视器面板。为了解决这些问题,我们把所有的属性都转移到了物理调试器(Physics Debugger)窗口的“Info”选项卡上,这里会显示每个被选中对象的属性,让你可以轻松地进行并列比较。

Unity 2022.1版本 | Physics功能更新,让机器人感知更复杂的环境

工具现在支持可视化物体的接触点、接触法线和间距。

Unity 2022.1版本 | Physics功能更新,让机器人感知更复杂的环境

类似 Physics.Raycast 及 Physics.CastSphere 等 Physics 查询指令通常会被用于编写自定义的角色或载具控制器等物理行为。这些指令并不能在调试器中出现,调试起来也很棘手。为了应对这个问题,新版本的调试器支持有选择地可视化物理模拟的查询指令。

Unity 2022.1版本 | Physics功能更新,让机器人感知更复杂的环境

反向动力学(Inverse dynamics)

到目前为止,Unity 工具只支持正向动力学:给定一组物体及其作用力来计算其运动轨迹。这种方法固然非常有用,但我们想进一步扩展机器人工具箱的功能。因此,我们为 Unity 2022.1 添加了对反向动力学的支持:给定一个物体及其运动轨迹,模拟计算出作用力。

我们将在以后的数个版本持续迭代、完善该功能。在 Unity 2022.1 中,我们公开了一组函数用于计算当前作用于 ArticulationBodies 的力的组成,在这些力抵消之后物体才能向着预定的轨迹运动。我们会在后续版本中继续披露更多有趣的概念,比如抵消解算器冲力的关节力。

需要特别指出,新功能可以:

  • 取得施动者当前施加给某物体的力。它可以表明某个驱动力向目标运动的强度。它的大小取决于驱动力的刚度(stiffness)和阻尼(damping),以及当前的目标位置和目标速度;
  • 取得抵消物体所受重力、科里奥利力(Coriolis force)和离心力所需的关节力;
  • 取得物体达到特定加速度所需的关节力。

Unity 2022.1版本 | Physics功能更新,让机器人感知更复杂的环境

插值与外推法

Rigidbody 同时使用插值和外推法进行较低频率的模拟,形成一种平滑运动的表象。引擎内部会在每次更新(update)计算变换(transform)的位置来实现运动。在插值时,物体前两帧的姿势会被用于计算当前帧的姿势。在外推法时,仅上一帧的姿势和矢量会被用于计算。但由于它轻量的特点,我们不会将这些姿势传回物理引擎。它们只会被传给物理引擎以外的系统(比如图形和动画)。正因为如此,一条投射出去的光线并不能检测到插值姿态下的物体。

为了不让物理引擎注意到变换的改变,我们的机制是在写入姿势前调用 Physics.SyncTransforms() 来调取每次更新,再调用一个内部方法来清除 Physics 的所有变换更新。这造成了两类问题:

  • 如果一个场景至少有一个插值物体,那么每次更新时,所有物理组件的变换改变都会与物理引擎同步(尽管这些改动主要会在每次 FixedUpdate 中被处理);
  • 如果一个带插值 Rigidbody 组件的变换被改变,则该对象的插值就会中断,因为用户作出的变换修改被传到了物理引擎,并改变了最终的模拟姿势(姿势并不会被单独存储,而是会取代物理引擎当前的姿势)。

为了解决这些问题,我们特意将插值代码修改成不在每一帧上同步所有变换。这个改动显著提高了性能;新的插值代码比以前运行得更快(与场景复杂度相关)。

来自用户反馈的更新

我们日常会与用户讨论各种实验性质的物理模拟技术,本次新版本中应用的部分改动就源于我们的讨论:

许多项目,特别是大型项目,经常会设立多层 GameObject,所以描述层与层关系以及两者物理接触的矩阵也会变得相当复杂。为了方便使用,我们在这个版本中会高亮显示当前选中的行和列。

Unity 2022.1版本 | Physics功能更新,让机器人感知更复杂的环境

关节是连接两个刚体的部位,它确定了刚体相互间运动的范围。自 Unity 2020.2 起,关节支持将一个 Rigidbody 连接到一个 ArticulationBody 上。为此,每个 Joint 类都设立了一个额外属性,属性可在检视器中查看。该属性无法连接到 Rigidbody 和 ArticulationBody,当一个组件已经设定完成,你就没必要再用额外的两个选项来占用空间。现在,只有设置好的属性会被显示出来。

Joint 类设立的额外属性:
https://docs.unity3d.com/2022.1/Documentation/ScriptReference/Joint-conn...

Unity 2022.1版本 | Physics功能更新,让机器人感知更复杂的环境

纯运动刚体(kinematic Rigidbody)是一种特殊的物体,它可以对其他物体施加力,但又不受这些物体的影响。这时,它类似于一个静态但会移动的碰撞体。纯运动刚体的典型用法包括角色控制器、动画驱动的物理模拟、虚拟现实(VR)的手腕模拟等等。你可以通过设置一个运动目标来控制刚体,刚体会在一张模拟帧中完成这个运动目标。它与静态碰撞体的主要区别在于,纯运动目标并非以瞬时的传送(或姿势改变)达成的,而是通过计算某帧达成目标所需的线性和角矢量并将其传给解算器。这样一来,运动就能正确地出现在矩阵中,让每一对相连关节都能做出正确的反应。在这个 Unity 版本中,我们公开了一个新方法,可在一次操作中同时设置运动目标的位置和转向。

在 Unity 2021.2 中推出的接触修改(contact modification)带有一个微观阶段(narrow phase),让你能在结算器根据接触点生成运动约束之前修改点的细节。在这个版本中,我们为护相接触物体的速度添加了新的获取器(getter),以支持更高级的用法,比如该例子中的自定义各向异性摩擦。

PhysX 更新至 4.x 系列的最新版本:4.1.2。这个小型发布只解决比较重要的 bug 和崩溃。

当一个运动体与一个碰撞体重叠时,结算器需要求出一个矫正冲力,在满足所有约束的前提下将两者分开。在引擎内部,该冲力根据接触双方的接触点求得,它是一个所有接触点返回而来的总值。在这个版本中,我们公开了 ContactPoint 结构的一个新‍属性,让你能检索每个接触点上的冲力。

总值:
https://docs.unity3d.com/ScriptReference/Collision-impulse.html

ContactPoint 结构的新属性:
https://docs.unity3d.com/2022.1/Documentation/ScriptReference/ContactPoi...

我们正在密切关注关于 ArticulationBody 组件的社区反馈。为了方便创建和调整细微的机器人部件行为,我们会在屏幕空间内固定关节的限制把手,以防遮挡场景内的碰撞体。

Unity 2022.1版本 | Physics功能更新,让机器人感知更复杂的环境

我们从 Unity 黑客周获得灵感并推出了物理模拟的批处理查询,它具备最基本的功能、可支持特定的几种用法。我们将继续开发并推出更多新功能、支持更多用法,比如更复杂的线程模式、更多多样的查询类型。在这个特别的版本里,批量查询可以在任意物理模拟场景下运行,且我们还增加了一种新的批量查询(Physics.ClosestPointCommand)。

Physics.ClosestPointCommand:
https://docs.unity3d.com/2022.1/Documentation/ScriptReference/ClosestPoi...

一块模型网格若想应用 MeshCollider,网格本身首先须被烘焙完成。烘焙是一个极度耗费系统资源的过程,它会生成碰撞检测时所用到的空间搜索结构。通常情况下,每次 MeshCollider 的网格属性被改变时,烘焙都会在后台完成,但整个过程会运行在主线程上,占用所有资源直至完成。自 Unity 2019.3 起,我们就公开了一个线程安全的方法,让你能随时在主线程之外进行烘焙。这样做的目的是为了让程序化生成的网格能更为复杂,用 Job 来生成模型和烘焙网格可以大大提高线程的利用率。但这个功能有一个局限,它只支持默认烹饪选项下的烘焙。在新版本里,我们公开了一个新的 Physics.BakeMesh 变量,让功能支持用任意烹饪选项进行烘焙。

希望新的反向动力学 API 和改版后的 Physics Debugger 能够帮助大家顺利创作出的内容,欢迎通过网页或者 Hub 下载 Unity 2022.1。

下载 Unity 2022.1:
https://unity.cn/releases

最新文章