В ядре физического движка Ammo.js лежит система обработки
столкновений, основным компонентом которой является диспетчер
столкновений (btCollisionDispatcher). Его задача —
управление проверками столкновений между объектами сцены и организация
данных о столкновениях для последующей обработки физическим
решателем.
Регистрация алгоритмов столкновений Диспетчер
использует таблицу алгоритмов
(btCollisionAlgorithmCreateFunc) для различных комбинаций
типов примитивов: сфера–сфера, сфера–куб, куб–куб, и т.д. Каждое
столкновение между объектами обрабатывается через соответствующий
алгоритм, который создаёт контактные точки.
Создание контактных точек Контактные точки содержат информацию о точке пересечения, нормали, глубине проникновения и силах трения. Эти данные передаются в физический решатель для расчёта импульсов и реакции тел.
Поддержка пользовательских форм Через диспетчер можно подключать собственные коллайдеры и алгоритмы столкновений, реализуя уникальные формы взаимодействия, например, для нестандартных мешей или процедурно генерируемых объектов.
Диспетчер не проверяет все объекты напрямую. Для оптимизации работы физического движка используется широкая фаза столкновений, которая уменьшает количество проверок, передаваемых диспетчеру.
Широкая фаза служит для быстрой фильтрации пар объектов, которые не могут столкнуться, и выделения потенциально пересекающихся. В Ammo.js применяется несколько вариантов реализации, включая Axis-Aligned Bounding Box (AABB) деревья и динамические решетки (dynamic bounding volume hierarchies).
Объекты получают AABB Для каждого тела вычисляется минимальный и максимальный уголки ограничивающего прямоугольного параллелепипеда. AABB полностью охватывает форму тела с учётом трансформаций (поворот, масштаб, позиция).
Сортировка и фильтрация AABB объектов сравниваются по координатам. Если два AABB не пересекаются ни по одной из осей, объекты не могут столкнуться, и дальнейшие проверки не выполняются. Если пересечение есть, пара объектов передаётся в диспетчер столкновений для детальной проверки.
Поддержка динамических объектов При перемещении тела AABB пересчитывается. Чтобы избежать постоянной перестройки структуры, используется инкрементное обновление, что снижает нагрузку на CPU и улучшает производительность сцены.
btDbvtBroadphase Динамическое дерево разделяющего объёма (Dynamic Bounding Volume Tree). Оптимизировано для сцен с большим количеством подвижных тел. Позволяет добавлять и удалять объекты без полной перестройки дерева.
btAxisSweep3 Алгоритм сортировки по осям с фиксированным пространственным диапазоном. Эффективен для статических или ограниченных по области объектов, обеспечивая предсказуемую производительность.
btSimpleBroadphase Наиболее простой метод — проверка всех пар объектов. Используется для небольших сцен, где накладные расходы на дерево не оправданы.
Фильтрация пар объектов Широкая фаза передаёт в диспетчер только потенциальные пары. Это снижает сложность проверки с (O(n^2)) до (O(n n)) или лучше, в зависимости от структуры данных.
Создание алгоритмов столкновений Диспетчер получает пару тел и выбирает подходящий алгоритм столкновения. Для сложных мешей применяется алгоритм GImpact, а для базовых примитивов — специализированные функции, оптимизированные по числу операций.
Обновление сцены После интеграции тел по шагу времени (stepSimulation) объекты смещаются, их AABB пересчитываются, широкая фаза обновляет пары, а диспетчер создаёт контактные точки для всех потенциальных столкновений.
Ammo.js позволяет подключать собственные коллайдеры и алгоритмы столкновений:
Настройка этих алгоритмов позволяет уменьшить нагрузку на CPU, особенно в больших сценах с сотнями динамических объектов.
Взаимодействие диспетчера столкновений с широкофазным алгоритмом является ключевым элементом производительности в Ammo.js. Правильная конфигурация структур, алгоритмов и AABB напрямую влияет на стабильность симуляции и скорость расчётов физических взаимодействий.