nas*_* Ns 6 collision-detection
假设有3个球同时发生碰撞.我发现我解决碰撞的顺序会对最终结果产生影响,而这种结果在任何情况下都没有意义.
为了解释并保持简单,请考虑1D中的3个球,所有质量相同,弹性碰撞.顶部的数字是速度,箭头是方向.假设他们目前都在互相接触,即在碰撞中
-->2 -->1 <---3
O O O
A B C
Run Code Online (Sandbox Code Playgroud)
这表示球A从后面击球B,球B和C在面上碰撞.
现在,如果我们首先用B解决碰撞A,然后用C解决碰撞B,但是使用B的新速度,如果我们改为解决B与C的碰撞,然后用B解析A,则应该给出相同的结果(使用B)的新速度.
但事实并非如此.
A与B给出
-->1 -->2
O O
A B
Run Code Online (Sandbox Code Playgroud)
和B给出C(但使用上面2的新B速度,而不是1的原始速度)
<--3 -->2
O O
B C
Run Code Online (Sandbox Code Playgroud)
因此最终的结果是
-->1 <--3 ---->2
O O O
A B C
Run Code Online (Sandbox Code Playgroud)
B与C给出
<--3 --->1
O O
B C
Run Code Online (Sandbox Code Playgroud)
A与B(但使用上面3的B的新速度,而不是原始1)
<--3 -->2
O O
A B
Run Code Online (Sandbox Code Playgroud)
因此最终的结果是
<--3 -->2 ---->1
O O O
A B C
Run Code Online (Sandbox Code Playgroud)
你可以看到最终状态不同.
我究竟做错了什么?更重要的是,处理这个问题的正确方法是什么?
对于具有许多球的模拟以及与墙壁的碰撞,这种情况是非常可能的.(例如,球击中墙壁并同时被另一个球击中,会产生与上述相同的问题,顺序给出不同的结果).
目前,我使用循环迭代所有对象并一次解决每个对象之间的冲突.因此我使用的顺序是任意的(顺序只是数组中球的索引).
你没有做错任何事,但你的碰撞响应尚未完成。在第一个中,AB 仍在碰撞,在第二个中,B 和 C 仍在碰撞。所以你应该解决这些冲突。
如果你碰撞你会得到相同的答案A <--3 , B-->1, C-->2
尽管在模拟中,对象可以同时发生碰撞,但实际上它们永远不会发生碰撞。碰撞之间总会有一点时间(可能非常非常短)。因此,为了简单起见,物理引擎成对解决碰撞。但他们应该这样做,直到所有配对都分开为止。这需要不止一次迭代。如果您尝试模拟堆叠体(如配置),迭代次数可能会变得非常高。
你可以检查
获取更多信息以减少迭代。