假设有 3 个球同时碰撞。我发现解决冲突的顺序会对最终结果产生影响,这当然没有意义。
为了解释和保持简单,考虑 3 个 1D 球,质量相同,弹性碰撞。顶部的数字是速度,箭头是方向。假设他们目前都在互相接触,即在碰撞中
-->2 -->1 <---3
O O O
A B C
这表明球 A 从后面击球 B,球 B 和 C 正面相撞。
现在,如果我们先解决 A 与 B 的碰撞,然后再解决 B 与 C 的碰撞,但使用 B 的新速度,如果我们改为解决 B 与 C 的碰撞,然后再解决 A 与 B 的碰撞,这应该会给出相同的结果(使用 B) 的新速度。
但事实并非如此。
第一种情况:A 和 B,然后是 B 和 C
A 和 B 给出
-->1 -->2
O O
A B
和 B 与 C 给出(但使用上面的 2 的新 B 速度,而不是 1 的原始速度)
<--3 -->2
O O
B C
因此最终结果是
-->1 <--3 ---->2
O O O
A B C
第二种情况:B 和 C,然后是 A 和 B
B 和 C 给出
<--3 --->1
O O
B C
A 与 B (但使用上面 3 的 B 的新速度,而不是原来的 1)
<--3 -->2
O O
A B
因此最终结果是
<--3 -->2 ---->1
O O O
A B C
你可以看到最终的状态是不同的。
我究竟做错了什么?更重要的是,处理这个问题的正确方法是什么?
对于有许多球的模拟以及与墙壁的碰撞,这种情况是非常可能的。(例如,一个球撞到墙上,同时被另一个球击中,会产生与上述相同的问题,顺序会产生不同的结果)。
目前,我使用循环遍历所有对象并一次解决每两个对象之间的冲突。因此我使用的顺序是任意的(顺序只是数组中球的索引)。