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

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

Обнаружение коллизий AABB и AABB

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

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


person Sabha B    schedule 27.05.2011    source источник


Ответы (1)


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

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

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

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

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

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

person ccoakley    schedule 27.05.2011
comment
Объяснение просто потрясающее - да, у меня есть идея столкновения между двумя кругами и AABB против AABB, теперь я получил представление о том, как работает алгоритм, а также о других ваших альтернативных рекомендациях. Я буду следовать этим пунктам и собираюсь начать писать псевдо код для преобразования этого в действие. Я опубликую свои вопросы как можно скорее. Еще раз спасибо за исчерпывающее объяснение. - person Sabha B; 27.05.2011
comment
@Anandh: всеобъемлющее было моей причиной для беспокойства. Я не мог дать исчерпывающего объяснения без диаграмм, если только я не потратил много времени на кодирование (код — это полезная визуальная составляющая, не так ли?). Кроме того, мое предположение не должно было звучать покровительственно. Вы были бы удивлены, узнав, что кто-то может понять столкновения ограничивающих рамок, но не столкновения двух кругов (пока они не думают об этом, тогда концепция обычно очевидна). Однако будьте терпеливы. На самом деле я кое-что выяснил на работе и могу быть занят следующие 6 часов. Я обновлю свой ответ, чтобы ответить на любые вопросы. - person ccoakley; 27.05.2011
comment
Звучит хорошо, ценю вашу помощь (помощь новичку), я начал читать этот учебник topcoder.com/tc?module=Static&d1=tutorials&d2=lineSweep, если вы найдете какие-либо учебные пособия для начинающих, поделитесь ими. Спасибо! - person Sabha B; 27.05.2011
comment
@Anandh: Вы пытаетесь реализовать свои собственные с нуля или просто понимаете принципы? Если вы заметили в учебнике N, они разработали области Вороного для фигур, которые у них были, а затем просто использовали предварительно вычисленные области. Никаких расчетов Вороного на лету не требуется. - person ccoakley; 28.05.2011
comment
@ccoakley: Совершенно верно - на самом деле я сначала пытаюсь понять принципы, прежде чем копаться в примере кода N Tutorial. Я понял, как коллизия AABB была реализована в N, и портировал то же самое в Objective C для моей игры для iphone. В основном в N для разных форм все значимые оси предварительно вычисляются, и то же самое используется для создания мира с использованием информации об этой форме (плитке). зная основную концепцию, это довольно сложно. - person Sabha B; 28.05.2011
comment
@ccoakley: Любые рекомендации по этому запросу? - person Sabha B; 31.05.2011
comment
Хороший учебник? К сожалению, не совсем. Я изучал вычислительную геометрию у Субхаша Сури в UCSB. Курс был исключительным. Однако его конспекты лекций на эту тему (cs.ucsb.edu/~suri /cs235/Voronoi.pdf, cs.ucsb.edu/ ~suri/cs235/Intersection.pdf) не работают без его лекций. Я использовал эту книгу (amazon.com/Computational-Geometry-Applications -Mark-Berg/dp/) во время занятий, но у меня уже была теоретическая база благодаря лекциям профессора Сури. Это зависит от того, насколько хорошо вы можете учиться по учебнику. - person ccoakley; 01.06.2011
comment
Круто, я лучше куплю эту книгу и прочитаю, возможно, я смогу найти ответ. Между тем я наткнулся на эту статью sevenson.com.au/actionscript/sat автор обсуждал столкновение между AABB и кругом, вечером попробую. Я буду держать вас в курсе. - person Sabha B; 01.06.2011