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

Distance Fields 距离场

  • 距离场是一种特殊的碰撞基元,可以和Obi一起使用。
  • 每当一个Obi粒子靠近一个collider时它必须计算出到collider表面的最短距离, 以确定它是否会与之相撞。对于某些形状,特别是对于Mesh Colliders来说,这种计算会花费很多时间。距离场会预先计算并存储其边界框内每一个点到碰撞器表面的最短距离。然后,粒子只需要在运行时查询这些距离值,避免了昂贵的计算。
  • 距离场类似于 3D 纹理。距离场不是像素,而是由节点组成。与纹理不同,距离场是自适应的。这意味着它们在物体表面附近或在距离经常变化的地方有更高的分辨率(更小的节点)。这大大减少了它们的内存占用。【Unity】Obi插件系列(四)—— Distance Fields、Particle attachments、Particle rendering【Unity】Obi插件系列(四)—— Distance Fields、Particle attachments、Particle rendering
  • 从女性雕像生成的距离场的正面和侧面剖视图。注意,靠近表面的区域分辨率较大。红色区域在网格内,灰色区域在网格外。这个距离场只占用636千字节,有效分辨率为512^3。

什么时候应该使用距离场?

  • 将它们用于大型和复杂的对象:当使用 MeshColliders 太过昂贵,或者使用原始碰撞器(盒子、球体、胶囊)来近似对象是不切实际的。很好的例子是一个被布覆盖的大型雕像或一个特别复杂的液体容器。
  • 效益
    1. 对大的、固有的物体进行极其廉价和准确的碰撞检测。
    2. 它们比MeshColliders更强大:距离场是实心的而不是空心的。如果一个粒子完全进入距离场内,它将被投射到外面,并从错过的碰撞中恢复。
  • 局限性
    1. 距离场只支持统一缩放。如果您对每个轴应用不同的缩放比例,结果将是错误的。但请注意,只要所有轴的比例是相同的,仍然可以缩放对象。
    2. 它们不能用于可变形的网格(骨骼动画、混合形状、基于顶点着色器的变形等)。
    3. 如果你的对象是要成为一个封闭的实体对象,请确保网格中没有洞。如果它有,针对距离场的碰撞可能会发生意外

如何使用它们

  • 距离场是asset。可以通过右击任何项目文件夹并选择 "创建–>Obi->Obi Distance Field "来创建一个新的距离场。一旦你创建了一个,选择一个输入网格,调整最大误差和最大深度参数,然后点击生成。
    1. 最大误差:可容忍的最大距离误差。如果节点中存储的距离与实际距离之差超过此阈值,将进一步细分节点,以达到更高的精度。
    2. 最大深度:可以进行递归细分的最大次数。一个节点被细分的次数不会超过 "最大深度 "的次数,即使它的测量误差高于最大误差。
  • 生成一个距离场可能需要一段时间,这取决于你的设置和网格的密度。一旦完成这个过程,你会看到一个距离场的体积预览,以及一些相关的统计数据。【Unity】Obi插件系列(四)—— Distance Fields、Particle attachments、Particle rendering
  • 你现在已经准备好在你的场景中使用它了!选择任何一个你想要使用距离场进行碰撞检测的ObiCollider,启用 “使用距离场”,并指定你想要使用的距离场。
  • 距离场只会对Obi粒子产生碰撞。它们不会与其他物体发生碰撞,为此你需要使用Unity自己的Collider。
  • 请注意,可以将使用距离场进行粒子碰撞检测与任何Collider组件结合起来,对其他对象进行常规碰撞检测。

Particle attachments

  • 很多时候,会想把Obi Actor的一部分(绳子,布或软体)"粘 "到另一个物体上。这可以通过使用attachment轻松实现。
  • 要创建一个attachment,选择你要附加的角色,并在添加组件菜单中寻找ObiParticleAttachment。所有attachment都需要两个输入。
    1. 目标:我们要将actor附加到的Transform。
    2. 粒子组:你想保持附着在目标上的粒子组。对于布和软体,你可以在蓝图编辑器中定义新的粒子组。绳索和杆状物体会自动为每个路径控制点生成一个新的粒子组。
  • 受一个以上attachments影响的粒子将跟随最后更新的attachments。attachments的更新顺序没有定义。
  • 有两种类型的attachments,表现不一样:静态和动态。
  • Static attachments
    【Unity】Obi插件系列(四)—— Distance Fields、Particle attachments、Particle rendering
  • 静态attachments完全停用了组中粒子的动态,而是使用目标变换来驱动它们。这是非常廉价的,并确保完美的附件,不漂移或分离。
  • 然而,由于静态附着不涉及任何动态–没有力、速度或加速度,因此,将一个角色静态地附着在一个刚体上,会使该角色盲目地跟随刚体的变换。刚体的行为方式与没有actor的情况下完全相同。这种行为的技术名称是单向耦合。
  • Dynamic attachments
    【Unity】Obi插件系列(四)—— Distance Fields、Particle attachments、Particle rendering
  • 通过使用动态附件,你可以让粒子完全模拟并与刚体交换脉冲。这意味着actor将受到刚体运动的影响,而刚体也将反过来受到actor的影响。这种行为的技术名称是双向耦合。
  • 动态附件有几个额外的参数
    1. Compliance:约束顺应性,单位为米/牛顿。在当前的仿真预算(时间步长和引脚约束迭代次数)下,零值将努力使附件尽可能地刚性。高值将使附件更加灵活。
    2. Break threshold:附着物在不断裂的情况下所能承受的最大力(牛顿)。
  • 在使用动态attachments时,尽量确保粒子和附加刚体之间的质量比合理小。不要把1克的颗粒钉在100公斤的刚体上,结果会很不稳定,造成运动的停顿和抖动,除非你的timestep尺寸非常小。
  • 你可以使用动态attachments将刚体从绳子或布片或绳索上悬挂起来。你可以用它来制作灯具、起重机等。
  • 一些actor,如ObiRod或ObiSoftbody,使用了定向粒子。在这种情况下,动态附件将让你同时约束粒子的位置和方向。

Particle rendering

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

  • 由于Obi在内部使用粒子来表示所有的actors(布、绳索、液体…),有时在你的场景中实际绘制这种基于粒子的表示是有意义的:为了调试的目的,或者作为一种替代的可视化模式。要渲染一个actors的粒子,只需为其添加一个ObiParticleRenderer组件。任何派生自ObiActor的类都可以附加一个粒子渲染器。
  • 有两个粒子渲染器组件。ObiParticleRenderer和ObiInstancedParticleRenderer(只有4.1及以上版本)
  • Obi Particle Renderer
  • 粒子是以球形假体的形式呈现的,它们只是应用了特殊着色器的四边形。它们并不是真正的球状网格(尽管它们看起来像),因此可以以极低的性能成本渲染成千上万的颗粒,而无需GPU实例支持。
  • 下面是ObiParticleRenderer的Inspector:
    【Unity】Obi插件系列(四)—— Distance Fields、Particle attachments、Particle rendering
  • Render
    你可以禁用这个复选框,这样粒子就不会被渲染,但用于渲染它们的网格仍然会被生成。这对于那些将此网格作为输入并以不同方式渲染的组件非常有用,比如ObiFluidRenderer。
  • Particle Color
    颗粒的整体颜色。
  • Radius scale
    这是在绘制颗粒时的尺寸比例。
  • 改变半径比例不会影响actor粒子的实际物理尺寸。它只是将它们画得比实际尺寸大或小。当参与碰撞、流体相互作用等时,它们仍然会使用它们的真实半径。
  • Obi Instanced Particle Renderer
  • 粒子被渲染为网格的GPU实例。它们将准确地反映粒子的位置、方向和比例。请注意,这需要 GPU 实例支持,并使用支持实例的材质。
  • 下面是ObiInstancedParticleRenderer的inspector:【Unity】Obi插件系列(四)—— Distance Fields、Particle attachments、Particle rendering
  • Render
    你可以禁用这个复选框,颗粒就不会被渲染。
  • Mesh
    用于实例化的网格。
  • Material
    用于实例化的材料。请注意,它的 "Enable GPU instancing "属性必须开启。
  • Instance scale
    这缩放了粒子在局部X、Y和Z轴上绘制的尺寸。
  • 改变实例比例不会影响演员粒子的实际物理尺寸。它只是将它们画得比实际尺寸大或小。当参与碰撞、流体相互作用等时,它们仍然会使用它们的真实半径。
    【Unity】Obi插件系列(四)—— Distance Fields、Particle attachments、Particle rendering
  • 滚动接触的粒子被渲染为岩石实例。