gpt4 book ai didi

collision-detection - 如何处理同时发生的碰撞,以便处理顺序无关紧要?

转载 作者:行者123 更新时间:2023-12-04 15:24:57 25 4
gpt4 key购买 nike

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

为了解释和保持简单,考虑一维中的 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

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

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

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

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

最佳答案

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

如果您发生碰撞,您将得到相同的答案 A <--3 , B-->1, C-->2
尽管在您的模拟中,您的对象可以同时发生碰撞,但实际上它们永远不会发生碰撞。碰撞之间总会有一点时间(可能非常少)。
因此,为简单起见,物理引擎成对解决碰撞。但是他们应该这样做,直到所有对都分开为止。而这需要不止一次的迭代。如果您尝试模拟堆叠体(如配置),迭代次数可能会变得非常高。

你可以检查

how to sort objects for Guendelman shock propagation?

以获取更多信息以减少迭代。

关于collision-detection - 如何处理同时发生的碰撞,以便处理顺序无关紧要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12575963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com