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

Collisions

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

  • 布料与地形和一些箱子碰撞。

  • 大多数时候,我们会希望粒子能够与场景中的其他元素碰撞并做出反应:墙壁、地板、箱子什么的。它们也可以互相碰撞。这两种类型的碰撞(对碰撞器和对其他粒子)可以在Obi中独立控制。本节中的所有内容都适用于所有Obi actors(布、绳索、流体发射器等)。

设置碰撞器

  • 将Obi Collider组件添加到场景中的任何碰撞器中,使其与Obi一起工作。你可以将这个组件添加到SphereColliders、MeshColliders、BoxColliders…几乎所有标准的Unity colliders,包括3D和2D。Obi目前唯一不支持的碰撞器类型是Polygon Collider 2D。
  • 在每个模拟步骤开始时,solvers将根据什么colliders在空间上接近它们,为其所有粒子生成碰撞约束。
  • 有时想让某些actors,甚至只有一些特定的粒子忽略某个特定的colliders。你可以使用phases来实现这一点。每个ObiCollider都有一个 "Collision phases "属性,而粒子有一个 "phases "通道,你可以使用blueprint编辑器来设置。只有不同phases的colliders和粒子才会发生碰撞。同一phases的colliders和粒子将互相忽略。默认情况下,ObiColliders处于相位0,而粒子处于相位1,所以它们会立即发生碰撞。
    【Unity】Obi插件系列(三)—— Collisions
  • Obi Colliders还允许你设置它们的碰撞材料和厚度。正的厚度值会在对撞机表面和碰撞粒子之间留下一个间隙。负值将导致粒子在实际撞击其表面之前 "沉入 "colliders。
    【Unity】Obi插件系列(三)—— Collisions【Unity】Obi插件系列(三)—— Collisions【Unity】Obi插件系列(三)—— Collisions
  • 绳索颗粒与立方体碰撞,从上到下:厚度=0.1,厚度=0,厚度=-0.05。
  • 请注意,Obi Collider的厚度参数与Unity colliders的contact Offset无关。你可以使用这两个参数来独立调整与Obi actors的碰撞和与其他Collider的碰撞。

Rigidbodies

  • 当你将一个Obi Collider组件添加到一个对象中时,它将寻找其层次结构中的第一个Rigidbody组件,并将一个Obi Rigidbody组件附加到它上面。这个组件允许Obi粒子与刚体交互。如果你删除了这个组件,Obi会在你下次点击 "播放 "时自动重新创建它。【Unity】Obi插件系列(三)—— Collisions
  • Obi Rigidbody只有一个参数。“Kinematic for particles”. 启用这个参数可以使刚体免受粒子施加的任何力的影响,所以它的行为就像场景中没有Obi粒子存在一样。但粒子仍然会 "感觉 "到刚体并与之碰撞。

Intercollisions

  • 如果它们的粒子具有不同的phases,那么Obi Actors会相互碰撞,只要它们是由同一个Obi Solver模拟的。不同Solver模拟的粒子不能相互作用,这意味着不同Solver中的角色不能相互碰撞。
  • 例如:如果希望A布和B布互相碰撞,就把A布的粒子设置为第2phases,B布的粒子设置为第3phases(或者除了2以外的任何其他相!)。

Self collisions

  • 要使一个actors与自己发生碰撞,只需在其inspector中启用 "自我碰撞 "复选框。

Collision constraints

  • 一旦你设置了碰撞,你的Solver将开始为粒子生成碰撞约束。Obi使用了一种被称为 "推测性接触 "的碰撞检测范式,这意味着在粒子之间或Collider和粒子之间发生任何实际碰撞之前,就可以生成接触约束。多亏了这一点,碰撞在实际发生之前就被计算在内,而隧道问题(大多数碰撞引擎中存在的众所周知的子弹纸问题)几乎不存在。即使在高速下,也能检测和解决接触问题。此外,如果几个碰撞发生在同一帧中,则不需要TOI(影响时间)排序。
  • 一个给定的粒子在同一帧中可以产生几个接触。然后,推测的接触必须被计算在内,如果它们变成实际的碰撞,则必须被解决。然而,按顺序解析接触点(一个接一个)会不幸地导致之前解析的接触点再次成为碰撞。请看下图。在步骤1中,产生了两个推测性接触,因为根据橙色粒子的当前速度,几乎可以肯定它将在下一帧中与灰色对撞机发生碰撞。在步骤2中,两个推测性接触都发展为必须解决的实际碰撞。第3步显示了如何先解析右边的碰撞。在步骤4中,我们解决左边的碰撞,但这又会导致右边的碰撞被穿透。我们必须第二次解决右边的碰撞(步骤5),以确保任何一个接触都不会发生穿透。【Unity】Obi插件系列(三)—— Collisions
  • 所有这些向右、向左、向右、向左…的迭代求解都会造成视觉上的抖动,因为我们看到粒子在两个配置之间跳动,直到所有的碰撞都被解决(这可能需要很高的迭代量)。出于这个原因,Obi让你决定(就像它对所有约束组一样)必须如何解决碰撞:顺序或并行。在并行模式下,所有的接触都在同一步骤中独立地解决(就像其他接触不存在一样),并且最终的修正是作为其所有单独结果的平均值计算的。这增加了稳定性(消除了由于未解析的碰撞造成的抖动),但降低了收敛速度(实现零穿透需要更多的迭代),使得在使用低迭代次数时碰撞显得过于 “软”。见下图。【Unity】Obi插件系列(三)—— Collisions
  • 一般的经验法则:如果在你的场景中同时发生多个碰撞,并且产生抖动问题,那么将碰撞约束评估顺序设置为 “并行”。如果抖动不是问题和/或你需要更快的收敛,则使用 "顺序 "评估顺序。对于粒子-粒子碰撞和粒子-碰撞器碰撞有单独的控制,所以你可以对它们各自使用不同的方法。你可以在ObiSolver检查器中的 "Particle Collision Constraint Parameters "和 "Collision Constraint Parameters "下找到这个设置。【Unity】Obi插件系列(三)—— Collisions
  • 请参阅ObiSolver了解更多关于顺序解(sequential)和并行解(parallel)的信息。【Unity】Obi插件系列(三)—— Collisions

Collision materials

  • 一旦一个碰撞约束不再是一个推测性的接触,而变成了一个实际的接触(两个物体真的相互接触),碰撞必须以某种方式解决。如何解决取决于你的粒子和Collision使用的是什么ObiCollisionMaterials。所有Obi Actors(布、绳索等)都有一个 "材料 "属性,让你指定该Actors的所有粒子将使用哪种ObiCollisionMaterial。你也可以将碰撞材料分配给ObiColliders。
  • ObiCollisionMaterials是assets,就像Unity的PhysicMaterials一样。你可以在你的项目文件夹中右击,然后选择创建–>Obi–>ObiCollisionMaterial。这里是材质inspector。【Unity】Obi插件系列(三)—— Collisions
    动摩擦力Dynamic friction:在碰撞中,一旦超过静摩擦力阈值,粒子相对于表面运动时,相对切向速度消失的百分比。0表示事物会像冰做的一样滑动,1则会导致切向速度完全丧失。
    静摩擦力Static friction:碰撞中相对切向速度被消除的百分比。0表示物体会像冰块一样滑动,1表示切向速度完全丧失。
    粘性Stickiness:碰撞中物体之间施加的内向法向力的大小。0表示不会施加任何力,1表示物体碰撞后会保持不分离。
    粘性距离Stick distance:物体之间施加粘性力的最大距离。应尽量保持小。
    摩擦力联合体Friction combine: 当参与碰撞的物体具有不同的系数时,摩擦系数如何计算。
    粘性联合Stickiness combine:当参与碰撞的物体具有不同的系数时,如何计算粘性系数。
    滚动接触Rolling contacts: 启用此功能,以执行包括角速度在内的完整接触分辨率(参见下一节)。
    滚动摩擦Rolling friction: 在滚动接触过程中,施加的滚动阻力量(见下节)。在0和0.1之間的值是最有用的。【Unity】Obi插件系列(三)—— Collisions
  • 在上图中,红色箭头代表粒子在碰撞时的速度,这个速度分为两个部分:一个沿接触法线,一个沿接触切线。蓝色箭头代表施加在粒子上的力,以抵消其法线速度,它总是完全施加。紫色箭头是摩擦力,它能消除切向速度分量的一定比例(在图像中,100%)。绿色箭头是粘性力。【Unity】Obi插件系列(三)—— Collisions
  • 重球落在一块很粘的布上。
  • Rolling contacts
  • 常规接触(包括粒子-粒子和粒子-碰撞器)将粒子视为空间中的简单位置,因此它们不会导致粒子旋转。这种简化允许非常廉价的碰撞响应,因为只考虑线性速度。然而,可以选择通过在接触材料中启用滚动接触来执行考虑到角速度和粒子方向的全接触分辨率。
  • 当两个接触材料不同的物体发生碰撞时,如果其中一个接触材料有滚动接触,则使用全滚动接触方程。
  • 使用滚动触点只对利用粒子方向的actors有意义。ObiEmitter(发射颗粒时)和ObiRod。它们与ObiSoftbody不兼容,与ObiCloth和ObiRope一起使用时也不会有明显的效果。
  • 各向异性(非球形)颗粒使用简化的接触点计算算法,当与滚动接触一起使用时,不会施加精确的扭矩。出于这个原因,就滚动接触而言,各向异性颗粒的行为就像完全球形一样。
  • 常规接触:角速度/方向被忽略。【Unity】Obi插件系列(三)—— Collisions
  • 滚动接触:利用角速度/方向。【Unity】Obi插件系列(三)—— Collisions
  • 如果您启用了碰撞材料的滚动接触,将出现一个新的参数 “滚动摩擦”。滚动摩擦力的作用是通过施加一个与参与接触的粒子的角速度相反的扭矩。在现实生活中,完全球形的粒子在倾斜的平面上永远不会停止滚动。然而,表面不规则的粒子(如岩石或鹅卵石)会在一段时间后停止滚动,因为它们的表面不平整。这就是滚动摩擦力所要模拟的。
  • 动图:http://obi.virtualmethodstudio.com/images/tutorial3/rolling_friction.gif
  • 冲击传播
  • 冲击传播是一种在接触解析过程中内部改变粒子质量的技术,因此堆积底部的粒子比顶部的粒子具有更高的有效质量。这将导致更快的收敛和更稳定的堆积。你可以在ObiSolver inspector中找到这个参数(Shock propagation),它是全局性地应用于每个slover。当你需要为你的粒子-粒子接触提供额外的 "动力 "时,请使用这个参数,特别是在创建颗粒材料堆时。