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

2024-02-18 14:40

本文主要是介绍Unity的Obi插件 自定义绳子、布料的碰撞体属性说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

文章目录

    • 设置碰撞
      • 相互碰撞
      • 自碰撞
      • 表面碰撞
      • 碰撞过滤
      • 刚体 Rigidbodies
    • 怎么运行的
      • Collision constraints 碰撞约束
    • 冲击传播 Shock propagation

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

将 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); 

在下面的动画中,地板碰撞器设置为仅与类别 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 检查器中找到此参数,它针对每个求解器全局应用。当您需要额外的“魅力”来实现颗粒与颗粒的接触时,特别是在创建颗粒材料堆时,请使用此功能。

这篇关于Unity的Obi插件 自定义绳子、布料的碰撞体属性说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/721482

相关文章

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A