Bounding Volume Hierarchy (BVH) — это иерархическая структура, используемая для ускорения вычислений столкновений в физических движках, таких как Oimo.js. Основная идея BVH заключается в том, чтобы сгруппировать объекты сцены в иерархию ограничивающих объёмов (bounding volumes), что позволяет быстро исключать объекты, которые не могут столкнуться друг с другом, без необходимости проверки каждой пары тел.
В Oimo.js BVH реализован для оптимизации broad-phase collision detection. На этом этапе движок определяет потенциальные пары объектов для более точного анализа на столкновение. Использование BVH существенно сокращает количество проверок, повышая производительность, особенно при большом количестве объектов.
BVH-дерево представляет собой бинарное дерево, где каждый узел содержит ограничивающий объём, охватывающий все объекты в поддереве. Основные компоненты узла:
Ключевое свойство BVH: узлы и их потомки образуют иерархическую упаковку объектов, позволяющую быстро исключать целые группы тел при проверке столкновений. Если AABB узла не пересекается с AABB другого узла, нет необходимости проверять пересечения для всех объектов внутри этих поддеревьев.
В Oimo.js BVH строится на основе текущих позиции и размеров тел. Основные шаги:
Oimo.js использует динамическое обновление BVH, позволяющее избежать полной перестройки при каждом кадре. Узлы обновляются только при значительных перемещениях объектов, что снижает накладные расходы на вычисления.
BVH участвует в broad-phase, определяя потенциальные пары объектов. Алгоритм работы:
Начало с корневых узлов двух деревьев.
Проверка пересечения их AABB.
Если узлы пересекаются:
Если AABB не пересекаются, все тела поддеревьев исключаются из дальнейшей проверки.
Эта стратегия снижает сложность с O(n²) для прямой проверки всех пар до O(n log n) в большинстве практических случаев.
Эффективность BVH зависит от нескольких факторов:
В Oimo.js BVH автоматически используется для всех тел, созданных
через World.addBody(). Пример создания динамических
тел:
const world = new OIMO.World();
const box1 = world.addBody({
type: 'box',
size: [1, 1, 1],
pos: [0, 5, 0],
move: true
});
const box2 = world.addBody({
type: 'box',
size: [1, 1, 1],
pos: [0, 10, 0],
move: true
});
world.step(); // обновление BVH и проверка столкновений
В этом коде BVH автоматически объединяет объекты в дерево, ускоряя
broad-phase проверку столкновений между box1 и
box2 и всеми другими телами в сцене.
BVH является критически важным компонентом для производительности Oimo.js при больших сценах. Оно обеспечивает:
Правильная настройка и понимание структуры BVH позволяет создавать физические симуляции с высокой точностью и производительностью, особенно в интерактивных 3D-приложениях.