UPL7-5——碰撞体缩放,位置,质量

尽量保证物理对象的缩放大小

尽量保证物理对象的缩放为(1,1,1),原因:

PhysX 的很多容差(接触偏移、皮肤宽度、求解步长等)是以 1unit = 1m 的数量级进行默认调参的
把物体做得过小(< ~0.1m)或过大(> ~10–50m),更容易出现穿透、抖动、关节数值不稳等问题
非均匀缩放还会让碰撞几何与惯性张量的计算更复杂,稳定性更差
因此为了避免增加物理计算压力和稳定,建议保证物理对象的缩放不变

尽量保持对象不要距离世界空间原点位置过远

建议保持对象在世界空间的位置尽量接近世界空间原点 (0,0,0),因为距离(0,0,0)越远,32 位浮点的小数精度越差,出现距离现象
距离现象会表现为渲染抖动、碰撞抖动、关节发疯等等

比如:如果是超大场景的游戏,玩家可能走数万米,那么有可能在远处时产生奇怪的物理表现

建议:我们可以秘密地将玩家传送到世界空间的原点(0,0,0),
可以在玩家 进入一个洞穴后出来时,把场景内所有对象(含地形、静态物、刚体、粒子、导航、音源等)整体平移一个偏移量
让玩家还是感受在原来的位置,但实际上,坐标已经回到原点附近

尽量保证合理的质量关系

PhysX 默认把 Unity 中质量当千克(kg),推荐直接使用真实数量级(人 70–90kg,车 1200–2000kg)

或者,在全局统一按常数缩放(例如全部质量 ÷ 80),但要保证所有相关力、阻尼、弹簧参数也随之成比例调整,避免相对量级被破坏

我们应该尽量避免极端质量情况
比如

  • 极小的质量(小于 0.01 kg)
  • 极大的质量(大于 10000 kg)

这样会容易产生数值问题,如果想表现那种大质量不能被推动的物体,可以使用静态碰撞器或者运动学刚体实现,而不是给一个超大质量

常见交互体的 质量比 应尽量小一些,最好控制在 20:1 以下
因为过大的比值会导致冲量极端、速度骤变、解算不稳定等问题

比如,一个人 80 kg,最好和自己产生碰撞对象的质量不要超过 1600 kg
如果存在显著质量差异的对象应尽可能使用碰撞层矩阵配置对他们进行剔除,避免出现问题