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 如何选择碰撞形状?
我的经验是三步走:
- 先看物体外形——能用一个 Box 包住吗?能就用 Box。
- 再看运动方式——会滚动吗?会就用 Sphere 或 Capsule。
- 最后看精度需求——必须精确贴合表面吗?只有这时才考虑 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 知识结构图:碰撞检测参数全景
下面这张图总结了本章的核心知识点,帮你快速建立整体认知:
3.6 实战:快速调试流程
当你拿到一个新场景,不知道怎么调碰撞参数时,按这个流程走:
- 第一步:打开 Physics Inspector,检查所有物体的碰撞形状。把 Mesh 换成 Box 或 Capsule,除非必须用 Mesh。
- 第二步:观察物体运动速度。如果速度 > 2 m/s,把 Contact Offset 调到 0.03 - 0.05。
- 第三步:给所有物体设恢复系数 0.3,跑一次仿真。如果物体弹得太厉害,降到 0.1;如果完全不弹,升到 0.5。
- 第四步:检查物体是否在应该滑动的地方卡住了。如果是,降低静摩擦系数;如果物体在斜面上滑得太快,增加动摩擦系数。
记住:没有「万能参数」。每个场景都需要微调。但只要你理解了每个参数背后的物理含义,调试起来就有方向感了。