3. 碰撞检测与接触参数

碰撞检测,说白了就是让仿真世界里的物体知道「我碰到谁了」。在 Isaac Sim 里,这一步做不好,后面的物理响应全是错的。我刚开始用 PhysX 时,就吃过碰撞形状选错的亏——一个简单的传送带仿真,因为用了 Mesh 碰撞,直接卡成幻灯片。

这一章,我们就把碰撞相关的几个核心参数掰开揉碎讲清楚。

3.1 碰撞形状:选对「骨架」比什么都重要

PhysX 支持四种基本碰撞形状:Box、Sphere、Capsule 和 Mesh。每种形状的计算开销和适用场景完全不同。

碰撞形状 计算开销 典型场景 我的建议
Box 极低 墙壁、地板、箱子、货架 能用 Box 就别用别的
Sphere 极低 球体、滚珠、关节末端 滚动场景首选
Capsule 低 机械臂连杆、人体肢体 长条状物体最优解
Mesh 高 复杂曲面、异形零件 非必要不使用

核心原则:碰撞形状越简单,仿真跑得越快。Mesh 碰撞虽然最精确,但每帧都要做三角面片级别的检测,开销是 Box 的几十倍。

我在项目中遇到过这样一个案例:一个抓取仿真,机械臂末端用了精细的 Mesh 碰撞,结果 50 个物体同时掉落时,仿真速度直接掉到 0.3x。换成 Capsule 后,速度回到 1.0x,抓取成功率反而更高了——因为碰撞检测更稳定了。

3.1.1 如何选择碰撞形状?

我的经验是三步走:

  1. 先看物体外形——能用一个 Box 包住吗?能就用 Box。
  2. 再看运动方式——会滚动吗?会就用 Sphere 或 Capsule。
  3. 最后看精度需求——必须精确贴合表面吗?只有这时才考虑 Mesh。

小技巧:在 Isaac Sim 的 Physics Inspector 里,可以实时查看每个物体的碰撞形状。打开 Window > Physics > Physics Inspector,勾选 Show Collision Shapes,就能看到绿色的碰撞体线框。如果线框比视觉模型大一圈,说明碰撞形状选得「偏保守」——这在大多数场景下反而是好事。

3.2 接触偏移量:别让物体「穿模」

接触偏移量(Contact Offset)是个容易被忽略的参数。它决定了 PhysX 在物体表面外多少距离就开始「准备」碰撞响应。

默认值是 0.02 米(2 厘米)。什么意思呢?两个物体实际距离还有 2 厘米时,PhysX 就已经开始计算接触点了。这个「提前量」是为了防止物体高速运动时直接穿透。

注意:接触偏移量不是「碰撞体膨胀」。它不会改变物体的视觉大小,只是让碰撞检测更早触发。偏移量设得太大,物体会「隔空碰撞」;设得太小,高速物体会直接穿模。

我曾经调试一个高速传送带仿真时,零件以 5 m/s 的速度落在传送带上。默认的 0.02 偏移量完全不够,零件直接穿过传送带掉到地底下去了。把偏移量调到 0.05 后,问题解决。

调整方法很简单:在物体的 PhysX Collider 组件里,找到 Contact Offset 参数。一般建议值:

  • 低速场景(< 1 m/s):0.01 - 0.02
  • 中速场景(1 - 5 m/s):0.02 - 0.05
  • 高速场景(> 5 m/s):0.05 - 0.10

3.3 恢复系数:控制「弹不弹」

恢复系数(Restitution)决定了物体碰撞后的反弹程度。取值范围 0.0 到 1.0。

  • 0.0:完全非弹性碰撞——撞上就粘住,像两团泥巴。
  • 1.0:完全弹性碰撞——能量无损反弹,像理想中的台球。
  • 0.3 - 0.5:大多数工业零件的典型值。

嗯,这里要注意:PhysX 的恢复系数不是简单的「两物体取平均」。它用的是 min(restitution1, restitution2) 规则。也就是说,两个物体碰撞时,取较小的那个恢复系数。

举个例子:一个恢复系数 0.8 的钢球,撞上一个恢复系数 0.2 的橡胶垫。最终效果是 0.2——几乎不弹。很多新手在这里踩坑,以为会取平均或最大值。

我建议你在调试时,先给所有物体设一个统一的恢复系数(比如 0.3),跑通后再逐个调整。这样能快速定位问题出在哪个物体上。

3.4 摩擦系数:静摩擦与动摩擦

PhysX 的摩擦模型分两种:静摩擦(Static Friction)和动摩擦(Dynamic Friction)。

摩擦类型 含义 典型值(金属对金属)
静摩擦 物体从静止到开始滑动所需的力 0.5 - 0.8
动摩擦 物体滑动过程中受到的阻力 0.3 - 0.5

你想想看,为什么要有两个值?因为现实世界中,推动一个静止的箱子比推一个已经在滑动的箱子要费力。静摩擦就是那个「启动阻力」,动摩擦是「维持阻力」。

在 Isaac Sim 里,摩擦系数的设置位置和恢复系数一样,都在 PhysX Collider 组件里。两个物体碰撞时,摩擦系数取 sqrt(friction1 * friction2)——几何平均值。

调试技巧:如果你发现物体在斜面上「滑不动」,先检查静摩擦系数是不是设得太大了。我一般从 0.2 开始调,逐步增加直到行为符合预期。另外,动摩擦系数不要超过静摩擦系数——这在物理上是不合理的。

3.5 知识结构图:碰撞检测参数全景

下面这张图总结了本章的核心知识点,帮你快速建立整体认知:

碰撞检测与接触参数全景图 碰撞检测参数 碰撞形状 接触偏移量 恢复系数 摩擦系数 Box Sphere Capsule Mesh 默认 0.02m 高速场景需增大 范围 0.0 - 1.0 取 min 规则 静摩擦 / 动摩擦 几何平均 sqrt 核心原则 简单形状优先 → 偏移量匹配速度 → 恢复系数取小 → 摩擦系数分静动

3.6 实战:快速调试流程

当你拿到一个新场景,不知道怎么调碰撞参数时,按这个流程走:

  1. 第一步:打开 Physics Inspector,检查所有物体的碰撞形状。把 Mesh 换成 Box 或 Capsule,除非必须用 Mesh。
  2. 第二步:观察物体运动速度。如果速度 > 2 m/s,把 Contact Offset 调到 0.03 - 0.05。
  3. 第三步:给所有物体设恢复系数 0.3,跑一次仿真。如果物体弹得太厉害,降到 0.1;如果完全不弹,升到 0.5。
  4. 第四步:检查物体是否在应该滑动的地方卡住了。如果是,降低静摩擦系数;如果物体在斜面上滑得太快,增加动摩擦系数。

记住:没有「万能参数」。每个场景都需要微调。但只要你理解了每个参数背后的物理含义,调试起来就有方向感了。