Incremental Potential Contact (IPC)

从一个直观的问题开始

想象你有两个果冻(软体)放在桌子上,你用手去挤压它们。会发生什么?

  1. 果冻会变形 - 这是弹性体的本构行为
  2. 两个果冻不会互相穿透 - 这是接触约束
  3. 接触面会产生摩擦力 - 这是摩擦

IPC 要解决的问题就是:如何在仿真中同时处理这三件事?


传统方法的困境

在 IPC 出现之前,大家处理接触问题的思路是这样的:

1. 先计算物体运动(不考虑接触)
2. 检测有没有穿透
3. 如果有穿透,用约束求解器"弹开"物体
4. 重复以上步骤直到不穿透

这种方法有几个问题:

问题说明
时间步不能太大步长太大,物体会"瞬移"穿过彼此(隧道效应)
可能不收敛迭代求解器可能找不到解,仿真就崩了
穿透无法完全避免离散时间步下,总有一瞬间是穿透的

IPC 的核心思想

IPC 的思路完全不同:把接触问题变成能量最小化问题

核心公式

$$ \min_{\mathbf{x}} E_{total}(\mathbf{x}) = E_{elastic}(\mathbf{x}) + E_{contact}(\mathbf{x}) + E_{friction}(\mathbf{x}) $$

能量项含义
$E_{elastic}$弹性势能 - 物体想恢复原状
$E_{contact}$接触势能 - 物体不想互相穿透
$E_{friction}$摩擦势能 - 接触面不想相对滑动

关键洞察:接触不是"约束",而是一种"能量"!


IPC 的三大发明

1. 障碍函数(Barrier Function)

IPC 用一个特殊的函数来描述接触:当距离趋于零时,能量趋于无穷大

$$ E_{contact}(d) = -\kappa \log\left(\frac{d}{\hat{d}}\right) $$

距离 d能量
很远接近 0
接近接触开始上升
几乎接触 (d→0)能量→∞

图像化理解

能量
  ↑
  │                    ╱
  │                  ╱
  │                ╱
  │              ╱
  │            ╱
  │          ╱
  │        ╱
  │      ╱
  │    ╱
  │  ╱
  │╱
  └────────────────────→ 距离 d
     0

好处:优化算法会自动避免穿透,因为穿透的能量代价是无穷大!


2. 连续碰撞检测(CCD)

IPC 在优化过程中使用**线搜索(Line Search)**保证每一步都不穿透:

当前位置 x₀ → 目标位置 x₁

优化步骤:
1. 尝试走一大步 α = 1
2. 检查路上有没有穿透
3. 如果有,缩小步长 α = 0.5, 0.25, 0.125...
4. 直到找到一个安全的步长

** guarantee**:数学上保证离散时间步内也不会穿透!


3. 摩擦的平滑处理

Coulomb 摩擦有个麻烦的地方:在静止/滑动的边界不可微

IPC 的做法:用平滑函数近似这个尖角

$$ E_{friction} = \mu \cdot \text{smooth_abs}(v_{tangential}) $$


IPC 算法流程

For 每个时间步:
    1. 计算外力(重力、用户输入等)
    2. 构建总能量函数:
       E_total = E_elastic + E_contact + E_friction
    3. 用牛顿法/拟牛顿法最小化 E_total
       - 每次迭代用 CCD 保证不穿透
       - 自动处理摩擦
    4. 更新位置

IPC vs 传统方法

特性传统方法 (LCP/MLCP)IPC
穿透可能有微小穿透严格无穿透
时间步小步长可以大步长
收敛性可能不收敛保证收敛
实现难度需要专门的求解器标准优化算法
适用对象主要是刚体刚体 + 软体 + 布料

IPC 的应用场景

场景说明
软体自接触如布料折叠、肌肉挤压
刚体 - 软体耦合如手捏果冻、脚踩草地
大变形仿真如挤压、拉伸、扭转
多物体接触如一堆积木倒塌

IPC 的局限性

局限性说明
计算成本需要迭代优化,比投影法慢
参数调节障碍函数的 κ 需要调节
不适合硬刚体更适合可变形体,纯刚体用 LCP 更快

总结

IPC 的核心贡献

  1. 统一框架 - 接触、摩擦、弹性用一个能量函数描述
  2. 数学保证 - 无条件稳定、严格无穿透
  3. 易于实现 - 基于标准优化算法,不需要专门的接触求解器

一句话理解 IPC:把"不能穿透"这个约束,变成了"穿透能量无穷大"这个能量项,然后用能量最小化来求解。


参考资料

  • 原论文: Incremental Potential Contact: Unified and Unconditional Simulation of Contact and Friction (SIGGRAPH 2020)
  • 代码: https://github.com/ipc-sim/libipc
  • 后续工作: IPC-NEOH, ADMM-IPC 等