【Unity】Obi插件系列—— 总览、Actors与Solvers
链接:https://pan.baidu.com/s/1Q9OiM_nwMyeApEhEzsCemw
提取码:1234
Obi框架
- Obi是一个基于粒子的Unity物理学插件的集合。Obi的内容一切都是被称为粒子的小球体组成。
- 粒子之间可以相互影响,通过使用约束来影响其他物体。
ObiSolver
- ObiSolver是一个执行物理模拟的组件。ObiSolver暴露了一些全局模拟参数,如重力、惯性尺度或速度阻尼。
ObiUpdater
- ObiUpdater是一个组件,可以推进一个或多个ObiSolver的模拟,使它们与Unity自己的物理引擎保持同步。Obi中包含了几种类型的ObiUpdater,以覆盖常见的用例,但如果你需要精确控制模拟更新周期,可以自行编写ObiUpdater。
ObiActorBlueprint
- ObiActorBlueprint是一种asset,它存储了一堆粒子和约束。它本身并不执行任何模拟或渲染。只是一个数据容器,与纹理或音频文件不一样。ObiActorBlueprint是由网格(ObiCloth和ObiSoftbody)、曲线(ObiRope)或材质定义(ObiFluid)生成的。
ObiActor
- ObiActor是在ObiSolver中实例化一个ObiActorBlueprint的组件。所有的ObiActor必须是ObiSolver的孩子。多个ObiActor可以共享同一个ObiActorBlueprint。并且可以重复使用同一个ObiActorBlueprint。ObiActor的例子有一根绳子、一面旗子、一个弹力果冻或一个喷水器。
- 下面是一张图,显示了一个有两个ObiSolver的场景:一个模拟3个相同的布片,另一个模拟2个相同的绳子。
- 每个ObiSolver都会维护几个列表或每个粒子的属性:位置、速度、半径等。最初,这些列表没有元素。每当一个新的ObiActor被添加到ObiSolver中,就会发生这些步骤。
- ObiActor要求ObiSolver根据ObiActorBlueprint的需要分配尽可能多的粒子。ObiSolver将每个粒子分配到它在其内部数组中找到的第一个空闲槽中。当从ObiSolver中移除ObiActor时,分配的粒子之间会出现空隙。正因为如此,在ObiSolver数组中,属于同一角色的粒子可能不会相邻。
- ObiActor会复制ObiActorBlueprint中发现的所有约束,并更新它们的粒子引用,使它们指向正确的ObiSolver阵列位置。
- 更新ObiSolver中的活性粒子数量。
Obi具体成员
Actors
- 一块布、一根绳子、一个流体发射器或一个软体,它们都是Actor。所有的Actor都以一个Blueprint作为输入。Actor将实例化Blueprint中包含的信息(粒子和约束),这样Solver就可以对其进行模拟。可以在多个Actor之间重复使用同一个Blueprint。
- 如果想对一个Actor进行模拟,它必须是Solver的子角色。在运行时,可以修改一个Actor的父亲为某一个Solver,也可以将它从当前Solver的层次结构中移除。
- 无论你要创建什么类型的Actors,进行模拟所需的步骤都非常相似:
- 生成一个适当类型的Blueprint资源,然后根据需要进行编辑。
- 创建Actor,并为其提供Blueprint。
- 可以通过进入GameObject->3DObject->Obi来创建任何Actor。
- 例如,要创建一个布的Actor,GameObject->3DObject->Obi->Obi Cloth,要创建一个绳索GameObject->3DObject->Obi->Obi Rope等等。
- 当第一次在场景中创建一个actor时,Obi会寻找一个ObiSolver组件来添加这个actor。如果它找不到合适的Solver,将自动创建一个。当创建一个Solver时,它也会自动将其添加到场景中找到的第一个ObiFixedUpdater中。
- Actors暴露了一些参数,让你可以修改它的行为(例如,可以改变撕布所需的力,或软体的可塑性)。改变这些参数不会以任何方式影响原始Blueprint,只会影响由actor生成的实例。
- 对于每个Actor的Bluprint,将在后续的文章中更新。
- 绳索:模拟为一条粒子链,通过约束条件将它们连接在一起,迫使它们彼此保持一定的距离(距离约束)
- 布:一块正方形的布被表示为一个二维的粒子网格,通过距离和弯曲约束连接在一起
- 流体发射器:生成新的粒子,排斥或吸引周围的其他粒子,试图保持一个恒定的密度(单位体积的质量)
ObiSolver
- ObiSolver组件是Obi中最重要的组件。它负责模拟粒子物理和强制约束。关于ObiSolver,要记住三个重要的事情
- ObiSolver可以被添加到场景中的任何GameObject中,并且在同一场景中可以有多个ObiSolver同时工作。
- 每个Actor都需要成为Solver的孩子,才能获得其模拟的更新。
- 每个Solver都是完全独立于其他Solver的。因此,被不同Solver更新的Actor不会相互影响/碰撞。只有同一Solver中的Actor才会相互影响。
-
Solver总是在局部空间进行模拟。这意味着,平移、旋转或缩放Solver将僵化地改变整个模拟。
-
但是,可以将Solver线性/旋转运动的一定比例以惯性力的形式注入到模拟中。例如,若想控制整体角色运动对服装模拟的影响程度。为此,Solver暴露了两个参数来独立控制线性和旋转惯性力。
-
求解器参数
-
Simulate when invisible //不可见时仍保持模拟
当所有摄像机都不可见时,这个Sovler是否还保持模拟?如果模拟要求需要随时更新,则需要开启此功能。当场景中存在多个Sovler,但这些Sovler在任何时候都不可见时,需要禁用它以提高性能。 -
Mode //模式
Sovler可以在2D或3D模式下进行仿真。在二维模式下,模拟只发生在XY平面上。
2D模式通常与2D碰撞器的使用结合在一起。但是,为了方便起见,你也可以将3D碰撞器与2D模式一起使用。 -
Interpolation //插值
用于渲染粒子的插值模式。None拥有最快的速度,但Interpolate会产生更多的视觉效果。
Interpolate 最适合慢镜头效果,它可以避免Unity的timescale<1时产生的停顿。 -
Gravity //重力
在这个Sovler中施加于粒子的重力方向和大小,用Sovler的局部空间表示 -
Damping //阻尼
速度阻尼应用于粒子速度。增加阻尼以减少粒子的动能。
高阻尼值对模拟水下效应很有用。低的非零值(例如0.15)可以在大多数情况下提高模拟的真实性,代替空气的动力阻力。 -
Shock propagation //冲击传播
值变高会人为增加支撑其他粒子的质量。可以实现更好的堆积稳定性。 -
Max Anisotropy //最大各向异性
Obi中的流体粒子的形状可以是椭圆形的,而不是完美的球形。这是为了让它们的形状更好地适应它们所代表的物体表面,实现更精确的碰撞检测和更平滑的渲染。
最大各向异性可以让你确定椭球体半径之间的最大比例:数值为1将迫使所有粒子都是球形的(停用各向异性),数值大于1将允许粒子变得更加椭球化。 -
启用各向异性(最大各向异性>1)可以极大影响流体渲染。可以在使用较低的流体分辨率时获得更平滑的流体表面。
-
Sleep threshold //睡眠阈值
任何动能低于这个值的粒子都会被冻结在原地。当你不想让速度或力的微小变化扰乱一个粒子,使它看起来像在抖动或缓慢移动时,可以开启这个功能。如果你想让粒子的位置受到任何作用在它们身上的力的影响,需要把它设置为零。 -
World linear inertia scale //世界线性惯性标尺
控制Sovler变换的世界空间线性惯性有多少被应用到粒子上。值范围从0(无)到1(100%)。
移动中的Sovler包含一块布,线性惯性标度设置为1。当解算器突然停止时,布根据惯性继续向前移动。当解算器恢复运动时,布收到惯性向后。 -
World angular inertia scale //世界角惯量表
类似于前一个属性,但控制的是角惯性(旋转)而不是线性惯性(平移)。注意,离心力和科里奥利力都被计算在内。
旋转求解器中包含一块布,角惯性刻度设为1。注意离心力如何在旋转时将布抬起。 -
Constraints //约束
-
可以为Solver管理的所有Actor全局启用/禁用每种约束类型。以这种方式禁用约束将允许Solver完全跳过有关的计算。这可以摆脱不必要的开销。
-
Constraint parameters //限制参数
ObiSolver为每个约束类型提供4个参数:
1. Enabled
2. Iterations
3. Evaluation order
4. SOR Factor-
Enabled:
- 这些约束条件是否会更新?默认情况下,所有的约束类型都是启用的。你应该禁用任何对模拟的最终外观不重要的约束条件。
- 有些约束在启用后,如果没有Actor使用,则不会降低性能。例如,密度约束只被流体使用。因此,如果你的场景中没有流体发射器,启用密度约束完全不会影响你的性能。
-
Iterations
- 每个子步骤应该评估这些约束条件多少次?高迭代次数可以使仿真更接近于真实的情况。如果这些约束条件对你的特定目的不是很重要,而又想获得更好的性能,则设置较低的迭代次数。默认值是3。
- 在某些情况下,将给定约束组的迭代量调高到3以上是有意义的。例如,使用距离约束迭代次数大于15的绳索。
-
Evaluation order
- 告诉Solver以何种顺序来评估这种约束条件。有两种模式。
- 在Sequential模式下,所有的约束都是按照创建的顺序进行评估的(这是由每个特定的ObiActor决定的),每个约束都会 "看到 "之前所有约束的调整。这确保了快速收敛,所以设置好的约束需要很少的迭代就能有不错的效果。然而,当几个约束争夺控制权时,就不是很稳定–有时会变得抖动–所以在一些使用情况下,这种模式不是一个好的选择。它是依赖于顺序的,所以在低预算的情况下(很少的迭代和/或大的时间步长),这可能会导致粒子排列的可见模式。
- 在Parallel模式下,所有约束都会被评估,但它们的调整不会立即应用到粒子上。相反,它们被存储,平均,然后最终结果被用于调整粒子位置。这产生了一个非常稳定的模拟,即使一次应用了很多约束,但是对于 "硬 "约束需要更多的迭代。它也是与顺序无关的,所以它能保证粒子的平稳排列。如果你想用高迭代次数的性能或低迭代次数的质量来换取稳定性,请使用这种模式。
- 并行模式收敛缓慢。所以,能用顺序模式的时候就用顺序模式,必须用的时候就用并行模式。
-
SOR Factor
- SOR是Successive Over-Relaxation的缩写。当试图满足约束条件时,提高收敛性的一种方法是 "过度放松 "约束条件。也就是说,如果把一个粒子向左移动2个单位就能暂时满足约束条件,把它移动3个单位也并非不可?这正是这个因子的作用。1是默认值,完全不进行过度放松。2是最大值,可以对约束进行两倍的放松。高值可以用来帮助加快两种模式(顺序或并行)中任何一种模式的收敛速度,但请记住,仿真稳定性可能会降低。
-
Enabled:
本文地址:https://blog.csdn.net/CtronicHikari2/article/details/109587017
下一篇: Java 验证码生成,随机颜色字体