如何化解这种与冲动的肉体碰撞?

How to resolve this physical collision with impulses?

我已经开始编写物理引擎,但陷入了一些解决碰撞的物理问题。假设我有这种情况:

即物体 B 以 1 space units/time 单位的速度向物体 A 移动。 A 和 B 的质量相同,均为 1 个单位。让我们考虑一个完全弹性碰撞.

我在一本书(Game Physics Engine Development)中读到,可以使用 impulse-based 方法来解决碰撞(即找出碰撞后两个物体的线性速度和 angular 速度)。据我了解,它应该像这样工作:

  1. 当物体碰撞时,我得到碰撞点和碰撞法线。
  2. 在碰撞点我认为只有两个点在法线方向碰撞(物体接触的点,即我忽略了两个点的形状bodies) 然后我计算这两个碰撞点的新速度(这很容易做到,例如在 Wikipedia 上找到了一个简单的公式)。
  3. 我发现一个脉冲,当此时应用于两个物体时,它达到了这两个点的计算速度。

当我从物理角度考虑动量动能都需要守恒时,问题就出现了。考虑到这些限制,似乎没有解决方案,因为:

当B与A发生碰撞时,根据弹性碰撞公式,B应完全停止并将其所有动量和动能传递给A。为了保持线性动量守恒,A 必须开始以与碰撞前 B 相同的速度向左线性移动(因为它们具有相同的质量)。所以现在 A 具有与 B 相同的动能,但这意味着 A 不能旋转 因为那会为其增加额外的动能(因为旋转会增加动能以及线性运动),打破了动能守恒定律。然而,物理上正确的解决方案是 A 向左线性移动并随着 B 在此位置碰撞施加扭矩而旋转(我还检查了现实生活中的物体以这种方式表现)。请注意,我们不能带走 A 的线性运动的一些能量并将其添加到旋转中,因为这会破坏线性动量守恒。

唯一“真正”的解决方案是 B 不会完全停止并保持一定的动量,而 A 将同时向左移动和旋转。但这似乎不适用于仅考虑两个碰撞点的基于脉冲的方法,弹性碰撞公式只是说 B 处的点应该停止并且因为 B 不能接收任何扭矩(碰撞发生在它的中间),实现这一点的唯一方法是让 B 停止移动。

所以我错过了什么吗?基于冲动的方法在物理上是不正确的吗?我感谢任何关于如何正确解决冲突的见解和建议。谢谢!

您正在查看的公式适用于两个质点的碰撞。点质量不能有 angular 动量,因此公式中没有该项的空间。

你必须回到第一原则。

假设一条边在一个点上与另一个物体发生碰撞(想想拐角撞到一条边)。然后在该点沿垂直于边缘的方向施加特定的脉冲。 (任何其他方向都需要摩擦力,这将使它成为非弹性碰撞。)相反的冲量沿着相同的矢量传递给另一个物体。向两个物体施加相反的脉冲足以保证动量守恒和 angular 动量。但是能量守恒需要做一些工作。

接下来,当我们传授这种动力时会发生什么?作为this physics answer says, we impart momentum as if the impulse happened to the center of mass. We impart angular momentum equal to the cross product of the impulse and the moment arm (the vector describing how much the impulse misses the center of mass). This will cause the body to start rotating at a rate of the impulse divided by the moment of inertia.

您从质心的运动中获得动能,但也从其旋转中获得 kinetic energy

所以在你的二维碰撞中你现在有以下事实:

  1. 每个物体的质量。
  2. 每个物体的速度。
  3. 每个速度的转动惯量。
  4. 每个物体的 angular 速度。
  5. 每个物体力线的力臂。

您现在可以计算整个系统的动能,作为比冲量大小的函数。与点质量不同,所有这些因素都会影响它,使方程变得复杂。然而,就像质点一样,您将得到一个有 2 个解的二次方程。一种解决方案是 0 脉冲传递(代表碰撞前的系统),另一种是碰撞后的答案。完成对两个系统的动量和 angular 动量的更改。