1. Bounding Volume

Intro

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

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

Bounding Sphere

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

Для определения коллизий boundings sphere редко используются. Вот например они используются для потимизации рендера в Three.js

Выглядят эти сферы как-то так:

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

BS по AABB

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

Алгоритм Риттера

Делаем два прохода по всем вершинам объекта:

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

Автор статьи говорит, что максимальная ошибка этого алгоритма 5 процентов.

OBB

Oriented bounding box - это прямоугольник, который ограничивает оригинальный объект, но может быть повернут в пространстве. Если фигура обладает известными осями симметрии, то OBB можно достаточно просто построить, но в общем случае это сложная задача.

AABB

Axis-aligned bounding box - это прямоугольник, который ограничивает оригинальный объект и выровнен по осям координат.

Супер простая идея, которая чаще всего встречается почти всех движках bullet, jolt и box2d

Выглядит это как-то так:

Существует несколько способов генерации AABB. И это всегда трейдофф между скоростью и точностью.

Источники

Ritter’s bounding sphere Smallest circle problem