Обнаружение столкновений - Collision detection

  (Перенаправлено из Hitbox )

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

Обзор

Удары бильярдных шаров друг в друга - классический пример, применимый в науке об обнаружении столкновений.

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

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

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

Физические тренажеры различаются по тому, как они реагируют на столкновение. Некоторые используют мягкость материала для расчета силы, которая разрешит столкновение на следующих временных шагах, как в действительности. Из-за низкой мягкости некоторых материалов это очень интенсивно. Некоторые симуляторы оценивают время столкновения с помощью линейной интерполяции , откатывают моделирование и вычисляют столкновение с помощью более абстрактных методов законов сохранения .

Некоторые повторяют линейную интерполяцию ( метод Ньютона ) для вычисления времени столкновения с гораздо более высокой точностью, чем остальная часть моделирования. Обнаружение столкновений использует временную согласованность, чтобы обеспечить еще более точные временные шаги без значительного увеличения нагрузки на ЦП, например, при управлении воздушным движением .

После неупругого столкновения могут возникнуть особые состояния скольжения и покоя, и, например, Open Dynamics Engine использует ограничения для их моделирования. Ограничения позволяют избежать инерции и, следовательно, нестабильности. Реализация покоя с помощью графа сцены избегает дрейфа.

Другими словами, физические имитаторы обычно работают одним из двух способов: столкновение обнаруживается апостериори (после того, как столкновение происходит) или априори (до того, как столкновение произойдет). В дополнение к апостериорному и априорному различению почти все современные алгоритмы обнаружения столкновений разбиты на иерархию алгоритмов. Часто используются термины «дискретный» и «непрерывный», а не апостериори и априори .

Апостериорный (дискретный) по сравнению с априорным (непрерывным)

В апостериорном случае мы продвигаем физическое моделирование на небольшой временной шаг, затем проверяем, пересекаются ли какие-либо объекты или находятся ли они так близко друг к другу, что мы считаем их пересекающимися. На каждом шаге моделирования создается список всех пересекающихся тел, а положения и траектории этих объектов каким-то образом «фиксируются» с учетом столкновения. Мы говорим, что этот метод является апостериорным, потому что мы обычно пропускаем фактический момент столкновения и улавливаем столкновение только после того, как оно действительно произошло.

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

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

С другой стороны, апостериорные алгоритмы вызывают проблемы на этапе «исправления», когда пересечения (которые не являются физически правильными) должны быть исправлены. Более того, если дискретный шаг слишком велик, столкновение может остаться незамеченным, в результате чего объект пройдет через другой, если он достаточно быстрый или маленький.

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

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

Оптимизация

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

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

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

На грубом уровне обнаружения столкновений цель состоит в том, чтобы найти пары объектов, которые потенциально могут пересекаться. Эти пары потребуют дальнейшего анализа. Ранний высокоурожайный алгоритм производительности для этого был разработан Ming C. Lin в Университете Калифорнии, Беркли [1] , который предложил с помощью оси выровнена габаритного прямоугольника для всех п тел в сцене.

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

Таким образом, мы сводим проблему к проблеме отслеживания, от кадра к кадру, какие интервалы действительно пересекаются. У нас есть три списка интервалов (по одному для каждой оси), и все списки имеют одинаковую длину (поскольку каждый список имеет длину , количество ограничивающих рамок). В каждом списке каждый интервал может пересекать все другие интервалы в списке. Итак, для каждого списка у нас будет матрица нулей и единиц: 1, если интервалы и пересекаются, и 0, если они не пересекаются.

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

В случае деформируемых тел, таких как моделирование ткани, может оказаться невозможным использовать более конкретный алгоритм попарной отсечения, как обсуждается ниже, и алгоритм отсечения из n тел - лучшее, что можно сделать.

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

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

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

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

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

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

Опережая время, мы можем вычислить и . Понятно, что если эти две сферы не пересекаются (а это очень легко проверить), то и не пересекаются . Однако это не намного лучше, чем алгоритм отсечения n- body.

Если это набор треугольников, то мы можем разделить его на две половины и . Мы можем сделать это с и , и мы можем вычислить (заранее) ограничивающие сферы и . Здесь есть надежда, что эти ограничивающие сферы намного меньше, чем и . А если, например, и не пересекаются, то нет смысла сравнивать любой треугольник в с любым треугольником в .

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

Когда придет время проверить пару объектов на столкновение, их дерево ограничивающих сфер можно использовать для устранения множества пар треугольников.

Многие варианты алгоритмов получаются выбором чего-то другого, кроме сферы . Если выбрать ограничивающие прямоугольники , выровненные по оси , получится AABBTrees. Ориентированные деревья ограничивающих рамок называются OBBTrees. Некоторые деревья легче обновить, если изменяется базовый объект. Некоторые деревья могут содержать примитивы более высокого порядка, такие как сплайны, вместо простых треугольников.

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

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

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

Ранние работы в этой области были связаны с методами « разделительной плоскости ». Два треугольника сталкиваются по существу только тогда, когда их нельзя разделить плоскостью, проходящей через три вершины. То есть, если треугольники есть и где каждый является вектором , то мы можем взять три вершины , найти плоскость, проходящую через все три вершины, и проверить, является ли это разделяющей плоскостью. Если любая такая плоскость является разделяющей плоскостью, то треугольники считаются не пересекающимися. С другой стороны, если ни одна из этих плоскостей не разделяет плоскости, считается, что треугольники пересекаются. Таких самолетов двадцать.

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

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

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

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

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

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

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

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

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

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

Ограничивающие рамки

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

Сегменты центроида треугольника

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

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

Вот функция для расстояния между двумя трехмерными точками.

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

Видео игры

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

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

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

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

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

Надежный симулятор - это симулятор, который разумно реагирует на любой ввод. Например, если мы представим себе видеоигру с высокоскоростным гоночным автомобилем , от одного этапа моделирования к другому, возможно, что автомобили продвинутся на значительное расстояние по гоночной трассе. Если на трассе есть неглубокое препятствие (например, кирпичная стена), вполне вероятно, что машина полностью его перепрыгнет, а это очень нежелательно. В других случаях «исправление», требуемое апостериорными алгоритмами, выполняется неправильно, и персонажи оказываются втянутыми в стены или падают в глубокую пустоту, которую иногда называют «черным адом», «синим адом» или «черным адом». зеленый ад », в зависимости от преобладающего цвета. Это отличительные черты неисправной системы обнаружения столкновений и физического моделирования. Big Rigs: Over the Road Racing - печально известный пример игры, в которой система обнаружения столкновений не работает или вообще отсутствует.

Hitbox

Отладки диалоговое окно в Gearheads контроля хитбокс объекта
Хитбокс из Gearheads игрушки, управляется выше экран

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

Хитбоксы используются для обнаружения «односторонних» столкновений, таких как попадание в персонажа удара кулаком или пулей. Они не подходят для обнаружения столкновений с обратной связью (например, столкновения со стеной) из-за сложности, с которой сталкиваются как люди, так и ИИ при управлении постоянно меняющимися местоположениями хитбокса; Подобные столкновения обычно обрабатываются гораздо более простыми ограничивающими прямоугольниками, выровненными по оси . Игроки могут использовать термин «хитбокс» для обозначения этих типов взаимодействий в любом случае.

Hurtbox является Родственный термин, используемый для дифференциации «объект , который наносит урон» от «объекта , который получает повреждения». Например, атака может приземлиться только в том случае, если хитбокс вокруг удара атакующего соединяется с одним из хитов противника на их теле, в то время как столкновение противостоящих хитбоксов может привести к тому, что игроки обмениваются ударами или отменяют их, а противостоящие хиты не взаимодействуют друг с другом. Этот термин не стандартизирован в отрасли; некоторые игры меняют свои определения "хитбокса" и "хита", в то время как другие используют только "хитбокс" для обеих сторон.

Смотрите также

Ссылки

внешние ссылки