Backends

  • Backends只在Obi 5.5.及以上版本可用。以前的版本只有一个后端可用(Oni),所以在求解器中没有后端下拉。
  • Backends是Solver用来推进模拟的实际物理引擎。不同的Backends可能有不同的平台兼容性,性能和能力配置文件。虽然你可以为场景中的每个Solver选择不同的后端,但大多数情况下,还是希望所有的Solver使用同一个后端。要为Solver选择不同的Backends,请使用Solver的Inspector中的 "Backends "下拉菜单。

Oni

  • Oni是自Obi 2.x以来使用的 "经典 "Backends。它是一个用C++11编写的本地库,为每个平台预编译。因此,它只支持少数几个平台。Windows, Mac, Linux, Android, iOS. 它是一个完全基于CPU的后端,大量使用多线程和SIMD固有技术(单指令,多数据)。它可以用于在各种设备上进行小到中规模的仿真。
  • 当对Oni支持的仿真进行剖析时,将ObiProfiler组件添加到你的Solver中是很有用的。这将在游戏模式下,在游戏视图上覆盖剖析数据。
  • 请注意,在编辑中进行剖析对性能有明显的影响。

Burst

  • Burst是Obi 5.5中引入的一个新的Backends。它完全用高性能的C#编写,利用Unity的Burst编译器和作业系统。它支持所有可以运行作业的平台,并且Burst编译器可以为之编译。和Oni一样,它也是完全基于CPU的,并且大量使用多线程和SIMD(分别得益于作业系统和Burst)它的性能与Oni非常相似。
  • 使用Burst后台需要安装以下Unity包
    Burst 1.3.3 or newer
    Collections 0.8.0-preview 5 or newer
    Mathematics 1.0.1 or newer
    Jobs 0.2.9-preview.15 or newer

Updaters

  • ObiUpdater是一个组件,它可以在Unity帧期间的某一点推进一个或多个Solver的模拟。很多时候,希望在FixedUpdate()期间同步更新Solver模拟与物理学的其他部分。有时,你可能想在骨骼动画后,或在LateUpdate()期间更新物理学。你甚至可能想编写自己的更新器组件,以获得对何时以及如何更新模拟的完全控制。
  • 在你的场景中可以有多个Solver,但是你必须避免同一个Solver被多个Updaters引用,因为这将会在每一帧中更新该Solver一次以上,导致不可预测的结果。此外,请记住,一个没有被任何Updaters引用的Solver将不会被更新其模拟。

Obi Fixed Updater

  • Obi Fixed Updater将在FixedUpdate()期间更新模拟。这是最正确的物理方法。
    Solvers
  • 该Updater勾选的Solvers列表
    Substep Unity physics
  • 当使用超过1个子步骤,并且需要与Unity刚体精确交互(通过碰撞或动态附加物)时,启用此功能。
    Substeps
  • Updater可以将每一个物理步骤砍成多个更小的子步。例如,如果Unity的固定时间步长设置为0.02,而Updater中的子步长数量设置为4,那么每个子步长将使模拟提前0.02/4=0.005秒。像这样以较小的时间块推进模拟,将大大提高精度,但代价是性能。碰撞检测仍将在每一步中只执行一次,并在所有子步中进行摊销。
  • 调整子步骤以控制整体模拟精度。
    Obi Late Fixed Updater
  • Late Fixed Updater将在WaitForFixedUpdate()之后更新模拟,一旦所有组件的FixedUpdate()被调用,并且所有设置为更新物理的Animators 都已更新。在设置为更新物理学的Animators 推进了动画之后,使用它来更新模拟。
  • 这是一种你在大多数时候都会想用来更新角色服装的更新器。只要确保你的角色的Animators 设置为更新物理学就可以了
    Obi Late Updater
  • 这个Updater会在LateUpdate()期间提前模拟。这是很不物理的,因为它引入了一个可变的时间步长。只有当你不能以固定的频率更新模拟时才使用它。有时对于低质量的角色服装,或者不需要任何物理精度的辅助视觉效果很有用。

Simulation

  • 本部分并不是使用Obi所必需的。然而,对Obi如何执行模拟有更深入的了解,将有助于你在调整参数时做出明智的决定,从而更有效地使用它。
  • Obi将所有的物理模拟建模为一组粒子和约束条件。粒子是自由移动的物质块,而约束条件是控制其行为的规则。
  • 每一个约束条件都需要一组粒子和关于 "外部 "世界的信息作为输入(碰撞器、刚体、风、大气压等),并修改粒子的位置,使它们满足某个条件。例如,一些约束条件可能会试图让两个粒子之间保持一定的距离(距离约束)。其他的约束条件会试图确保粒子不能进入碰撞器内部(碰撞约束条件),或者将粒子放置在与其周围气流一致的位置(空气动力学约束条件)。
  • Obi使用的是一种被称为基于位置的动力学的模拟范式,简称PBD。在PBD中,力和速度在模拟中的作用有些次要,而是使用位置。
    Position-based dynamics
  • 在每个模拟步骤的开始,Obi根据粒子的速度和时间步长,将每个粒子从当前位置移动到一个新的暂定位置。这个暂定位置可能违反了许多约束条件:它可能在一个对撞机内,或者远离与它相连的其他粒子的距离约束。

    一个粒子从它的起始位置(绿色)推进到它的暂定位置(红色),仅用粒子速度计算。遗憾的是,这个暂定位置与一个对撞机相交,所以我们不能立即将粒子推进到那里。
  • 所以,需要调整这个位置,使其满足影响该粒子的所有约束条件。通过调整暂定位置,我们也在间接地调整粒子的速度。

    暂时的位置(红色)被修正,所以它满足碰撞约束:没有粒子可以在对撞机内。
  • 如果我们每一帧都重复这个过程–预测暂定位置,修正暂定位置,前进到修正位置–,我们就会得到这样的东西。
    只有绿色的位置永远呈现在屏幕上,所以我们看到的是一个遵循物理规律的粒子的平滑动画。
  • 有时,执行一个约束条件会违反另一个约束条件,这就很难找到满足所有约束条件的新位置。Obi将尝试以迭代的方式找到一个满足所有约束条件的全局解决方案。每一次迭代,我们都会得到一个更好的解决方案,更接近于同时满足所有约束条件。
  • Obi有两种方式可以对所有约束进行迭代:顺序或并行方式。在顺序模式下,每个约束都会被评估,并立即应用由此产生的对粒子位置的调整,然后再推进到下一个约束。正因为如此,约束的迭代顺序对最终结果有轻微影响。在并行模式下,所有约束都在第一道中进行评估。然后在第二道中,对每个粒子的调整进行平均和应用。正因为如此,并行模式与顺序无关,然而它接近地真解的速度更慢。
  • 在下面的动画中,三个粒子(A、B和C)产生了两个碰撞约束,然后得到解决。这一切都发生在一个模拟步骤中。
    在顺序模式下解决了两个碰撞约束。

    在并行模式下解决两个碰撞约束。注意,需要6次并行迭代才能达到我们只用3次顺序迭代就能得到的相同结果。
  • 每一次额外的迭代都会让你的模拟更接近地面真相,但也会略微削弱性能。因此,迭代次数是性能–少量迭代–和质量–多次迭代–之间的一个滑块。
  • 在大多数情况下,较大的模拟(那些有更多约束条件的模拟,如长/高分辨率的绳索)需要更多的迭代量。
  • 迭代次数不够高,几乎都会表现为某种不需要的软度/弹性,这取决于哪些约束条件不能完全满足。
    如果不能满足距离限制,则为弹力布/杆。
    如果不能满足密度限制,则为弹性的、可压缩的流体。
    如果碰撞约束无法满足,则为弱的、软的碰撞,等等。
  • 一旦这一步的所有迭代都进行了,粒子位置也调整好了,就会用位置微分计算出一个新的速度,然后就可以开始新的模拟步骤。下面是一个动画,展示了多个步骤的完整过程。

  • 只有绿色的位置是在每一步结束时呈现的。红色的位置是暂定的位置,最初只使用步骤开始时的粒子速度计算,然后在每一步的多次迭代中进行细化。只有在我们完成迭代之后,粒子才能移动到暂定的–现在已经调整好的–最终位置。
  • 减少我们需要的迭代量以确保约束条件得到满足的一个非常有效的方法是减少模拟时间步长。这可以通过增加我们固定更新器中的子步数,或者减少Unity的ixed timestep(在ProjectSettings->Time中找到)来实现。直观地说,在推进模拟时采取较小的步长会使每一步开始时计算的暂定位置更接近我们开始的有效位置。这样一来,我们需要更少的迭代来到达新的有效位置。
  • 请注意,减少时步/增加子步的数量也有相关的成本。但在同样的性能成本下,通过减少时间步长得到的质量改进比保持相同的时间步长和使用更多的迭代要大。

    时间步长为0.1毫秒,每步迭代1次,绳子的伸缩性很强。

    将迭代次数增加到10次,使其保持紧绷,但会抑制动态,降低性能。

    0.01毫秒的时间步长,只需一次迭代就能消除拉伸,实现更生动的动态。
  • 与其他引擎不同的是,Obi允许你单独设置每一种约束类型所花费的迭代量。每一个都会以不同的方式影响模拟,这取决于特定类型的约束的作用,所以你可以真正微调你的模拟。
    Collision constraints
  • 碰撞约束尽量让粒子在碰撞器之外。当每个粒子有多个碰撞时,高迭代次数将产生更强大的碰撞检测。
    Particle collision constraints
  • 与碰撞约束相同,但当碰撞发生在粒子之间时。
    Distance constraints
  • 每个距离约束都试图使两个粒子保持在固定的距离上。这些是负责布和绳索的弹性。高迭代次数会让它们达到更高的刚度,所以你的绳索/布匹的伸缩性会降低。
    Pin constraints
  • 销钉约束将对粒子和刚体施加力,使它们保持相对位置。它们是由动态附件创建和使用的。高迭代次数将减少销钉位置的漂移量,使附件更加坚固。
    Volume constraints
  • 每个体积约束都需要一组定位在网格顶点的粒子,并试图保持网格体积。用来给布充气,制造气球。高迭代次数可以让气球达到更高的压力,更容易保持形状。
    Aerodynamic constraints
  • 这是唯一一种没有迭代次数的约束类型。它们总是只应用一次,这就够了。用于模拟风。
    Bend constraints
  • 每个弯曲约束将对三个颗粒进行工作,试图让它们在一条直线上。这些用于使布和绳索抗弯曲。与距离约束一样,高迭代次数将使它们达到更高的刚度。
    Tether constraints
  • 这些约束是用来减少布的拉伸,当增加距离约束迭代量会太贵。一般来说1-4次迭代就可以满足系绳约束的要求。
    Skin constraints
  • 皮肤约束用于使骨骼动画布接近其皮肤形状。它们主要用于角色服装。一般来说,皮肤约束的迭代1-2次就够了。
    Density constraints
  • 每个密度约束都试图保持粒子周围的质量量不变。这将推出粒子太近(因为这会增加质量),并拉进粒子去(这将导致表面张力效应)。用于模拟流体。高迭代次数会使流体更不可压缩,所以它的行为会更不像果冻。

Shape matching constraints

  • 每个形状匹配约束都会记录一组粒子的静止形状,然后调整它们的位置,使它们尽可能地保持这个形状。这些都是软体使用的。

  • 从本节中得到的启示信息。如果你的绳子/布/软体/液体太有伸缩性或弹性,应该尝试:
    增加更新器中子步数的数量
    增加距离约束的迭代量。
    减少Unity的固定时间步数。

【Unity】Obi插件系列(二)—— Backends、Updaters、Simulation相关推荐

  1. 【Unity】Obi插件系列(一)—— 总览、Actors与Solvers

    链接:https://pan.baidu.com/s/1Q9OiM_nwMyeApEhEzsCemw 提取码:1234 Obi框架 Obi是一个基于粒子的Unity物理学插件的集合.Obi的内容一切都 ...

  2. 【开发者portal在线开发插件系列二】多条上下行消息(messageId的使用)

    前言和基本操作请参考[开发者portal在线开发插件系列一]profile和基本上下行消息,此处不再复述,没操作过的小伙伴一定要先去看看哦~ 话不多说,开始今天的演(表)示(演) 场景说明: 假设一: ...

  3. Unity Obi插件修改到支持URP

    Obi插件修改适应URP 属性 值 Unity版本 2021.18f1c1 Obi 版本 Obi Fluid v6.43 系统版本 Win10 64位 16G内存 操作 找到水的发射器并修改shade ...

  4. 【Unity】Obi插件系列(七)—— Obi Emitters

    Emitters Emitters器,顾名思义,发射流体粒子到场景中.它们类似于Unity的内置粒子发射器,但它们并不发射常规粒子.取而代之的是,它们发射的是Obi粒子,这些粒子可以相互作用,也可以与 ...

  5. 【Unity】Obi插件系列(六)—— Obi Cloth

    Cloth blueprints 有3种不同的Cloth blueprints类型,每一种都是专门设计的.每一种都有相匹配的Actor类型 cloth:普通布 不能撕裂,不能与动画网格(animate ...

  6. 【Unity】Obi插件系列(六)——Obi Rope

    Rope/rod blueprints Rope: Ropes是通过使用距离和弯曲约束将粒子链起来建立的.由于常规粒子没有方向性(只有位置),因此无法模拟扭转效应,而且绳索无法保持其静止形状.然而,与 ...

  7. 【Unity】Obi插件系列(三)—— Collisions

    Collisions 布料与地形和一些箱子碰撞. 大多数时候,我们会希望粒子能够与场景中的其他元素碰撞并做出反应:墙壁.地板.箱子什么的.它们也可以互相碰撞.这两种类型的碰撞(对碰撞器和对其他粒子)可 ...

  8. 【Unity】Obi插件系列(四)—— Distance Fields、Particle attachments、Particle rendering

    Distance Fields 距离场 距离场是一种特殊的碰撞基元,可以和Obi一起使用. 每当一个Obi粒子靠近一个collider时它必须计算出到collider表面的最短距离, 以确定它是否会与 ...

  9. 【Unity】Obi插件系列(八)—— Obi Softbody

    Softbody blueprints 有2种不同的软体蓝图.这两种类型的蓝图都可以赋给ObiSoftbody actor Surface softbody:会在网格顶点位置随机分布粒子,确保它们不重 ...

最新文章

  1. 工作之余如何提高个人技术水平
  2. 使用 Mashups4JSF 生成和消费 Mashup Feed
  3. java添加容器_如何为Java应用程序构建docker容器
  4. 机器学习ai选股_机器学习技术能够有效用于选股吗?(下)
  5. 泰山OFFICE适配龙芯新架构(loongarch64)UOS初步完成
  6. PHP实现MySQL并发查询
  7. Internet Download Manager v6.41 Build 2
  8. WMS仓储条码管理系统解决方案
  9. 图片按照宽度等比例缩放
  10. Python 处理 PDF 的神器 -- PyMuPDF(下)
  11. win10怎么更新显卡驱动_win10系统AMD显卡驱动安装失败的解决方法
  12. GIS实验之制作核密度分析图
  13. 天地图-第五篇-覆盖物
  14. Android UI详解之布局管理器(一)
  15. 初学乍练redis:分片与集群
  16. 性能优化检测Instruments-time profile的使用
  17. 微信二维码扫一扫的实现
  18. BIM在工程中的20种典型功能
  19. 不仅是工程学!人类认知偏差导致的12个AI研究盲区
  20. 微信小程序资料收集(一)

热门文章

  1. 华为RH2288V3服务器硬盘大于2T的处理办法
  2. js和jsp互相传值的问题解决办法
  3. 背着房贷被裁员是一种什么样的体验?
  4. 樊登读书赋能读后感_樊登读书会本周末视频解读新书:《赋能》突破深井,打造优质团队...
  5. 06-----the inferior stopped because it triggered an exception
  6. VSCode 前端插件推荐
  7. BoardCast BroadcastReceiver 基础
  8. ios appstore 审核 Guideline 5.2.2 资讯类APP解决方案
  9. Python中的迭代是什么意思?
  10. Kubernetes 调度 Node污点/容忍