本篇文章参考自Obi官方文档

🎲Obi Rope Blueprint

🎮Rope Blueprint简介

Rope Blueprint根据官方的说法就是使用距离(Distance)和弯曲约束(Bend Constraints)通过连接粒子建立的。由于一般情况下粒子没有方向(只有距离),因此无法模拟扭转效果,并且绳索不能保持其静止的形状。绳索能扭转/分裂并且运行时长度可变,使用方法会在下方Obi Rope讲到。

另外在官方文档下还有一个Rod Blueprints这个就不多做介绍了简单的说一下就是使用伸缩(Stretch)和弯曲约束通(Bend Constraints)过连接有向粒子建立的,这个比绳索要更复杂,可以模拟弯曲静止的效果,所以叫杆,但是这个比起绳子(Rope Blueprint)来说不可以撕裂/拆分,长度也不能在运行时更改,所以一般用来做弹簧,天线等。
蓝色是杆子,红色是绳子

🎮Rope Blueprint属性

如果要创建一个基础的Rope Blueprint/Rod Blueprint,通过在Project窗口右击→Create→Obi→Rope blueprint/Rod blueprint.
1

Thinckness(厚度)

生成绳子的粒子半径

Resolution(分辨率)

单位长度粒子的密度。值为1 值为0.5 的话就会比较稀疏不会产生接触,值小于0.5 的话会产生很大的间隔,这会对碰撞检测产生很大的影响,但是优点是性能很好。
2

在内部,用于根据分辨率计算绳索中粒子数量的公式为 particleCount = ropeLength / ropeThickness * resolution.
如果在运行时创建绳索,可以使用以下公式计算所需的分辨率,以获得绳索中特定数量的粒子 resolution = particleCount / (ropeLength / ropeThickness)

Pooled Particles(汇集粒子,仅限Rope Blueprint)

这个我个人的理解就是额外的粒子,比如在你做的一个吊机,他的绳子是可以伸缩的,当你增加绳子长度而产生额外粒子的时候就是从这个里面增加的,如果你只是设置了10那么等你去增加绳子长度的时候只能增加一点,加完10个粒子的绳子长度后绳子长度就不会改变了。所以如果绳子静止的情况下可以改为0就行,需要做缩放的绳子效果时就可以把这个值给高一点。

🎲Obi Solver

🎮Obi Solver简介

Obi Solver是Obi中最重要的组件,它执行模拟粒子物理,和执行约束的组件。关于这个有3点比较重要:
他们可以添加到场景中的任何GameObject中,并且可以有多个Obi Solver

每一个Actor必须在Obi Solver的层级下才可以执行,这些Actor物理模拟的具体行为和组件比如下面会提到的Obi Rope,或者布料(Obi Cloth)这些都是Obi Actor的派生类。

不同的Obi Solver相互独立,所以他们的Actor不会相互碰撞,只有同一Obi Solver下的Actor才会对彼此作出反应

个人理解Obi Solver就像是一个房子里面住的人就是Actor一栋楼里面可以有多个房子,每个房子互不影响。

🎮Obi Solver属性

如果要创建一个Obi Solver可以在Hierarchy里右击→3D Object→Obi→Obi Solver.
3

Backend(后台)

这个算是一个物理效果实现的底层,不同的Backend有不同的平台兼容性,性能和功能。场景中的每个Obi Solver都可以选择不同的Backedn属性,但是大部分情况下还是保持一致最好。目前的话有两个一个是Oni一个是Burst.

Oni

是obi一个比较早的后台,用的是c++编写的本地库,所有大部分平台都支持,他是完全基于cpu的后台使用了多线程和单指令多数据的内嵌函数。

Burst

这个是Obi 5.5后的新有的后台,它是由睾贵的C#编写,用的是unity的Burst编译器和作业系统,它支持所有可以运行作业和Burst编译器可以编译的平台。与Oni一样,它完全基于CPU,并大量使用多线程和SIMD。使用Burst的时候大部分情况下新能要比Oni强,所以一般情况下Burst的优先级要比Oni高。

当然使用Burst的话要导入一些包

Burst 1.3.3 或以上
Collections 0.8.0-preview 5 或以上
Mathematics 1.0.1 或以上
Jobs 0.2.9-preview.15 或以上

上面的包 Burst应该是自带,Collectionsll在unity自带的包里面也有导入就行 Mathematics也是自带,最后Jobs因为是预览版本所以要用链接导入(unity 2021以及后的版本)com.unity.jobs

6

请注意,为了使用Burst后端编辑器时的正常性能,必须启用Burst编译并禁用安全检查,作业调试器和作业泄漏检测

4 5

另外,请记住Burst默认情况下在编辑器中使用异步编译。这意味着模拟的前几帧将明显较慢,因为Burst在场景运行时仍在编译作业。您可以在Jobs→Burst菜单中启用同步编译,这将强制Burst在进入播放模式之前编译所有作业。

Mode(模式)

Solver可以在2D或者3D模式下模拟,2D的话模拟仅发生在2D场景中,只会发生在XY的平面中。2D模式通常与2D对撞机的使用相结合。但是,为了方便起见,你也3D 2D一起使用。

Interpolation(插值)

用于渲染粒子的插值模式。None计算速度更快,但是Interpolate会在粒子的实际物理位置和渲染位置之间插入1帧的延迟。Interpolate在慢动作效果的时候会更好,因为他能在unity的Timescale<1时避免卡顿。

Gravity Space(重力空间)

是在Solver的局部空间(Self)还是在世界空间(World)中应用重力,如果设为Self,重力方向将和Solver一起旋转。

Gravity(重力)

Solver重力的方向和大小,以Slover的局部空间表示

Sleep Threshold(休眠阈值)

任速度能低于该值的粒子都将被冻结在当前位置。一般来说默认值就够了。

Damping(阻尼)

应用于粒子速度的速度阻尼。增加它以减少它们的动能。下图分别为0.3阻尼和1阻尼时的效果
阻尼为0.3时 阻尼为1时

World linear Inertia Scale(世界线性惯性标度)

控制Solver变换的世界空间线性惯性应用于粒子的程度。值的范围从0(无)到1(100%)。
大概意思就是你对这个物体用的力有多少会继承到他这个Solver上,官方的说明不是很清楚这边上两组图片对比一下,前面是设为0时的状态后面是设为1的状态(注意看左边垂直的绳子的效果)
值为0时
值为1时

World Angular Inertia Scale(世界线性惯性标度)

跟前面的属性是一样的,只不过这个前面那个是线性惯性(translations)现在这个是角惯性(rotations)

Max Anisotropy(最大各向异性)

这个一般用在流体中,Obi中的流体粒子可以是椭圆形的,而不是完全的球形。这用于更好地使其形状适应所代表对象的表面,从而实现更准确的碰撞检测和更平滑的渲染。最大各向异性可以确定椭球体半径之间的最大比率,值为1将强制所有粒子为球形,值大于1的时候就会更椭圆一点
7

Simulate When Invisible(不可见模拟)

当Solver在所有相机中不可见时是否应该保持模拟。保持启用你的模拟将会不停更新,禁用当没有任何相机看到的时候就会停止更新。

Collision settings

Continuous collision detection (CCD)

碰撞检测期间用于扩展碰撞器边界框的刚体速度百分比。值为1将使用100%的速度,从而实现完全连续的碰撞检测。值为0将导致纯静态碰撞检测。

Collision margin (碰撞边距)

添加到粒子边界框(CCD扩展后)的边距,用于生成接触。粒子边界框内的任何对撞机/粒子都将被考虑用于接触生成。该值应保持相对较低。较大的值将产生更多的接触,这可以提高非常复杂场景中的鲁棒性,但会对性能产生负面影响。
8
黄色的是当前粒子位置浅黄色是下一帧粒子位置,以这两个点生产的矩形内再加上给入的数值生成的边距就是碰撞范围。

Max Depenetration (最大穿透速度)

将粒子从对撞器中弹出的最大速度(单位:米/秒)。这仅适用于已经在对撞器内开始物理步骤的粒子。较低的值将缓慢地将粒子从对撞机中取出。高值允许求解器立即取出粒子,使其“跳出”对撞机。
值为0.1时
值为10时

Shock propagation (激波传播)

值高的话将人为地增加支持其他粒子的粒子的质量。 使用它可以获得更好的堆叠稳定性。

Surface Collision Iterations (表面碰撞迭代)

优化表面碰撞所执行的最大迭代次数。

Surface collision tolerance (表面碰撞容限)

容差阈值,低于该阈值,曲面碰撞细化将停止。稍微增加一点可以帮助获得更稳定的平面碰撞。

Constraint settings(约束设置)

点击方框来启用或禁用约束。
你可以全局禁用或启用由Solver管理的所有Actor的每种约束类型。以这种方式禁用约束(与禁用单个角色的约束组件相反)将允许求解器完全跳过任何相关计算。这使您可以自定义后台执行的操作并摆脱不必要的开销。
9
ObiSolver为每种约束类型公开4个参数:
10
Enabled(约束名称旁边的复选框)
Evaluation
Iterations
SOR Factor

Enabled (启用)

这些约束是否全部更新,默认所有的约束时启用的,可以禁用一些队最终效果不重要的约束。
如果没有Actor使用,这些约束启用不会降低性能。例如,density约束只能被流体使用。所以如果没有流体生成器在你场景里,启用density约束没什么效果。

Evaluation mode (评估模式)

如何强制执行此类约束,有两种模式:

在顺序模式下,所有约束都按照创建顺序(由每个特定的ObiActor决定)进行评估,每个约束都“看到”了所有先前约束所做的调整。这确保了快速收敛,因此您的约束需要很少的迭代才能看起来很好。然而,当几个约束在争夺控制权时,它不是很稳定——它会引入抖动——所以在某些用例中,这种模式不是一个好的选择。它依赖于顺序,因此在低预算情况下(粒子数少、迭代次数少和/或时间步长大),这可能会导致粒子排列中出现可见的模式。对于那些有点技术方面的人来说,这是高斯-赛德尔型求解器。

在并行模式下,所有约束都会被评估,但它们的调整不会立即应用于粒子。相反,它们被存储、平均,然后最终结果用于调整粒子位置。即使同时应用了许多约束,这也会产生非常稳定的模拟,但由于“硬”约束收敛速度较慢,因此需要更多的迭代。它也是独立于顺序的,因此它确保了粒子排列的平滑。如果你想用高迭代次数的性能或低迭代次数的质量来换取稳定性和平滑性,请使用此模式。再次,对于技术用户来说:这是Jacobi式的解决方案。

并行模式收敛缓慢,不能保证保持动量(事物有时会获得能量)。因此,尽可能使用顺序模式,必要时使用并行模式。

下图显示了一根绳子,它已经被拉伸到超过了其静止长度,并使用了不同的距离约束评估模式。在顺序模式(左)下,由顺序相关评估引起的粒子放置中的聚集模式清晰可见。在并行模式下(右),所有粒子都均匀分布,但由于收敛速度降低,绳索下垂得更多。
11

这是另一个例子:蹦床上的一些刚体。出于可视化目的,布料张力被映射到颜色渐变。在顺序模式下(左),张力在布料表面分布不均,导致颜色图案嘈杂。在并行模式(右)下,张力均匀分布,但由于收敛速度降低,布料更有弹性。
12

Iterations (迭代)

每个子步骤应该评估这些约束多少次?高迭代次数将使模拟更接近地面真实解。如果这些约束对您的特定目的不是很重要,并且您希望获得更好的性能,请将其保持在较低水平。默认值为3。

在某些情况下,将给定约束组的迭代次数提高到3以上是有意义的。例如,使用距离约束迭代次数>15的绳索并不罕见。

Relaxation Factor (SOR因子)

有时,在编辑路径时使用ObiParticleRenderer组件是有用的,可以清楚地看到路径是如何用粒子采样的——因为它们构成了绳索的物理表示。
SOR代表逐次超松弛。当试图去满足约束,一个改善收敛的方法是超松弛约束。如果一个粒子向左移动2个单位将满足约束,为什么不移动3个单位?这正是此因子的用途。1是默认值,这完全不会表现出超松弛。2是最大值,这允许你的约束表现出两倍的松弛。高值可以用于在任意模式下提升收敛速度,但记住模拟的稳定性会降低。

🎲Obi Rope

🎮Obi Rope简介

绳索是通过使用距离和弯曲约束链接粒子而构建的。由于规则粒子没有方向(只有位置),因此无法模拟扭转效应(维基百科),绳索也无法保持其静止形状。然而,与杆不同,绳索可以撕裂/分裂,其长度可以在运行时改变。

🎮Obi Rope属性

如果要创建一个Obi Solver可以在Hierarchy里右击→3D Object→Obi→Obi Rope.
必须放在Obi Solver下面

Rope Blueprint(绳子蓝图)

首先按照上面的方法先创建好蓝图,然后再拖到Obi Rope的蓝图插槽里面,这样就可以看见绳子了。
13

Edit path(路径编辑)

绳索/杆子蓝图中的粒子是沿着路径(也称为样条线)生成的,该路径是穿过多个控制点的弯曲形状。

在路径编辑器中,您可以添加/删除控制点(点击图标即可进入编辑模式),移动/旋转/缩放现有控制点,以及设置将插值到绳索粒子的每个控制点的属性。在编辑路径时,您将立即获得最终绳索/杆的外观反馈。
14

有时,在编辑路径时使用ObiParticleRenderer组件(这个组件后面会介绍)是有用的,可以清楚地看到路径是如何用粒子采样的——因为它们构成了绳索的物理表示。

15 16
选择一个控制点的路径编辑模式,显示其厚度控制柄(橙色圆盘)和两个切线控制柄(控制点两侧的平移小控件)。

Tangent mode(切线模式)

每个切线控制柄都有三种操作模式,可以为每个控制柄设置:自由、对齐或镜像。
17

自由:
手柄的每一半都可以独立自由移动。这允许创建锐角或曲率的突然变化。

对齐:
两半将被迫位于控制点的切线上,但它们的长度可以独立设置。

镜像:
两半将被迫在方向和长度上完全相同。

Thinckness(厚度)

所选点的绳子的厚度,嵌入到粒子中,用于碰撞检测和渲染。
18

Mass(质量)

粒子质量。确定粒子在与另一个粒子或刚体进行任何约束(碰撞、距离、弯曲……)时的行为方式。

Category(类别)

粒子碰撞遮罩,用于确定何时应忽略与对撞机和其他粒子的碰撞。比如你这节点设置了0,然后碰撞器上设置(Obi的碰撞器 后面会讲)了1那就不能与该物体进行碰撞。

Collides with(碰撞)

粒子碰撞遮罩,用于确定何时应忽略与对撞机和其他粒子的碰撞。与上面说的哪个差不多,不能与没设置过的数字相撞。

Color(颜色)

控制点的颜色,插值到粒子。使用ObiRopeExtruded渲染器时,此颜色将传递给网格顶点颜色。

Name(名字)

控制点的名字

平移/旋转/缩放控制点工具

这些工具允许你平移/旋转/缩放所选的控制点,它们类似于Unity中的平移/旋转/缩放变换小工具。

添加控制点工具

此工具能够直观地向样条线添加控制点。鼠标光标和样条曲线中最近的点之间将出现一条绿色虚线。单击将在该位置的曲线中插入一个新的控制点。

移除控制点工具

此工具能够直观地从样条曲线中删除控制点。鼠标光标和样条曲线中最近的点之间将出现一条红色虚线。单击将删除曲线中最近的控制点。

打开/关闭路径

路径可以是开放的(两端独立)或封闭的(曲线遵循封闭的路径,两端共享相同的位置和切线)。

定向工具(仅杆子)

此工具允许您定义每个控制点的方向。这允许您指定杆的剩余扭曲。

切换切线控制柄

打开/关闭切线控制柄。

切换厚度控制柄

打开/关闭厚度控制柄。

🎲Obi Path Smoother

🎮Obi Path Smoother属性

Decimation(抽取)

用于适应的阈值会基于它的曲率减少绳索的帧数。在内部,它使用一个迭代的拉默-道格拉斯-普克(Ramer-Douglas-Peucker)抽取算法的变体。设置抽取为0将不会执行任何减少。高值将从绳子的直段删除一些帧,来使渲染成本更低。

以下图像显示了在线框模式下使用ObiRopeExtruddeRefender渲染的绳索,以清楚地看到抽取的效果:
19

Smoothing(平滑)

抽取之后应用于绳子几何形状的平滑迭代。在内部,它使用封闭形式的Chaikin’s corner-cutting 算法的变体。设置平滑为0将不会执行任何平滑。更高的值将在已存在的分段之间插入额外的分段。结合低“分辨率”的蓝图和高“平滑度”,会让你生成可视化的由粒子构成的赏心悦目的绳子。
20

twist(扭曲)

每个绳索段应用度数表示的扭转。例如,如果你想制作一个链条,其中每个链环都相对于前一个链环扭转90度,那么这个值应设为90。
21

🎲Obi Particle Renderer

🎮Obi Particle Renderer介绍

由于Obi在内部是通过粒子组成的(如布料、绳索、流体等),它会为你在场景中显示出组成的粒子。这既可以是出于调试目的,也可以作为一种备选的可视化模式。要渲染某个元素的粒子,只需为其添加一个ObiParticleRenderer组件。任何继承自ObiActor的类都可以附加粒子渲染器:
ObiCloth
ObiTearableCloth
ObiRope
ObiRod
ObiBone
ObiSoftbody
ObiEmitter
有两个粒子渲染器组件:ObiParticleRenderer和ObiInstructParticleRenderer(仅限Obi 4.1及以上版本)
23

🎮Obi Particle Renderer属性

Render(渲染)

渲染表示粒子的网格时使用的渲染参数。有关详细信息,请参阅Unity的文档。

Shader(着色器)

着色器

Particle Color(粒子颜色)

此属性可以修改显示粒子的颜色

Particle Scale(粒子尺寸)

此属性可以修改显示粒子的大小
更改半径比例不会影响Actor粒子的实际物理大小。它只是把它们画得比实际更大或更小。当涉及碰撞、流体相互作用等时,它们仍将使用其真实半径。