Введение

Термин в информатике
обнаружение столкновений в вычислительной геометрии

Обнаружение столкновений — это вычислительная задача определения пересечения двух или более пространственных объектов, чаще всего объектов компьютерной графики. Она находит применение в различных областях информатики, в первую очередь в компьютерной графике, компьютерных играх, компьютерном моделировании, робототехнике и вычислительной физике. Обнаружение столкновений является классической задачей вычислительной геометрии. Алгоритмы обнаружения столкновений можно классифицировать в зависимости от того, работают они с двумерными или трехмерными пространственными объектами.

Обзор

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

Обнаружение столкновений в компьютерном моделировании

Физические симуляторы различаются по способу реагирования на столкновения. Некоторые используют мягкость материала для вычисления силы, которая разрешает столкновение в последующих шагах времени, подобно тому, как это происходит в реальности. Это очень ресурсоемко для процессора при работе с материалами с низкой мягкостью. Другие симуляторы оценивают время столкновения с помощью линейной интерполяции, откатывают симуляцию и рассчитывают столкновение, используя более абстрактные методы, основанные на законах сохранения. Некоторые используют итерации линейной интерполяции (метод Ньютона) для вычисления времени столкновения с гораздо большей точностью, чем остальная часть симуляции. Обнаружение столкновений использует временную когерентность, чтобы обеспечить еще более мелкие шаги по времени без существенного увеличения нагрузки на процессор, например, в системах управления воздушным движением. После неупругого столкновения могут возникать особые состояния скольжения и состояния покоя, и, например, Open Dynamics Engine использует ограничения для их моделирования. Ограничения исключают инерцию и, следовательно, нестабильность. Реализация состояния покоя с помощью графа сцен позволяет избежать смещения. Иными словами, физические симуляторы обычно работают одним из двух способов: когда столкновение обнаруживается a posteriori (после его возникновения) или a priori (до его возникновения). Помимо различия между a posteriori и a priori, почти все современные алгоритмы обнаружения столкновений организованы в иерархию алгоритмов. Часто вместо терминов a posteriori и a priori используются термины "дискретный" и "непрерывный".

A posteriori (дискретное) против a priori (непрерывное)

В случае a posteriori физическое моделирование продвигается на небольшой шаг, после чего проверяется, пересекаются ли какие-либо объекты или кажутся пересекающимися. На каждом шаге моделирования создается список всех пересекающихся тел, а положения и траектории этих объектов "фиксируются" для учета столкновения. Этот метод называется a posteriori, поскольку он обычно пропускает фактический момент столкновения и обнаруживает столкновение только после того, как оно произошло. В априорных методах используется алгоритм обнаружения столкновений, способный с высокой точностью предсказывать траектории физических тел. Моменты столкновения вычисляются с высокой точностью, и физические тела никогда не проникают друг в друга. Это называется априорным, потому что алгоритм обнаружения столкновений рассчитывает моменты столкновения до обновления конфигурации физических тел. Основные преимущества методов a posteriori заключаются в следующем. В этом случае алгоритму обнаружения столкновений не требуется учитывать множество физических переменных; алгоритму передается простой список физических тел, и программа возвращает список пересекающихся тел. Алгоритму обнаружения столкновений не нужно понимать трение, упругие столкновения или, что еще хуже, неупругие столкновения и деформируемые тела. Кроме того, алгоритмы a posteriori по сути на одно измерение проще, чем алгоритмы a priori. Алгоритму a priori необходимо учитывать переменную времени, которой нет в задаче a posteriori. С другой стороны, алгоритмы a posteriori вызывают проблемы на этапе "фиксации", когда необходимо исправить пересечения (которые физически некорректны). Кроме того, если дискретный шаг слишком велик, столкновение может остаться незамеченным, в результате чего объект может пройти сквозь другой, если он достаточно быстрый или маленький. Преимущества априорных алгоритмов – повышенная точность и стабильность. Отделить физическое моделирование от алгоритма обнаружения столкновений сложно (но не невозможно). Однако во всех случаях, кроме самых простых, задача определения времени столкновения двух тел (при заданных начальных данных) не имеет аналитического решения – обычно используется численный метод поиска корней. Некоторые объекты находятся в состоянии покоящегося контакта, то есть в столкновении, но не отскакивают и не проникают друг в друга, например, ваза, стоящая на столе. Во всех случаях покоящийся контакт требует специальной обработки: если два объекта сталкиваются (a posteriori) или скользят (a priori), и их относительное движение ниже определенного порога, трение переходит в трение покоя, и оба объекта располагаются в одной и той же ветке графа сцены.

Оптимизация

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

Использование временной согласованности

Во многих приложениях конфигурация физических тел от одного временного шага к следующему меняется незначительно. Многие объекты могут вообще не перемещаться. Алгоритмы были разработаны таким образом, чтобы вычисления, выполненные на предыдущем временном шаге, можно было повторно использовать на текущем, что обеспечивает более быстрое завершение расчетов. На уровне грубого обнаружения столкновений задача состоит в поиске пар объектов, которые потенциально могут пересекаться. Эти пары потребуют дальнейшего анализа. Одним из первых высокопроизводительных алгоритмов для этого был разработан Мингом С. Лином в Калифорнийском университете в Беркли, который предложил использовать ориентированные по осям ограничивающие прямоугольники (bounding boxes) для всех n тел в сцене. Каждый прямоугольник представлен произведением трех интервалов (то есть прямоугольник будет выглядеть как ). Распространенным алгоритмом обнаружения столкновений ограничивающих прямоугольников является метод "прометание и отсечение" (sweep and prune). Обратите внимание, что два таких прямоугольника, и , пересекаются тогда и только тогда, когда пересекается , пересекается и пересекается . Предполагается, что от одного временного шага к следующему, если и пересекаются, то весьма вероятно, что они будут пересекаться и на следующем шаге. Аналогично, если они не пересекались на предыдущем шаге, то, скорее всего, не будут пересекаться и в дальнейшем. Таким образом, мы сводим задачу к отслеживанию, от кадра к кадру, того, какие интервалы пересекаются. У нас есть три списка интервалов (по одному для каждой оси), и все списки имеют одинаковую длину (поскольку каждый список имеет длину , равную количеству ограничивающих прямоугольников). В каждом списке каждый интервал может пересекаться со всеми остальными интервалами в этом списке. Следовательно, для каждого списка у нас будет матрица из нулей и единиц: равна 1, если интервалы и пересекаются, и 0, если они не пересекаются. Согласно нашему предположению, матрица, связанная со списком интервалов, останется практически неизменной от одного временного шага к следующему. Чтобы использовать это, список интервалов фактически хранится как список помеченных конечных точек. Каждый элемент списка содержит координату конечной точки интервала, а также уникальное целое число, идентифицирующее этот интервал. Затем мы сортируем список по координатам и обновляем матрицу в процессе сортировки. Несложно поверить, что этот алгоритм будет работать относительно быстро, если конфигурация ограничивающих прямоугольников действительно не меняется существенно от одного временного шага к следующему. В случае деформируемых тел, таких как симуляция ткани, может быть невозможно использовать более специфичный алгоритм попарного отсечения, как обсуждается ниже, и алгоритм отсечения n тел будет наилучшим решением. Если можно установить верхнюю границу на скорость физических тел в сцене, то пары объектов можно отсечь на основе их начального расстояния и размера временного шага.

Паральная обрезка

После того, как мы выбрали пару физических тел для дальнейшего исследования, нам нужно тщательнее проверять столкновения. Однако во многих приложениях отдельные объекты (если они не слишком деформируемы) описываются набором меньших примитивов, в основном треугольников. Итак, теперь у нас есть два набора треугольников, и (для простоты будем считать, что каждый набор содержит одинаковое количество треугольников). Очевидное решение – проверить все треугольники на предмет столкновений со всеми треугольниками , но это потребует сравнений, что крайне неэффективно. Если возможно, желательно использовать алгоритм отсечения, чтобы уменьшить количество пар треугольников, которые необходимо проверять. Наиболее широко используемое семейство алгоритмов известно как метод иерархических ограничивающих объемов. В качестве предварительного этапа обработки для каждого объекта (в нашем примере, и ) мы вычислим иерархию ограничивающих объемов. Затем, на каждом шаге времени, когда нам нужно проверить столкновения между и , иерархические ограничивающие объемы будут использоваться для уменьшения количества рассматриваемых пар треугольников. Для простоты приведем пример с использованием ограничивающих сфер, хотя отмечено, что сферы нежелательны во многих случаях. Если – это набор треугольников, мы можем предварительно вычислить ограничивающую сферу . Существует множество способов выбора , мы лишь предполагаем, что – это сфера, которая полностью содержит и при этом имеет минимальный размер. Заранее мы можем вычислить и . Очевидно, если эти две сферы не пересекаются (и это очень легко проверить), то и с также не пересекаются. Однако это не намного лучше, чем алгоритм отсечения для n тел. Если – это набор треугольников, то мы можем разделить его на две половины, и . Мы можем сделать это для и , и вычислить (заранее) ограничивающие сферы и . Надежда заключается в том, что эти ограничивающие сферы значительно меньше, чем и , и если, например, и не пересекаются, то нет смысла проверять ни один треугольник из с каким-либо треугольником из . В качестве предварительного вычисления мы можем взять каждое физическое тело (представленное набором треугольников) и рекурсивно разложить его в двоичное дерево, где каждый узел представляет собой набор треугольников, а его два дочерних узла представляют и . На каждом узле дерева мы можем предварительно вычислить ограничивающую сферу . Когда придет время проверять пару объектов на столкновение, их деревья ограничивающих сфер могут быть использованы для исключения многих пар треугольников. Многие варианты алгоритмов получаются путем выбора чего-то отличного от сферы для . Если выбирать ограничивающие ящики, выровненные по осям, то получатся AABBTrees. Ориентированные деревья ограничивающих ящиков называются OBBTrees. Некоторые деревья легче обновлять, если изменяется базовый объект. Некоторые деревья могут вмещать примитивы более высокого порядка, такие как сплайны, вместо простых треугольников.

Точная обнаружение пары столкновений

После того, как мы закончим отсечение, у нас останется несколько пар кандидатов для проверки точного обнаружения столкновений. Важное наблюдение состоит в том, что для любых двух выпуклых объектов, не пересекающихся, можно найти плоскость в пространстве, такую что один объект полностью лежит по одну сторону этой плоскости, а другой – по противоположную. Это позволяет разработать очень быстрые алгоритмы обнаружения столкновений для выпуклых объектов. Первые работы в этой области были связаны с методами "разделяющих плоскостей". Два треугольника сталкиваются, по сути, только тогда, когда их нельзя разделить плоскостью, проходящей через три вершины. То есть, если треугольники – и , где каждый – вектор в , то мы можем выбрать три вершины, , найти плоскость, проходящую через все три вершины, и проверить, является ли эта плоскость разделяющей. Если хотя бы одна такая плоскость является разделяющей, то треугольники считаются непересекающимися. С другой стороны, если ни одна из этих плоскостей не является разделяющей, то треугольники считаются пересекающимися. Существует двадцать таких плоскостей. Если треугольники лежат в одной плоскости, этот тест не всегда дает точный результат. Можно добавить дополнительные плоскости, например, нормальные к ребрам треугольника, чтобы полностью решить проблему. В других случаях объекты, соприкасающиеся плоской гранью, неизбежно должны соприкасаться под углом в другом месте, поэтому общая система обнаружения столкновений сможет обнаружить столкновение. Со временем были разработаны более совершенные методы. Существуют очень быстрые алгоритмы для нахождения ближайших точек на поверхности двух выпуклых многогранников. Ранние работы Минга Линя использовали вариант симплекс-алгоритма из линейного программирования. Алгоритм расстояния Гилберта-Джонсона-Кирти превзошел этот подход. Эти алгоритмы приближаются к постоянному времени при многократном применении к парам неподвижных или медленно движущихся объектов, если использовать исходные точки из предыдущей проверки столкновения. Конечным результатом всех этих алгоритмических разработок является то, что обнаружение столкновений может быть эффективно выполнено для тысяч движущихся объектов в реальном времени на обычных персональных компьютерах и игровых консолях.

Априорная обрезка

Когда большинство объектов неподвижны, как это обычно бывает в видеоиграх, для ускорения вычислений можно использовать априорные методы с предварительным вычислением. Здесь также желательно применение отсечения, как для большого числа тел, так и попарного отсечения, однако алгоритмы должны учитывать время и типы движений, используемые в базовой физической системе. Что касается точного обнаружения столкновений между парами объектов, то это сильно зависит от траекторий, и для вычисления момента столкновения практически необходимо использовать алгоритм численного поиска корней. В качестве примера рассмотрим два треугольника, движущихся во времени. В любой момент времени можно проверить пересечение этих треугольников, используя двадцать плоскостей, упомянутых ранее. Однако можно добиться лучших результатов, поскольку эти двадцать плоскостей можно отслеживать во времени. Если плоскость проходит через точки , то необходимо отслеживать двадцать плоскостей. Каждую плоскость нужно отслеживать относительно трех вершин, что дает шестьдесят значений для отслеживания. Применение поиска корней к этим шестидесяти функциям позволяет точно определить моменты столкновения для двух заданных треугольников и двух заданных траекторий. Отметим, что если траектории вершин предполагаются линейными полиномами, то эти шестьдесят функций фактически являются кубическими полиномами, и в этом исключительном случае можно определить точное время столкновения, используя формулу для корней кубического уравнения. Некоторые численные аналитики полагают, что использование формулы для корней кубического уравнения менее численно устойчиво, чем использование алгоритма поиска корней для полиномов.

Пространственное разделение

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

Ограничительные коробки

Ограничивающие рамки (или ограничивающие объемы) чаще всего представляют собой 2D прямоугольник или 3D кубоид, но возможны и другие формы. В видеоиграх ограничивающую рамку иногда называют зоной поражения (Hitbox). Ограничивающий алмаз, минимальный ограничивающий параллелограмм, выпуклая оболочка, ограничивающий круг или шар, а также ограничивающий эллипс – все они были опробованы, но ограничивающие рамки остаются наиболее популярными благодаря своей простоте. Ограничивающие рамки обычно используются на раннем этапе (отсечения) обнаружения столкновений, чтобы детально сравнивать только объекты с перекрывающимися ограничивающими рамками.

Центроидные сегменты треугольника

Треугольная сетка обычно используется в 3D-моделировании тел. Как правило, функция обнаружения столкновений представляет собой перехват треугольника с треугольником или ограничивающую форму, связанную с сеткой. Центроид треугольника – это центр масс, точка, в которой он будет балансировать на кончике карандаша. Для симуляции достаточно добавить размерность центроида к физическим параметрам. Зная центроиды как объекта, так и цели, можно определить отрезок прямой, соединяющий эти две точки. Вектор положения центроида треугольника равен среднему значению векторов положения его вершин. Таким образом, если его вершины имеют декартовы координаты , и , то центроид равен . Вот функция для вычисления расстояния между отрезками прямой, соединяющими две 3D-точки. Здесь длина/расстояние отрезка является настраиваемым критерием "попадания", определяющим размер отрезка. По мере сближения объектов длина уменьшается до порогового значения. Треугольник, представленный сферой, становится эффективным тестом геометрии. Сферу, центрированную в центроиде, можно масштабировать так, чтобы она охватывала все вершины треугольника.

Видеоигры

Видеоигры должны распределять свое крайне ограниченное вычислительное время между множеством задач. Несмотря на это ограничение ресурсов и использование относительно примитивных алгоритмов обнаружения столкновений, программисты смогли создать убедительные, хотя и неточные, системы для использования в играх. Долгое время в видеоиграх было небольшое количество объектов для обработки, поэтому проверка всех пар не представляла собой проблемы. В двухмерных играх в некоторых случаях аппаратное обеспечение могло эффективно обнаруживать и сообщать о перекрывающихся пикселях между спрайтами на экране. В других случаях простое разбиение экрана на тайлы и привязка каждого спрайта к тайлам, с которыми он пересекается, обеспечивало достаточную отсечку, а для попарных проверок использовались ограничивающие прямоугольники или окружности, называемые hitboxes, которые считались достаточно точными. В трехмерных играх для отсечения тел использовались методы пространственного разделения, и долгое время для попарных проверок применялись одна или несколько сфер для каждого реального 3D-объекта. Точные проверки крайне редки, за исключением игр, стремящихся к реалистичной симуляции. Даже в этом случае точные проверки не всегда используются. Поскольку игры не обязаны имитировать реальную физику, стабильность не является столь важной проблемой. Почти все игры используют обнаружение столкновений a posteriori, а столкновения часто разрешаются с помощью очень простых правил. Например, если персонаж оказывается встроенным в стену, его можно просто вернуть в последнее известное корректное положение. Некоторые игры рассчитывают расстояние, на которое персонаж может переместиться, прежде чем попасть в стену, и разрешают ему двигаться только на это расстояние. Во многих случаях для видеоигр достаточно приближать персонажей к точке для обнаружения столкновений с окружением. В этом случае деревья двоичного разделения пространства предоставляют работоспособный, эффективный и простой алгоритм для проверки, находится ли точка внутри сцены или нет. Такая структура данных также может быть использована для корректной обработки ситуации "положения покоя", когда персонаж бежит по земле. Столкновения между персонажами, а также столкновения со снарядами и опасностями обрабатываются отдельно. Надежный симулятор – это тот, который адекватно реагирует на любой ввод. Например, представим себе видеоигру с высокоскоростными гонками. От одного шага симуляции к другому автомобили могут значительно продвинуться по трассе. Если на трассе есть небольшое препятствие (например, кирпичная стена), вполне возможно, что автомобиль полностью перепрыгнет через него, что крайне нежелательно. В других случаях "исправление", требуемое алгоритмами a posteriori, реализовано некорректно, что приводит к ошибкам, которые могут застревать персонажей в стенах или позволять им проходить сквозь них и падать в бесконечную пустоту, где может быть или не быть смертельная бездонная пропасть, иногда называемая "черным адом", "синим адом" или "зеленым адом", в зависимости от преобладающего цвета. Это признаки неисправной системы обнаружения столкновений и физической симуляции. Big Rigs: Over the Road Racing – печально известный пример игры с неисправной или, возможно, отсутствующей системой обнаружения столкновений.

Hitbox (англ.)

Hitbox – это невидимая форма, обычно используемая в видеоиграх для обнаружения столкновений в реальном времени; это тип ограничивающего прямоугольника. Чаще всего это прямоугольник (в 2D играх) или кубоид (в 3D), который прикреплен к точке на видимом объекте (например, модели или спрайте) и следует за ней. Круглые или сфероидальные формы также распространены, хотя их всё ещё чаще называют «коробками». Для анимированных объектов обычно используются hitboxes, прикрепленные к каждой движущейся части, чтобы обеспечить точность во время движения. Недостоверный источник: дата=март 2018.

Hitboxes используются для обнаружения «односторонних» столкновений, таких как удар кулаком или попадание пули. Они не подходят для обнаружения столкновений с обратной связью (например, столкновения со стеной) из-за сложностей, возникающих как у игроков, так и у ИИ при отслеживании постоянно меняющегося положения hitbox; такие столкновения обычно обрабатываются с помощью гораздо более простых ограничивающих прямоугольников, выровненных по осям. Игроки могут использовать термин «hitbox» для обозначения любых подобных взаимодействий. Hurtbox – это hitbox, используемый для обнаружения входящего урона. В этом контексте термин «hitbox» обычно относится к тем, которые наносят урон. Например, атака может быть успешной только в том случае, если hitbox вокруг удара атакующего соприкоснется с одним из hurtboxes противника на его теле, в то время как столкновение hitboxes может привести к обмену ударами или их отмене, а hurtboxes не взаимодействуют друг с другом. Термин не стандартизирован в индустрии; некоторые игры меняют местами определения hitbox и hurtbox, а другие используют только «hitbox» для обозначения обеих сторон.