【问题标题】:How to handle simultaneous collision so that order of processing does not matter?如何处理同时发生的碰撞,以便处理顺序无关紧要?
【发布时间】:2013-04-05 21:00:07
【问题描述】:

假设有 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

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

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

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

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

【问题讨论】:

    标签: collision-detection


    【解决方案1】:

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

    如果你碰撞你会得到相同的答案A &lt;--3 , B--&gt;1, C--&gt;2

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

    你可以检查

    how to sort objects for Guendelman shock propagation?

    了解更多信息以减少迭代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2017-11-01
      相关资源
      最近更新 更多