【发布时间】:2021-11-29 15:48:33
【问题描述】:
我已经开始编写一个物理引擎,但陷入了解决碰撞的一些物理问题。假设我有这种情况:
即物体 B 以 1 个空间单位/时间单位的速度向物体 A 移动。 A 和 B 的质量相同,均为 1 个单位。让我们考虑一个完全弹性碰撞。
我在一本书(Game Physics Engine Development)中读到,可以使用基于脉冲的方法来解决碰撞问题(即找出线性和碰撞后两个物体的角速度)。据我了解,它应该像这样工作:
- 当身体碰撞时,我得到碰撞点和碰撞法线。
- 在碰撞点我认为只有两个点在法线方向碰撞(身体接触的点,即我忽略了两个身体的形状)并计算这两个碰撞点的新速度(这很容易做到,例如在Wikipedia 上有一个简单的公式)。
- 我发现了一个脉冲,当此时应用于两个物体时,它会达到这两个点的计算速度。
现在问题出现了,当我考虑从物理的角度来看,动量和动能都需要守恒。考虑到这些限制,似乎没有解决方案,因为:
根据弹性碰撞公式,当 B 与 A 碰撞时,B 应完全停止并将其所有动量和动能传递给 A。为了保持线性动量守恒,A 必须以与 B 碰撞前相同的速度开始向左线性移动(因为它们具有相同的质量)。所以现在 A 与 B 具有相同的动能,但这意味着 A 不能旋转,因为这会给它增加额外的动能(因为旋转会增加动能以及线性运动),打破动能守恒。尽管如此,物理上正确的解决方案是 A 向左线性移动并随着 B 在该位置碰撞施加扭矩而旋转(我还检查了现实生活中的物体的行为方式)。请注意,我们不能将 A 的线性运动的一些能量带走并将其添加到旋转中,因为这会破坏线性动量守恒。
唯一“真正”的解决方案是 B 不会完全停止并保持一些动量,而 A 将同时向左移动和旋转。但这似乎不适用于仅考虑两个碰撞点的基于脉冲的方法,弹性碰撞公式只是说 B 处的点应该停止并且因为 B 不能接收任何扭矩(碰撞发生在它的中间),实现这一点的唯一方法是让 B 停止移动。
那么我错过了什么吗?基于脉冲的方法在物理上是不正确的吗?我感谢任何有关如何正确解决冲突的见解和建议。谢谢!
【问题讨论】:
-
据我了解,如果发生这样的碰撞,那么关于线性动量和能量守恒是正确的。但是如果说A应该在碰撞后旋转(由于它的形状),那么B现在不应该也在原地旋转吗? (系统的早期角动量为零,因此如果 A 旋转,碰撞后 B 应该以相反方向旋转 - 角动量守恒)。
-
我认为如果您改为在physics.stackexchange.com 提问,您会得到更好的答案。或者可能在gamedev.stackexchange.com。 (这里问没有错,我只是觉得在这些网站上会有更多人知道答案)。
-
你根本不在正确的网站上。
-
刚发生碰撞后,有三个未知数:A 和 B 的速度以及 A 的角速度。通过求解由冲量守恒形成的系统,角动量(大约惯性中心)和动能(运动+旋转项)。这个系统会有一个解决方案。
-
我想知道这是否是正确的地方,因为存在物理和游戏物理类别,我想我会试一试,但如果我会继续其他网站没有答案,让我们看看。
标签: algorithm game-physics physics