В физическом движке Cannon.js широкофазовые алгоритмы (broadphase) используются для эффективного определения потенциальных столкновений между телами в симуляции. Их основная задача — сократить количество проверок столкновений, передаваемых в узкофазный алгоритм (narrowphase), который выполняет точные вычисления пересечений. Без широкофазной фильтрации проверка всех возможных пар тел растёт квадратично (O(n^2)), что делает симуляцию неэффективной при большом количестве объектов.
Cannon.js предоставляет три основных широкофазовых алгоритма: NaiveBroadphase, SAPBroadphase и GridBroadphase. Каждый из них имеет свои особенности и применимость.
NaiveBroadphase — самый простой и прямолинейный алгоритм широкофазы. Он проверяет все возможные пары тел на потенциальные столкновения без какой-либо оптимизации.
Особенности:
n
объектов выполняется проверка (n (n-1) / 2) пар.Пример создания:
const world = new CANNON.World();
world.broadphase = new CANNON.NaiveBroadphase();
Ограничения:
SAPBroadphase (Sweep and Prune) — алгоритм широкофазы, основанный на сортировке проекций тел на выбранной оси. Основная идея: объекты далеко друг от друга по координате не могут пересекаться, поэтому можно быстро отбрасывать большинство пар.
Принцип работы:
Преимущества:
k — число потенциальных столкновений.Пример использования:
const world = new CANNON.World();
world.broadphase = new CANNON.SAPBroadphase(world);
world.broadphase.axisIndex = 0; // выбор оси X
Особенности настройки:
axisIndex — определяет, по какой оси происходит
сортировка (0 — X, 1 — Y, 2 — Z).GridBroadphase делит пространство на сетку (ячейки) и проверяет столкновения только между объектами внутри одной или соседних ячеек. Этот подход особенно эффективен для сцен с равномерным распределением большого числа объектов, например, частицы или мелкие объекты.
Принцип работы:
aabbMin,
aabbMax, nx, ny,
nz).Преимущества:
Пример использования:
const world = new CANNON.World();
world.broadphase = new CANNON.GridBroadphase(
new CANNON.Vec3(-100, -100, -100),
new CANNON.Vec3(100, 100, 100),
10, 10, 10
);
Особенности настройки:
| Алгоритм | Сложность | Применение | Плюсы | Минусы |
|---|---|---|---|---|
| NaiveBroadphase | O(n²) | Малые сцены | Простота, точность | Плохо масштабируется |
| SAPBroadphase | O(n log n + k) | Линейные или вытянутые сцены | Быстро для умеренных сцен | Зависит от оси сортировки |
| GridBroadphase | O(n + k’) | Частицы, равномерные сцены | Отлично для больших чисел тел | Требует настройки сетки |
Выбор алгоритма зависит от размеров сцены, распределения объектов и требуемой производительности. Для небольших учебных примеров подходит NaiveBroadphase, для длинных сцен с небольшим числом объектов — SAPBroadphase, для массивов мелких частиц — GridBroadphase.
sleep для неподвижных объектов.Эффективное использование широкофазовых алгоритмов позволяет значительно ускорить симуляцию и снизить нагрузку на узкофазный движок столкновений Cannon.js.