我开始编写一个物理引擎,但在解决碰撞物理时遇到了困难。假设我有这种情况:
即,物体B以每单位时间1个空间单位的速度朝向物体A。A和B的质量都是1个单位。让我们考虑一个完全弹性碰撞。我在一本书(《游戏物理引擎开发》)中读到可以使用基于冲量的方法来解决碰撞问题(即找出碰撞后两个物体的线性和角速度)。据我所知,它应该像这样工作:
1. 当物体碰撞时,我获取碰撞点和碰撞法线。 2. 在碰撞点处,我只考虑沿法线方向上的两个点碰撞(即物体接触的点,忽略两个物体的形状),并计算这两个碰撞点的新速度(这很容易做到,有一个简单的公式可在Wikipedia上找到)。 3. 找到一个冲量,使其在该点施加于两个物体时,能够实现这两个点的计算速度。
现在问题出现了,当我考虑从物理角度来看,动量和动能都需要被保持不变。有了这些限制,似乎没有解决方案,因为:
当B与A碰撞时,根据弹性碰撞公式,B应该完全停止并将其所有动量和动能转移到A上。为了保持线性动量不变,A随后必须以与碰撞前B相同的速度向左线性移动(因为它们具有相同的质量)。所以现在A拥有与B相同的动能,然而这意味着A不能旋转,因为这会增加额外的动能(旋转也会增加动能以及线性运动),破坏动能守恒。尽管如此,正确的物理解决方案是A同时向左线性移动和旋转,因为在此位置碰撞的B施加扭矩(我还检查过真实物体的行为方式)。请注意,我们不能从A的线性运动中取走一些能量并将其添加到旋转中,因为这会破坏线性动量守恒。
唯一的“真正”解决方案是B不会完全停止,而是保持一些动量,而A将同时向左移动和旋转。但似乎无法使用基于脉冲的方法实现这一点,因为该方法只考虑了两个碰撞点,弹性碰撞公式仅说明B点应该停止,而B不能接收任何扭矩(碰撞发生在其中间),实现这一点的唯一方法是B停止运动。那么我错过了什么吗?基于脉冲的方法是否正确?感谢任何有关如何正确解决碰撞的见解和建议。谢谢!