如何处理同时碰撞,以便处理顺序无关紧要?

时间:2012-09-25 03:52:55

标签: collision-detection

假设有3个球同时发生碰撞。我发现我解决碰撞的顺序会对最终结果产生影响,而这种结果是没有意义的。

为了解释并保持简单,请考虑1D中的3个球,所有质量相同,弹性碰撞。顶部的数字是速度,箭头是方向。假设他们目前都在互相接触,即在碰撞中

 -->2   -->1 <---3
   O     O       O
   A     B       C

这表示球A从后面击球B,球B和C正面碰撞。

现在如果我们首先用B解决碰撞A,然后用C解决碰撞B,但是使用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

你可以看到最终状态不同。

我做错了什么?更重要的是,处理这个问题的正确方法是什么?

对于有许多球的模拟以及与墙壁的碰撞,这种情况非常有可能。 (例如,球击中墙壁并同时被另一个球击中,会产生与上述相同的问题,顺序会产生不同的结果)。

目前我使用循环迭代所有对象并一次解决每个对象之间的冲突。因此我使用的顺序是任意的(顺序只是数组中球的索引)。

1 个答案:

答案 0 :(得分:4)

您没有做错任何事,但您的碰撞响应尚未完成。 在第一个A B仍在碰撞,而在第二个B B和C仍在碰撞。 所以你应该解决这些冲突。

如果你发生碰撞,你会得到相同的答案A <--3 , B-->1, C-->2

虽然在你的模拟中你的物体可以同时碰撞,但实际上它们永远不会碰撞。碰撞之间总会有一点时间(可能非常少)。 因此,为简单起见,物理引擎通过成对解决冲但他们应该这样做,直到所有对分开。这需要不止一次迭代。如果您尝试模拟堆叠体(如配置),则迭代次数可能会变得非常高。

你可以检查

how to sort objects for Guendelman shock propagation?

有关减少迭代的更多信息。