Bounding Volume Hierarchy
Bounding Volume Hierarchy (BVH, иерархия объёмов-ограничителей) — это древовидная структура данных, используемая в компьютерной графике, физическом моделировании и вычислительной геометрии для ускорения операций поиска пересечений и определения видимости. BVH представляет собой иерархическое разбиение пространства, в котором каждый узел дерева содержит объём-ограничитель (например, сферу, параллелепипед, ориентированный прямоугольник), охватывающий все геометрические объекты, хранящиеся в его поддеревьях. Основное свойство BVH — гибкость: в отличие от структур, разбивающих пространство на непересекающиеся ячейки (например, k-d дерево или октодерево), BVH допускает перекрытие объёмов-ограничителей соседних узлов.
История
Идея использования иерархии объёмов-ограничителей для ускорения геометрических запросов возникла в 1970-х годах в рамках развития методов трассировки лучей (ray tracing) и алгоритмов обнаружения коллизий. Одним из первых опубликованных описаний BVH считается работа Джеймса Ф. Блинна (James F. Blinn) 1978 года, где он предложил использовать сферы как объёмы-ограничители для ускорения рендеринга. В 1980-х годах BVH получил широкое распространение в системах компьютерной анимации и физических симуляциях, особенно в контексте обнаружения столкновений между сложными объектами. Значительный вклад в развитие BVH внесли работы по построению сбалансированных деревьев и оптимизации алгоритмов обхода.
В 1990-е годы, с ростом вычислительных мощностей и развитием аппаратного ускорения трассировки лучей, BVH стал стандартной структурой данных в интерактивной компьютерной графике. В 2010-х годах компания NVIDIA (организация, зарегистрированная в США) внедрила аппаратную поддержку BVH в свои графические процессоры архитектуры Turing, что позволило выполнять трассировку лучей в реальном времени в играх и приложениях виртуальной реальности.
Классификация
BVH классифицируется по нескольким признакам:
По типу объёмов-ограничителей
- Сферические BVH — каждый узел содержит сферу, охватывающую все объекты поддерева. Просты в вычислении, но часто менее эффективны, чем прямоугольные объёмы.
- Осеориентированные прямоугольные параллелепипеды (AABB) — наиболее распространённый тип. AABB — это прямоугольник, выровненный по осям координат, что упрощает проверку пересечений.
- Ориентированные прямоугольники (OBB) — повёрнутые относительно осей, что позволяет точнее охватывать объекты произвольной формы, но требует больше вычислений.
- Выпуклые оболочки — используются для максимально точного охвата, но сложны в построении и проверке.
По способу построения
- Сверху вниз (top-down) — рекурсивное разбиение множества объектов на подмножества (например, по медиане координат). Простота реализации, но может давать несбалансированное дерево.
- Снизу вверх (bottom-up) — построение начинается с листьев (каждый объект — отдельный лист), затем узлы группируются. Требует больше времени, но часто даёт более качественную иерархию.
- Инкрементальное (insertion-based) — объекты добавляются по одному, дерево перестраивается локально. Используется в динамических сценах, где объекты движутся.
По степени ветвления
- Бинарное BVH — каждый узел имеет ровно два потомка. Наиболее распространённый вариант.
- N-арное BVH — узел может иметь более двух потомков (например, 4 или 8). Уменьшает глубину дерева, но увеличивает время проверки одного узла.
Устройство и характеристики
Структура узла
Каждый узел BVH хранит:
- Объём-ограничитель — геометрическая фигура, охватывающая все объекты поддерева.
- Ссылки на потомков — указатели на левый и правый дочерние узлы (для бинарного дерева).
- Список объектов — только для листьев; для внутренних узлов объекты хранятся в потомках.
Построение BVH
Алгоритм построения BVH сверху вниз (top-down) включает следующие шаги:
- Выбор оси разбиения — обычно по оси с наибольшим разбросом координат объектов.
- Разбиение множества — объекты сортируются по выбранной оси, и множество делится на две части (например, по медиане).
- Рекурсия — для каждой части строится поддерево.
- Вычисление объёма-ограничителя — для каждого узла вычисляется минимальный объём, охватывающий все объекты поддерева.
Обход BVH
Основная операция — поиск пересечения луча с объектами. Алгоритм обхода:
- Начать с корня дерева.
- Проверить пересечение луча с объёмом-ограничителем текущего узла.
- Если пересечения нет — завершить обход для этого узла.
- Если пересечение есть — рекурсивно обойти потомков (сначала ближайший, если луч не бесконечный).
- В листьях проверить пересечение с каждым объектом.
Сложность
- Построение — в среднем O(N log N) для top-down, где N — количество объектов.
- Обход — в среднем O(log N) для одного луча, но в худшем случае O(N) (если все объёмы-ограничители пересекаются).
- Память — O(N) узлов (для бинарного дерева — примерно 2N узлов).
Применение
Трассировка лучей (Ray Tracing)
BVH является стандартной структурой для ускорения трассировки лучей в рендеринге. Используется в:
- Интерактивной графике — в играх и приложениях виртуальной реальности (например, в технологии NVIDIA RTX).
- Офлайн-рендеринге — в программах Blender, Autodesk Maya, Cinema 4D.
- Научной визуализации — для визуализации сложных трёхмерных данных.
Обнаружение коллизий (Collision Detection)
В физических симуляциях и игровых движках BVH применяется для быстрого определения столкновений между объектами. Например, в движке PhysX (NVIDIA) и Bullet Physics.
Обработка облаков точек
BVH используется для ускорения запросов ближайших соседей и поиска пересечений в больших наборах трёхмерных точек.
Вычислительная геометрия
Применяется для задач, связанных с пространственными запросами, таких как поиск объектов в заданной области или определение видимости.
Примеры реализации
В игровых движках
- Unreal Engine — использует BVH для ускорения трассировки лучей в реальном времени (Lumen, Nanite).
- Unity — поддерживает BVH для физических симуляций и рендеринга (High Definition Render Pipeline).
В библиотеках
- Embree (Intel) — библиотека для трассировки лучей, использующая BVH.
- OptiX (NVIDIA) — фреймворк для трассировки лучей с аппаратным ускорением BVH.
- PBRT — учебный рендерер, реализующий BVH.
В научных проектах
- Open3D — библиотека для обработки трёхмерных данных, включающая построение BVH.
- CGAL (Computational Geometry Algorithms Library) — содержит реализации BVH для геометрических запросов.
Критика и ограничения
- Перекрытие объёмов — в отличие от k-d дерева или октодерева, BVH допускает перекрытие объёмов-ограничителей, что может снижать эффективность обхода.
- Динамические сцены — при движении объектов BVH требует перестроения или обновления, что может быть затратно по времени.
- Память — для сложных сцен с миллионами объектов BVH может потреблять значительный объём памяти (особенно при хранении AABB для каждого узла).
- Качество построения — эффективность BVH сильно зависит от алгоритма разбиения; плохое разбиение может привести к O(N) обходу.
Источники
- Blinn, J. F. (1978). Simulation of Wrinkled Surfaces. Computer Graphics (SIGGRAPH '78 Proceedings).
- Goldsmith, J., & Salmon, J. (1987). Automatic Creation of Object Hierarchies for Ray Tracing. IEEE Computer Graphics and Applications.
- Wald, I., & Havran, V. (2006). On building fast kd-trees for ray tracing, and on doing that in O(N log N). Proceedings of the IEEE Symposium on Interactive Ray Tracing.
- Pharr, M., Jakob, W., & Humphreys, G. (2016). Physically Based Rendering: From Theory to Implementation (3rd ed.). Morgan Kaufmann.
- NVIDIA Corporation. (2018). NVIDIA Turing GPU Architecture. NVIDIA Whitepaper.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →