碰撞冲量和相对速度定义
在构建物理引擎时,碰撞响应(Collision Resolution)是最核心的模块之一。而碰撞响应的核心,就是求解冲量标量 。本文将从第一性原理出发,一步步推导 的公式,并深入探讨容易被忽视的相对速度定义及其对仿真稳定性的影响。
1. 问题的定义
假设有两个刚体 和 在世界空间发生碰撞。
- 碰撞点:
- 碰撞法线:(定义为从 指向 的单位向量)
- 质心到碰撞点的向量:,
- 线速度与角速度: 和
我们的目标是找到一个冲量标量 ,当它作用于碰撞点时,能够改变两个物体的速度,使得它们在碰撞后的相对速度符合牛顿碰撞定律。
2. 关键:相对速度的定义
相对速度的定义决定了后续所有公式的符号。为了与工业级引擎(如 Bullet, Box2D)保持一致,我们定义碰撞点处的相对速度 为:
其中,碰撞点在物体上的速度公式为:
为什么这样定义?
当 时,意味着两个物体正在相互靠近(接近速度为负);当 时,意味着物体正在相互远离。
3. 物理约束:牛顿碰撞定律
碰撞后的相对速度 与碰撞前的相对速度 满足以下关系:
其中 是恢复系数(Restitution)。这是我们求解 的唯一方程。
4. 冲量对速度的影响
根据冲量定理,施加冲量 后,物体的速度变化为:
对于物体 A(受力方向为 ):
对于物体 B(受力方向为 ):
5. 核心推导步骤
我们将碰撞后的相对速度展开:
代入速度变化公式 :
提取公因子 :
现在,两边同时点乘法线 ,并利用牛顿碰撞定律 :
6. 最终公式
整理上式,求得 的标准公式:
对比关于《Game Physics in One Weekend》
在《Game Physics in One Weekend》的代码实现中,你会发现分子没有负号。这是因为该书将法线定义为“从 A 指向 B”,且在应用冲量时手动反转了符号。 建议:在实际工程中,务必采用上述标准推导。标准推导保证了只要物体在靠近(点积为负),算出的 就一定是正数,这符合物理直觉,也方便后续处理摩擦力不等式约束。