PhysX 碰撞形状深度解析:从 Shape 到性能调优

发布时间:2026/8/24 21:08:13
PhysX 碰撞形状深度解析:从 Shape 到性能调优 开场:一场由形状配置引发的"穿模惨案"在最近一个第三人称动作项目的内部测试中,策划反馈了一个诡异的问题:角色高速冲刺时偶尔"瞬移"穿过墙角。直觉上以为是角色胶囊体的高度或半径设错了,但排查下来发现,真正出问题的并非角色本身,而是角色手上那把武器——美术在建模时直接拿了一个 1.2 万面的高模三角网格来描述刀身的物理外形。问题就出在这里:这个三角网格是给"渲染"用的,不能直接拿来做动态物体的碰撞形状。三角网格在 PhysX 里只能用于静态物体(PhysX 文档明确规定三角网格几何只能挂在 static actor 上),挂到动态物体上形状创建会失败并报错——程序不崩,但物体从此"飘在空中没有碰撞",这种 Bug 排查起来极其耗时。这件事促使我系统地整理了一遍 PhysX 中 Shape 与上层引擎 Collider 的关系、碰撞检测的三级管线、各种形状的性能梯度,以及工程中常见的"形状反模式"。下面就是这份笔记的展开版本。一、Shape 与 Collider:同一枚硬币的两面1.1 概念定义在 PhysX 的对象模型里,Shape(PxShape)才是真正的"几何"载体——它持有一个 PxGeometry(球、盒、胶囊、凸包、三角网格、平面、高度场)、一个相对所属刚体的局部变换、材质引用以及若干标志位。而Collider这个词在 PhysX SDK 中并不直接出现,它是 Unity/Unreal 等上层引擎对"挂在节点上、负责碰撞的 Shape 集合"的封装抽象。理解这一层关系很重要:你在 Unity 里调的BoxCollider.s