Столкновение с фигурами, отличными от прямоугольников..?

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

Я попытался проверить, находятся ли четыре точки первых объектов внутри точек второго объекта, но это просто создает коробку (я думаю)

Причина, по которой я чувствую, что у меня возникают трудности с этим, заключается в углах.


person Community    schedule 19.11.2010    source источник
comment
Вы можете проверить, пересекается ли линия между двумя точками в одной фигуре с линией между двумя точками в другой фигуре. Вы можете перебирать все соседние узлы в фигурах. Это даст наиболее точное обнаружение столкновений, если фигуры не находятся рядом.   -  person bhavinp    schedule 19.11.2010
comment
@bhavinp Я вижу; Мне нужно выяснить, как лучше всего проверить столкновение строк. Я предполагаю, что мне придется использовать своего рода наклон?   -  person    schedule 19.11.2010
comment
@Robert Fratto Создайте функцию для создания отрезка с использованием двух точек. Затем создайте еще одну функцию, чтобы проверить, пересекаются ли эти отрезки. Это должна быть простая линейная алгебра, или вы, вероятно, можете найти онлайн-ресурсы, которые помогут с этим. Затем вам просто нужно проверить соседние точки для каждой вершины для обеих фигур.   -  person bhavinp    schedule 20.11.2010
comment
@Robert Fratto Примечание. Один из способов, который я могу придумать, - это создать линию, используя две точки, а затем решить с помощью матрицы. Если бы вы могли найти API для матричных вычислений, это было бы полезно. Затем, если есть решение матрицы (есть пересечение), просто проверьте, находится ли эта точка пересечения в поле.   -  person bhavinp    schedule 20.11.2010
comment
Выполнение проверок пересечения линия-линия для всех пар отрезков прямой (а) неэффективно и (б) в общем случае не работает: если один многоугольник полностью содержится в другом, то многоугольники пересекаются без пересечения каких-либо их отрезков. .   -  person Gareth Rees    schedule 20.11.2010
comment
Однако, если вы настаиваете на решении этого путем пересечения линии/линии, тогда см. этот вопрос.   -  person Gareth Rees    schedule 20.11.2010
comment
При проверке некоторых вещей в игре мне нужно будет проверять столкновения только с одной стороны объекта. Чтобы проверить это, я использовал наклон между двумя точками на второй линии и посмотрел, совпадает ли он с наклоном. (у меня тоже так, чтобы наклон был только между двумя точками на второй линии)   -  person    schedule 20.11.2010


Ответы (1)


Вы пытаетесь столкнуть движущийся выпуклый многоугольник (ваш «ромб») с другим движущимся выпуклым многоугольником, верно? Что-то вроде этого:

два движущихся ромба

Ваш первый шаг должен состоять в том, чтобы преобразовать задачу в эквивалентную, в которой один из полигонов является стационарным:

один ромб движется с разницей скоростей, другой ромб неподвижен

Затем вы можете преобразовать движущийся многоугольник в «вал», который покрывает область, охватываемую движущимся многоугольником. Это легко сделать: если у исходного многоугольника n сторон, то у вала есть n + 2 стороны, причем две дополнительные стороны имеют ту же длину и направление, что и исходный многоугольник. вектор движения. Вы найдете, куда вставить эти новые стороны, отсортировав вершины в соответствии с их компонентами, которые ортогональны вектору движения, и вставив новые стороны в максимумы.

движущийся многоугольник, преобразованный в вал

Теперь вы свели проблему к статическому полигону против статического полигона. Взгляните на удобную таблицу алгоритмов коллизий, предоставленную realtimerendering.com, и следуйте ссылкам , мы видим, что нам нужно использовать тест разделительной оси, например, как описано в разделе 3 эта статья Дэвида Эберли.

В двух измерениях два выпуклых многоугольника не пересекаются, если мы можем найти разделяющую ось, линию, такую, что один многоугольник приходится на одну сторону линии, а другой многоугольник — на другую:

два выпуклых многоугольника и ось, которая их разделяет

Если нам задано направление, мы можем легко обнаружить, существует ли разделяющая ось, которая проходит в этом направлении, спроецировав два многоугольника на линию, идущую перпендикулярно этому направлению, и посмотрев, не пересекаются ли эти проекции:

два выпуклых многоугольника, спроецированные на прямую, не пересекаются, что свидетельствует о наличии разделяющей оси

Откуда мы знаем, в каком направлении пойдет разделяющая ось? Итак, если существует любая разделяющая ось, то есть ось, которая проходит параллельно одной из сторон одного из выпуклых многоугольников (см. Eberly, стр. 3). Таким образом, нужно проверить только небольшой набор направлений, и если вы проверили их все, не найдя разделяющую ось, то два многоугольника пересекаются (и, следовательно, исходные движущиеся объекты сталкиваются).

Есть много улучшений и оптимизаций, которые вы можете сделать, конечно, не ограничиваясь этим:

  1. Прежде чем выполнять полный тест движущегося многоугольника/многоугольника, выполните более простой тест, такой как круг/круг, чтобы вы могли быстро отклонить простые случаи.
  2. Используйте какую-нибудь схему пространственного разделения, такую ​​как quadtrees, чтобы тестировать только те объекты, которые находятся достаточно близко, чтобы они могли столкнуться.
  3. «Кэширование свидетелей» — если линия разделяет два объекта в момент времени t, вполне вероятно, что она продолжает разделять их и в момент времени t + δ, поэтому стоит запомнить разделяющую ось, которую вы нашли, и попробуйте сначала в следующий раз (см. Rabbitz, "Быстрое обнаружение столкновений движущихся выпуклых многогранников" в Graphics Gems IV).

Но не слишком беспокойтесь об оптимизации: сначала сделайте все правильно, будучи уверенными, что позже вы сможете ускорить ее.

person Gareth Rees    schedule 19.11.2010