AABB против Circle — наоборот, используя теорему о отдельной оси

#math #3d #2d #physics #collision

#математика #3D #2d #физика #столкновение

Вопрос:

Я следую этому руководству по обработке столкновений в моей 2d игре, в этом руководстве объясняется о столкновении, используемом в одной из моих любимых игр «N». Как они более эффективно использовали теорему о раздельной оси для столкновения между AABB против AABB и AABB против Circle. http://www.metanetsoftware.com/technique/tutorialA.html . Я понимаю реализацию обработки столкновений AABB и AABBB, но я не мог понять обнаружение столкновений AABB и Circle, особенно в областях Вороного.Совершенно запутался, как / с чего начать.

Обнаружение столкновений AABB vs AABB

  1. Найдите ось вдоль всего ребра, найдя нормаль к каждому ребру.
  2. Спроецируйте все вершины на результирующую ось, конечным результатом должно быть скалярное значение.
  3. Результирующее скалярное значение, в свою очередь, используется для определения того, присутствует столкновение или нет.

Может кто-нибудь, пожалуйста, объяснить, как обрабатывать столкновение AABB vc Circle — наоборот?

Ответ №1:

Поскольку столкновения с окружностью всегда сводятся к сравнению с радиусом (в вашем случае, через проекцию), наличие ближайшего отрезка линии (края многоугольника) и вектора нормали — единственные строительные блоки, которые вам нужны. Вектор нормали легко вычисляется из точек отрезка прямой (что-то вроде единицы (y2-y1, x1-x2)… отрицательная обратная величина наклона). Определение того, какое ребро находится ближе всего, — это строительный блок, который остается. Области Вороного дают нам последний строительный блок.

Вы понимаете столкновения между ограничивающими рамками, выровненными по оси. Я предполагаю, что вы также понимаете столкновения между двумя кругами. Я предполагаю, что вы не понимаете области Вороного. Итак, с чего начать? Диаграммы Вороного. Я настоятельно рекомендую вам найти объяснение в виде диаграммы. Эта ссылка довольно хорошая. Однако, в зависимости от того, насколько вы заблудились, возможно, немного дополнительной информации (серьезно, однако, никакое объяснение не может превзойти визуальное):

Диаграмма Вороного является одной из вездесущих структур данных вычислительной геометрии. В любой книге по вычислительной геометрии будет обсуждаться диаграмма Вороного. Это отвечает на простой вопрос: где находится ближайшее почтовое отделение? Учитывая набор точек на плоскости (почтовые отделения), диаграмма Вороного разделяет плоскость на разные области, каждая из которых содержит одну из точек. Если вы находитесь в определенном регионе, вы знаете, какой пункт (почтовое отделение) находится ближе всего к вам. Если бы вы были кругом, это было бы неплохо для обнаружения столкновений по простой причине: ближайшая точка является наиболее важной для проверки на наличие столкновений.

Обратите внимание, что если вы хотите математически вывести диаграмму Вороного, вы просто рассматриваете все пары точек и вычисляете все делящие пополам линии. Затем вы пересекаете все делящие пополам линии и отбрасываете сегменты, которые не важны, потому что какая-то другая точка ближе к интересующей точке (что происходит на каждом пересечении). Однако это приводит к ужасно неэффективному алгоритму. Эффективная реализация включает в себя еще одну повсеместную вещь в вычислительной геометрии: алгоритм линейной развертки. Ее детали можно найти в другом месте; важным моментом является то, что она предоставляет метод рассмотрения только важных точек на любом этапе алгоритма.

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

Это вообще помогает? Обратная связь приветствуется. Я буду рад прояснить что-либо. Объяснение диаграмм Вороного без визуальных элементов, вероятно, плохая идея.

Комментарии:

1. Объяснение просто потрясающее — Да, у меня есть идея столкновения между двумя кругами и AABB против AABB, теперь я получил представление о том, как работает алгоритм, а также о вашей другой альтернативной рекомендации. Я буду следовать этим пунктам и собираюсь начать писать псевдокод для преобразования этого в действие. Я отправлю свои вопросы как можно скорее. Еще раз благодарю вас за исчерпывающее объяснение.

2. @Anandh: «всеобъемлющий» был моей причиной для беспокойства. Я не смог бы предоставить исчерпывающее объяснение без диаграмм, если бы не потратил много времени на собственно кодирование (код — полезный визуальный элемент, вы не находите?). Кроме того, мое предположение не должно было звучать покровительственно. Вы были бы удивлены, что кто-то может понять столкновения ограничивающих рамок, но не столкновения двух кругов (пока они не подумают об этом, концепция обычно очевидна). Однако будьте терпеливы. Я действительно кое-что выяснил на работе и, возможно, буду занят в течение следующих 6 часов. Я обновлю свой ответ, чтобы ответить на любые вопросы.

3. Звучит заманчиво оценил вашу помощь (помощь новичку), я только начал читать это руководство topcoder.com/tc?module=Staticamp;d1=tutorialsamp;d2=lineSweep если вы найдете какие-либо учебные пособия для начинающих, пожалуйста, поделитесь. Спасибо!

4. @Anandh: Вы пытаетесь реализовать свой собственный с нуля или просто понимаете принципы? Если вы заметили в руководстве N, они разработали области Вороного для фигур, которые у них были, а затем просто использовали предварительно вычисленные области. Не требуется вычисления Вороного «на лету».

5. @ccoakley: Совершенно верно — на самом деле я пытаюсь сначала понять принципы, прежде чем копаться в примерах кода из учебника. Я понял, как столкновение AABB было реализовано в «N», и перенес то же самое в objective C для моей игры для iphone. В основном в N для разных фигур все значимые оси предварительно вычисляются, и то же самое используется для создания мира с использованием информации о форме (тайле). Особенно для нескольких фигур «—= круглые формы = —» Я ничего не мог понять, потому что, не зная лежащей в основе концепции, это довольно сложно.