У меня работает базовый 2D физический движок. Это в значительной степени движок частиц, просто используются базовые формы, такие как AABB и круги, поэтому вращение невозможно. Я внедрил CCD, который может дать точные значения TOI для двух быстро движущихся объектов, и все работает гладко.
Теперь моя проблема в том, что я не могу понять, как определить, следует ли вообще проверять два быстро движущихся объекта друг против друга. Я использую четырехугольное дерево для пространственного разделения и для каждого быстро движущегося объекта, я проверяю его по объектам в каждой ячейке, которую оно проходит. Это прекрасно работает для определения столкновения со статической геометрией, но это означает, что любой другой быстро движущийся объект, который может столкнуться с ним, но не находится ни в одной из проверяемых ячеек, никогда не рассматривается.
Единственное решение, которое я могу придумать, - это либо иметь достаточно большие ячейки и скрестить пальцы, чтобы этого было достаточно, либо реализовать какой-то алгоритм перебора. Есть ли правильный способ борьбы с этим, может быть, кто-то решил эту проблему эффективным способом. Или, может быть, есть лучший способ разделения пространства, который объясняет это?
Вот схема:
Объекты A и B «зоны воздействия» пересекаются, их следует проверять друг против друга. Но то, как я сейчас проверяю коллизии, не учитывает этого. Опять же, я могу подумать о нескольких решениях этого, например, о том, чтобы на самом деле проверить, пересекаются ли пути объектов, когда их скорость превышает x, или что-то в этом роде, но это похоже на взлом, и это бесполезно пытаться реализовать.
Ответы:
Проблема, о которой вы говорите, часто называется «обнаружением столкновений в широкой фазе», и ваше решение - это «развернутый объем», а не хак, просто как это делается (просто возьмите AABB объекта, включая начало и конец движения и используйте это для столкновения - хотя вещи становятся немного хитрыми с вращениями).
Тогда алгоритм перехода к широкофазному обнаружению столкновений, который делает это быстрым, называется «Sweep and Prune».
источник