Как справиться с одновременным столкновением, чтобы порядок обработки не имел значения?
Предположим, что одновременно сталкиваются 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).
Но это не так.
first case: A with B, followed by B with CА с Б дает
-->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
second case: B with C, followed by A with B
Б с С дает
<--3 --->1
O O
B C
A с B (но используя новую скорость B из 3 выше, а не оригинал 1)
<--3 -->2
O O
A B
Следовательно, конечный результат
<--3 -->2 ---->1
O O O
A B C
Вы можете видеть, что конечное состояние отличается.
Что я делаю неправильно? и что еще более важно, каков правильный способ справиться с этим?
Для моделирования со многими шарами, а также столкновения со стенами, этот случай очень возможен. (например, удар мяча по стене и одновременный удар другим шаром вызовет ту же проблему, что и выше, порядок дает другие результаты).
В настоящее время я использую цикл для перебора всех объектов и устранения коллизий между двумя объектами одновременно. Следовательно, порядок, который я использую, является произвольным (порядок - это просто индекс шара в массиве).