当前位置:   article > 正文

Unity的Obi插件 自定义绳子、布料的碰撞体属性说明_unity obi使用

unity obi使用

说明: 本文翻译自网址 http://obi.virtualmethodstudio.com/manual/6.3/collisions.html

在这里插入图片描述
布料与地形和一些盒子发生碰撞。

将 ObiCollider 组件添加到场景中的任何碰撞器中,以使其与 Obi 配合使用。您可以将此组件添加到 SphereColliders、MeshColliders、BoxColliders…几乎所有标准 Unity 碰撞器(3D 和 2D)。 Obi 目前不支持的唯一碰撞器类型是 PolygonCollider2D 和 TilemapCollider2D。在每个模拟步骤开始时,解算器将根据空间上靠近它们的碰撞器为所有粒子生成碰撞约束。

设置碰撞

将 ObiCollider 组件添加到场景中的任何碰撞器中,以使其与 Obi 配合使用。您可以将此组件添加到 SphereColliders、MeshColliders、BoxColliders…几乎所有标准 Unity 碰撞器(3D 和 2D)。 Obi 目前不支持的唯一碰撞器类型是 PolygonCollider2D 和 TilemapCollider2D。在每个模拟步骤开始时,解算器将根据空间上靠近它们的碰撞器为所有粒子生成碰撞约束。

ObiCollider 组件检查器如下所示:
在这里插入图片描述
每个碰撞器都允许您指定一个类别值(categories),以及允许它碰撞的类别(collide with)。有关详细信息,请参阅下面的碰撞过滤部分。

ObiColliders 还允许您设置其碰撞材质及其厚度(thickness)。正厚度值将在对撞机表面和碰撞粒子之间留下间隙。负值将导致粒子在实际撞击其表面之前“沉入”对撞机中。
在这里插入图片描述
请注意,ObiCollider 的厚度参数与 Unity 碰撞器的 contactOffset 无关。您可以使用两者来独立调整与 Obi actor 和其他碰撞器的碰撞。

相互碰撞

ObiActor 可以相互碰撞,前提是它们都是由同一个 ObiSolver 模拟的。不同解算器模拟的粒子无法相互交互,这意味着不同解算器中的参与者将无法相互碰撞。

自碰撞

要使 actor 与自身发生碰撞,只需在其检查器中启用“self-collisions”复选框即可。

表面碰撞

Obi 6.0 及更高版本允许您在每个参与者的基础上使用基于表面的碰撞检测,这比基于粒子的碰撞检测更准确。要使用它,您所需要做的就是在演员的检查器中启用“Surface collisions”复选框。有关详细信息,请参阅:表面碰撞。

碰撞过滤

有时您需要一个演员 - 甚至特定的粒子 - 来忽略某些碰撞器或粒子。您可以为此使用类别(categories )和蒙版(masks)。每个碰撞体/粒子最多可以属于 16 个categories之一(从 0 到 15)。masks 确定碰撞体或粒子允许碰撞的类别。masks可以允许与多个类别或所有类别发生碰撞。

例如:categories 5 中的粒子,其masks允许与类别 8 和 10 碰撞,categories 8 和 10 中的masks也允许与categories 5 碰撞的任何粒子或碰撞体发生碰撞。

默认情况下,碰撞器和粒子设置在类别 0 中,并且它们的遮罩允许与所有类别发生碰撞。

在内部,这是引擎执行的测试,用于检查两个物体(A 和 B,无论是粒子还是碰撞体)是否可以碰撞:

if ((A.mask & B.category != 0) && (B.mask & A.category) != 0)
		MayCollide(A,B); 
  • 1
  • 2

在下面的动画中,地板碰撞器设置为仅与类别 0、1 和 2 从上到下发生碰撞。布气球从左到右分为 0、1 和 2 类。
在这里插入图片描述
ObiCollider 组件有两个过滤字段:类别和碰撞。这些允许您分别设置类别和遮罩。

所有 ObiActor 都允许您为单个粒子设置类别和蒙版。根据演员的不同,完成方式略有不同:

布料:使用布料蓝图编辑器在每个粒子的基础上指定类别和蒙版。
软体:使用软体蓝图编辑器在每个粒子的基础上指定类别和蒙版。
绳/杆:使用路径编辑器在每个控制点的基础上指定类别和掩码。
流体:类别和掩码在 ObiEmitter 检查器中按每个发射器指定。

刚体 Rigidbodies

当您将 ObiCollider 组件添加到对象时,它将在其层次结构中查找第一个 Rigidbody 组件,并将 ObiRigidbody 组件附加到它。这允许 Obi 粒子和刚体之间完全双向耦合相互作用。如果您删除此组件,Obi 将在您下次点击“播放”时自动重新创建它。

在这里插入图片描述
ObiRigidbody 只有一个参数:“粒子运动学”。启用此功能可以保护刚体免受粒子施加的任何力的影响,因此它的行为就像场景中不存在 Obi 粒子一样。不过,粒子仍然会“感觉到”刚体并与其发生碰撞。

怎么运行的

Obi 的碰撞管道分为 3 个步骤:

  1. Broadphase,测试对象(碰撞体、单纯形或粒子)的粗略空间接近度。
  2. 在Narrowphase中,对宽相生成的潜在冲突对进行过滤、处理并生成接触。
  3. 最后,碰撞投影 Projection,其中每次接触中涉及的单纯体/粒子/刚体的轨迹被调整以防止碰撞。

您可以在解算器设置中调整碰撞管道的各种参数。这些将影响粒子和碰撞器的边界框的构建方式以及接触的生成方式。
在这里插入图片描述
Broadphase:运动粒子和静态对撞机的边界框重叠,因此将在窄相中再次测试它们。
在这里插入图片描述
窄相Narrowphase:如果我们不采取任何措施来阻止它,粒子速度会将其带入对撞机内,因此会生成碰撞约束(黑色)。
在这里插入图片描述
投影 Projection:碰撞约束修正粒子的预测位置,并相应调整其速度。

Collision constraints 碰撞约束

设置碰撞后,解算器将开始使用上述 3 个步骤为粒子生成碰撞约束(也称为接触)。 Obi 使用称为“推测接触”的碰撞检测范例。这意味着在粒子之间或碰撞器与粒子之间发生任何实际碰撞之前就会产生接触。因此,碰撞过程中粒子的轨迹在碰撞实际发生之前就得到了纠正,并且隧道问题(大多数碰撞引擎中存在的众所周知的子弹槽纸问题)几乎不存在。即使在高速下也能检测并解决接触问题。此外,如果同一帧中发生多次碰撞,则不需要 TOI(碰撞时间)排序。

有些接触永远都是“推测性的”,它们没有经过广泛的阶段,也从未得到真正的解决。其他一些最终进展为真正的碰撞,并发生碰撞解决。

可以为同一帧中的给定粒子生成多个接触。然后,必须考虑推测性接触,如果结果是实际冲突则予以解决。然而,不幸的是,按顺序(一个接一个)解决接触可能会导致先前解决的接触再次发生冲突。如下图所示: 在步骤 1 中,生成了两个推测接触,因为根据橙色粒子当前的速度,几乎可以肯定它会在下一帧中与灰色对撞机发生碰撞。在步骤 2 中,两个推测性接触都会发展为必须解决的实际冲突。第 3 步展示了如何首先解决右侧碰撞。在第 4 步中,我们解决了左侧的问题,但这会导致右侧的问题再次渗透。我们必须再次解决正确的碰撞(步骤 5),以确保任一接触都不会发生穿透。

在这里插入图片描述
所有这些右、左、右、左……迭代求解都会导致视觉抖动,因为我们看到粒子在两种配置之间跳跃,直到所有碰撞都得到解决(这可能需要大量的迭代)。因此,Obi 允许您决定(与所有约束组一样)必须如何解决冲突:顺序或并行。在并行模式下,所有接触都在同一步骤中独立解决(就好像其他接触不存在一样),并且最终校正计算为其所有单独结果的平均值。这提高了稳定性(消除了由于未解决的碰撞而导致的抖动),但降低了收敛速度(实现零渗透需要更多的迭代),使得在使用低迭代计数时碰撞看起来太“软”。请参阅下图:
在这里插入图片描述
一般经验法则:如果场景中可能同时发生多个碰撞并且抖动是一个问题,请将碰撞约束评估顺序设置为“并行”。如果抖动不是问题和/或您需要更快的收敛,请使用“顺序”评估顺序。粒子-粒子碰撞和粒子-碰撞器碰撞有单独的控件,因此您可以对它们使用不同的方法。您可以在 ObiSolver 检查器中的“粒子碰撞约束参数”和“碰撞约束参数”下找到此设置:
在这里插入图片描述
有关顺序求解与并行求解的更多信息,请参阅 ObiSolver。
在这里插入图片描述
仅使用 3 次迭代和中等摩擦力的顺序和并行接触分辨率比较。人为地增加了抖动以更好地说明差异。

冲击传播 Shock propagation

冲击传播是一种在接触解析过程中内部修改粒子质量的技术,以便堆底部的粒子比顶部的粒子具有更高的有效质量。这导致更快的收敛和更稳定的堆叠。您可以在 ObiSolver 检查器中找到此参数,它针对每个求解器全局应用。当您需要额外的“魅力”来实现颗粒与颗粒的接触时,特别是在创建颗粒材料堆时,请使用此功能。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/127918
推荐阅读
相关标签
  

闽ICP备14008679号