欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【Unity】Obi插件系列—— 总览、Actors与Solvers

程序员文章站 2022-03-19 16:05:49
链接:https://pan.baidu.com/s/1Q9OiM_nwMyeApEhEzsCemw提取码:1234Obi框架Obi是一个基于粒子的Unity物理学插件的集合。Obi的内容一切都是被称为粒子的小球体组成。粒子之间可以相互影响,通过使用约束来影响其他物体。ObiSolverObiSolver是一个执行物理模拟的组件。ObiSolver暴露了一些全局模拟参数,如重力、惯性尺度或速度阻尼。ObiUpdaterObiUpdater是一个组件,可以推进一个或多个ObiSol...

链接:https://pan.baidu.com/s/1Q9OiM_nwMyeApEhEzsCemw
提取码:1234

Obi框架

  • Obi是一个基于粒子的Unity物理学插件的集合。Obi的内容一切都是被称为粒子的小球体组成。
  • 粒子之间可以相互影响,通过使用约束来影响其他物体。

ObiSolver

  • ObiSolver是一个执行物理模拟的组件。ObiSolver暴露了一些全局模拟参数,如重力、惯性尺度或速度阻尼。
    【Unity】Obi插件系列—— 总览、Actors与Solvers

ObiUpdater

  • ObiUpdater是一个组件,可以推进一个或多个ObiSolver的模拟,使它们与Unity自己的物理引擎保持同步。Obi中包含了几种类型的ObiUpdater,以覆盖常见的用例,但如果你需要精确控制模拟更新周期,可以自行编写ObiUpdater。
    【Unity】Obi插件系列—— 总览、Actors与Solvers

ObiActorBlueprint

  • ObiActorBlueprint是一种asset,它存储了一堆粒子和约束。它本身并不执行任何模拟或渲染。只是一个数据容器,与纹理或音频文件不一样。ObiActorBlueprint是由网格(ObiCloth和ObiSoftbody)、曲线(ObiRope)或材质定义(ObiFluid)生成的。
    【Unity】Obi插件系列—— 总览、Actors与Solvers

ObiActor

  • ObiActor是在ObiSolver中实例化一个ObiActorBlueprint的组件。所有的ObiActor必须是ObiSolver的孩子。多个ObiActor可以共享同一个ObiActorBlueprint。并且可以重复使用同一个ObiActorBlueprint。ObiActor的例子有一根绳子、一面旗子、一个弹力果冻或一个喷水器。

【Unity】Obi插件系列—— 总览、Actors与Solvers

  • 下面是一张图,显示了一个有两个ObiSolver的场景:一个模拟3个相同的布片,另一个模拟2个相同的绳子。
    【Unity】Obi插件系列—— 总览、Actors与Solvers
  • 每个ObiSolver都会维护几个列表或每个粒子的属性:位置、速度、半径等。最初,这些列表没有元素。每当一个新的ObiActor被添加到ObiSolver中,就会发生这些步骤。
  1. ObiActor要求ObiSolver根据ObiActorBlueprint的需要分配尽可能多的粒子。ObiSolver将每个粒子分配到它在其内部数组中找到的第一个空闲槽中。当从ObiSolver中移除ObiActor时,分配的粒子之间会出现空隙。正因为如此,在ObiSolver数组中,属于同一角色的粒子可能不会相邻。
  2. ObiActor会复制ObiActorBlueprint中发现的所有约束,并更新它们的粒子引用,使它们指向正确的ObiSolver阵列位置。
  3. 更新ObiSolver中的活性粒子数量。

Obi具体成员

Actors

  • 一块布、一根绳子、一个流体发射器或一个软体,它们都是Actor。所有的Actor都以一个Blueprint作为输入。Actor将实例化Blueprint中包含的信息(粒子和约束),这样Solver就可以对其进行模拟。可以在多个Actor之间重复使用同一个Blueprint。
  • 如果想对一个Actor进行模拟,它必须是Solver的子角色。在运行时,可以修改一个Actor的父亲为某一个Solver,也可以将它从当前Solver的层次结构中移除。
    【Unity】Obi插件系列—— 总览、Actors与Solvers
  • 无论你要创建什么类型的Actors,进行模拟所需的步骤都非常相似:
  1. 生成一个适当类型的Blueprint资源,然后根据需要进行编辑。
  2. 创建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,将在后续的文章中更新。
  • 绳索:模拟为一条粒子链,通过约束条件将它们连接在一起,迫使它们彼此保持一定的距离(距离约束)
    【Unity】Obi插件系列—— 总览、Actors与Solvers
  • 布:一块正方形的布被表示为一个二维的粒子网格,通过距离和弯曲约束连接在一起【Unity】Obi插件系列—— 总览、Actors与Solvers
  • 流体发射器:生成新的粒子,排斥或吸引周围的其他粒子,试图保持一个恒定的密度(单位体积的质量)【Unity】Obi插件系列—— 总览、Actors与Solvers

ObiSolver

  • ObiSolver组件是Obi中最重要的组件。它负责模拟粒子物理和强制约束。关于ObiSolver,要记住三个重要的事情
  1. ObiSolver可以被添加到场景中的任何GameObject中,并且在同一场景中可以有多个ObiSolver同时工作。
  2. 每个Actor都需要成为Solver的孩子,才能获得其模拟的更新。
  3. 每个Solver都是完全独立于其他Solver的。因此,被不同Solver更新的Actor不会相互影响/碰撞。只有同一Solver中的Actor才会相互影响。
  • Solver总是在局部空间进行模拟。这意味着,平移、旋转或缩放Solver将僵化地改变整个模拟。

  • 但是,可以将Solver线性/旋转运动的一定比例以惯性力的形式注入到模拟中。例如,若想控制整体角色运动对服装模拟的影响程度。为此,Solver暴露了两个参数来独立控制线性和旋转惯性力。

  • 求解器参数【Unity】Obi插件系列—— 总览、Actors与Solvers

  • 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将允许粒子变得更加椭球化。
    【Unity】Obi插件系列—— 总览、Actors与Solvers
    【Unity】Obi插件系列—— 总览、Actors与Solvers

  • 启用各向异性(最大各向异性>1)可以极大影响流体渲染。可以在使用较低的流体分辨率时获得更平滑的流体表面。

  • Sleep threshold //睡眠阈值
    任何动能低于这个值的粒子都会被冻结在原地。当你不想让速度或力的微小变化扰乱一个粒子,使它看起来像在抖动或缓慢移动时,可以开启这个功能。如果你想让粒子的位置受到任何作用在它们身上的力的影响,需要把它设置为零。

  • World linear inertia scale //世界线性惯性标尺
    控制Sovler变换的世界空间线性惯性有多少被应用到粒子上。值范围从0(无)到1(100%)。
    【Unity】Obi插件系列—— 总览、Actors与Solvers
    移动中的Sovler包含一块布,线性惯性标度设置为1。当解算器突然停止时,布根据惯性继续向前移动。当解算器恢复运动时,布收到惯性向后。

  • World angular inertia scale //世界角惯量表
    类似于前一个属性,但控制的是角惯性(旋转)而不是线性惯性(平移)。注意,离心力和科里奥利力都被计算在内。
    【Unity】Obi插件系列—— 总览、Actors与Solvers
    旋转求解器中包含一块布,角惯性刻度设为1。注意离心力如何在旋转时将布抬起。

  • Constraints //约束
    【Unity】Obi插件系列—— 总览、Actors与Solvers

  • 可以为Solver管理的所有Actor全局启用/禁用每种约束类型。以这种方式禁用约束将允许Solver完全跳过有关的计算。这可以摆脱不必要的开销。

  • Constraint parameters //限制参数
    【Unity】Obi插件系列—— 总览、Actors与Solvers
    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是最大值,可以对约束进行两倍的放松。高值可以用来帮助加快两种模式(顺序或并行)中任何一种模式的收敛速度,但请记住,仿真稳定性可能会降低。

本文地址:https://blog.csdn.net/CtronicHikari2/article/details/109587017

相关标签: unity