🧮 非刚体耦合#

Genesis 允许您在同一场景中组合多个连续介质和刚体求解器——例如 MPM 雪与 SPH 水交互、可变形 FEM 组织与手术工具碰撞,或刚体道具溅入颗粒床。所有跨求解器交互都由 gs.engine.Coupler 类协调。

本页解释:

  • Coupler 的架构以及它如何决定哪些求解器对处于活动状态;

  • 控制动量交换的基于脉冲的碰撞响应

  • 摩擦、恢复、柔软度和其他耦合参数的含义;

  • 当前支持的求解器对的快速参考表;以及

  • 显示如何启用/禁用特定交互的使用示例


1. 架构概述#

内部模拟器拥有一个 Coupler 实例,它保存指向每个求解器的指针。在每个子步骤中,模拟器执行:

  1. coupler.preprocess(f)    – 例如 CPIC 的表面操作。

  2. solver.substep_pre_coupling(f) – 推进每个单独的求解器。

  3. coupler.couple(f) – 在求解器之间交换动量。

  4. solver.substep_post_coupling(f) – 碰撞后的求解器后处理。

因为所有求解器字段都驻留在 Taichi 数据结构中,Coupler 可以调用触及多个求解器内存的 Taichi @kernel无需数据拷贝

1.1 激活耦合对#

一对是否处于活动状态在调用 Coupler.build()静态确定一次

self._rigid_mpm = rigid.is_active() and mpm.is_active() and options.rigid_mpm

2. 基于脉冲的碰撞响应#

2.1 符号距离与影响权重#

对于每个候选接触,Coupler 查询刚体几何体的符号距离函数 sdf(p)柔软度参数产生一个平滑的混合权重

\[ \text{influence} = \min\bigl( \exp\!\left(-\dfrac{\;d\;}{\epsilon}\right) ,\;1 \bigr) \]

其中 d 是符号距离,ε = coup_softness。较大的柔软度值使接触区更厚,产生更柔和的脉冲。

2.2 相对速度分解#

对于具有世界速度 v 的粒子/网格节点和刚体速度 vᵣ相对速度

\[ \mathbf r = \mathbf v - \mathbf v_{\text{rigid}}. \]

r 分解为其法向和切向分量

\[ r_n = (\mathbf r \cdot \mathbf n)\,\mathbf n, \quad r_t = \mathbf r - r_n \]

其中 n 是向外的表面法线。

2.3 法向脉冲(恢复)#

如果法向分量是向内的 (\(r_n<0\)),则施加一个脉冲,使得碰撞后

\[ r_n' = -e\,r_n, \quad 0 \le e \le 1, \]

其中 e = coup_restitution恢复系数e=0 是完全非弹性的,e=1 是完全弹性的。

2.4 切向脉冲(库仑摩擦)#

摩擦通过缩放切向分量来实现:

\[ r_t' = \max\!\bigl( 0,\;|r_t| + \mu \, r_n\bigr) \; \dfrac{r_t}{|r_t|}\,, \]

其中 μ = coup_friction。这是库仑摩擦的基于脉冲的变体,确保碰撞后的切向速度不超过粘着极限。

2.5 速度更新与动量传递#

新的粒子/节点速度为

\[ \mathbf v' = \mathbf v_{\text{rigid}} + (r_t' + r_n') \times \text{influence} + \mathbf r\,(1-\text{influence}). \]

动量变化

\[ \Delta\mathbf p = m\,(\mathbf v' - \mathbf v) \]

作为外力应用于刚体

\[ \mathbf F_{\text{rigid}} = -\dfrac{\Delta\mathbf p}{\Delta t}. \]

因此满足牛顿第三定律,刚体对流体冲击做出响应。


3. 支持的求解器对#

方向

说明

MPM ↔ Rigid

基于网格节点的脉冲(支持 CPIC)

MPM ↔ SPH

平均 MPM 单元内的 SPH 粒子速度

MPM ↔ PBD

类似于 SPH 但跳过固定的 PBD 粒子

FEM ↔ Rigid

仅在表面顶点上的碰撞

FEM ↔ MPM

使用 MPM P2G/G2P 权重交换动量

FEM ↔ SPH

实验性 – 仅法向投影

SPH ↔ Rigid

法线的鲁棒侧面翻转处理

PBD ↔ Rigid

位置校正然后速度投影

Tool ↔ MPM

委托给每个 Tool 实体的 collide()

如果表中未列出某个组合,则当前不支持。