假设有3个球同时碰撞。我发现解决冲突的顺序会对最终结果产生影响,这当然没有意义。
为了解释和简单起见,考虑 1D 中的 3 个球,质量相同,弹性碰撞。顶部的数字是速度,箭头是方向。假设它们当前都互相接触,即发生碰撞
-->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 给出(但使用上面的新 B 速度 2,而不是原始速度 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
可以看到最终的状态是不同的。
我究竟做错了什么?更重要的是,处理这个问题的正确方法是什么?
对于许多球的模拟以及与墙壁的碰撞,这种情况是很有可能的。
(例如,球击中墙壁并同时被另一个球击中,会产生与上面相同的问题,顺序给出不同的结果)。
目前,我使用循环来迭代所有对象并一次解决每个对象之间的冲突。因此,我使用的顺序是任意的(顺序只是数组中球的索引)。