Определение того, должны ли два быстро движущихся объекта быть представлены для проверки столкновения

8

У меня работает базовый 2D физический движок. Это в значительной степени движок частиц, просто используются базовые формы, такие как AABB и круги, поэтому вращение невозможно. Я внедрил CCD, который может дать точные значения TOI для двух быстро движущихся объектов, и все работает гладко.

Теперь моя проблема в том, что я не могу понять, как определить, следует ли вообще проверять два быстро движущихся объекта друг против друга. Я использую четырехугольное дерево для пространственного разделения и для каждого быстро движущегося объекта, я проверяю его по объектам в каждой ячейке, которую оно проходит. Это прекрасно работает для определения столкновения со статической геометрией, но это означает, что любой другой быстро движущийся объект, который может столкнуться с ним, но не находится ни в одной из проверяемых ячеек, никогда не рассматривается.

Единственное решение, которое я могу придумать, - это либо иметь достаточно большие ячейки и скрестить пальцы, чтобы этого было достаточно, либо реализовать какой-то алгоритм перебора. Есть ли правильный способ борьбы с этим, может быть, кто-то решил эту проблему эффективным способом. Или, может быть, есть лучший способ разделения пространства, который объясняет это?

Вот схема:

введите описание изображения здесь

Объекты A и B «зоны воздействия» пересекаются, их следует проверять друг против друга. Но то, как я сейчас проверяю коллизии, не учитывает этого. Опять же, я могу подумать о нескольких решениях этого, например, о том, чтобы на самом деле проверить, пересекаются ли пути объектов, когда их скорость превышает x, или что-то в этом роде, но это похоже на взлом, и это бесполезно пытаться реализовать.

Dreta
источник
Не могли бы вы привести пример сценария, в котором ваш метод дает сбой?
Анко
1
Я думаю, что это будет выглядеть так: объект A и B находятся в этой конфигурации: [A] [] [B]. А идет вправо, а Б - влево. Они идут быстро. Проверка на столкновение происходит следующим образом: следующая ячейка пуста для A? Да, в центральной ячейке ничего нет. Следующая ячейка пуста для B? Да. Так что никаких столкновений. Но реальная физика показала бы, что А и В могут столкнуться (особенно в этой одномерной игре, которую я описываю;)
Cystack
@ Cystack Я реализовал CCD. Описанная вами ситуация не является проблемой. Два объекта идут прямо друг на друга, реализация, которую я описал, соберет это и решит.
dreta
Физика ситуации понятна. Допустим, вы можете опознать объект как «быстро движущийся» раньше времени. Затем, когда вы выполняете проверку столкновения, вам нужно проверить не только ячейку, в которой находится объект, но и все ячейки, через которые он прошел на последнем шаге времени. Таким образом, каждый быстро движущийся объект на самом деле имеет несколько местоположений, например, всю зеленую полосу, которую вы нарисовали на изображении выше.
TheJollySin
@theJollySin Я уже описал решение, которое вы предлагаете, это взлом, особый случай, я ищу общее решение, если оно есть.
dreta

Ответы:

5

Проблема, о которой вы говорите, часто называется «обнаружением столкновений в широкой фазе», и ваше решение - это «развернутый объем», а не хак, просто как это делается (просто возьмите AABB объекта, включая начало и конец движения и используйте это для столкновения - хотя вещи становятся немного хитрыми с вращениями).

Тогда алгоритм перехода к широкофазному обнаружению столкновений, который делает это быстрым, называется «Sweep and Prune».

Джефф Гейтс
источник
Я отказался от SAP до того, как возникла эта проблема. Я делаю это в JavaScript, который делает накладные расходы на списки заметными, а массивы также могут стать ненадежными, когда дело доходит до производительности. Думаю, мне придется пересмотреть вещи. Спасибо, алгоритм действительно решает проблему.
Dreta