Объёмы и bounding volumes

В основе эффективного рендеринга в CesiumJS лежит система пространственных ограничивающих объёмов, используемых для ускорения вычислений видимости и отсечения невидимых объектов. Bounding volumes позволяют заменить сложную геометрию упрощёнными математическими представлениями, с которыми быстрее выполнять тесты пересечения и попадания в область видимости камеры.

Основные типы ограничивающих объёмов

CesiumJS использует несколько ключевых типов bounding volumes, каждый из которых оптимизирован под разные сценарии пространственного анализа.

Bounding Sphere

Сфера ограничивающего объёма — один из самых часто используемых типов. Она описывается центром и радиусом:

  • центр — координата в мировом пространстве
  • радиус — максимальное расстояние до поверхности объекта

Сфера удобна тем, что тест пересечения с фрустумом камеры сводится к простым вычислениям расстояния от точки до плоскости.

В CesiumJS она представлена классом Cesium.BoundingSphere.

Ключевая особенность — высокая скорость проверки при умеренной точности. Сфера часто используется как первый уровень отсечения.

Типичные операции:

  • вычисление сферы по набору точек
  • объединение нескольких сфер
  • тест пересечения с фрустумом камеры

Пример математического смысла проверки видимости:

  • если расстояние от центра сферы до любой плоскости фрустума меньше -radius, объект гарантированно невидим

Axis-Aligned Bounding Box (AABB)

Ограничивающий параллелепипед, выровненный по осям координат. В CesiumJS реализуется через Cesium.AxisAlignedBoundingBox.

Характеристики:

  • задаётся минимальной и максимальной точками (min/max)
  • стороны параллельны осям мирового пространства

Преимущества:

  • быстрые проверки пересечения
  • простая структура данных
  • удобство для пространственных индексов

Недостаток:

  • ухудшение точности при повороте объекта

AABB часто используется в иерархических структурах, например в кватер-деревьях и BVH.

Oriented Bounding Box (OBB)

Oriented Bounding Box (Cesium.OrientedBoundingBox) — более точный вариант, учитывающий вращение объекта.

Описание:

  • центр
  • полувекторы (half-axes), задающие ориентацию и размеры

OBB позволяет значительно уменьшить избыточный объём по сравнению с AABB.

Используется в случаях, когда:

  • объект имеет выраженную ориентацию в пространстве
  • требуется высокая точность отсечения
  • важна минимизация ложноположительных попаданий

Цена — более сложные вычисления пересечения с фрустумом.


Bounding volumes и фрустум камеры

Фрустум камеры в CesiumJS представляет собой усечённую пирамиду, ограниченную шестью плоскостями: ближней, дальней, верхней, нижней, левой и правой.

Bounding volumes используются для быстрого определения:

  • находится ли объект внутри видимой области
  • полностью ли он вне экрана
  • частично ли пересекает фрустум

Основной алгоритм:

  1. Для каждого bounding volume вычисляется расстояние до каждой плоскости фрустума
  2. Если объект полностью «снаружи» хотя бы одной плоскости — он отсекается
  3. Если пересекает — может быть частично отрисован или детализирован дальше
  4. Если полностью внутри — принимается к рендеру без дополнительных проверок

Это ключевой механизм оптимизации в сцене с миллионами объектов.


Иерархия bounding volumes в 3D Tiles

В CesiumJS система 3D Tiles (Cesium3DTileset) использует bounding volumes как основу иерархического уровня детализации (LOD).

Каждый тайл содержит:

  • boundingVolume (обязательный)
  • геометрию или ссылку на дочерние тайлы
  • метаданные для стриминга

Bounding volume определяет, нужно ли загружать и отображать тайл.

Принцип работы LOD через bounding volumes

  • если bounding volume тайла не пересекается с фрустумом — тайл не загружается
  • если пересекается — может быть загружен или заменён более детализированными дочерними тайлами
  • если тайл слишком большой в экранном пространстве — происходит refinement (замена на более детальные)

Таким образом bounding volume является триггером стриминга данных.


Экранно-пространственная ошибка (Screen Space Error)

Bounding volumes тесно связаны с метрикой SSE (Screen Space Error), используемой для выбора уровня детализации.

SSE оценивает, насколько сильно упрощённый тайл отклоняется от идеальной геометрии при проекции на экран.

Обобщённая логика:

  • большой bounding volume → высокий SSE → требуется детализация
  • малый bounding volume → низкий SSE → можно отрисовать упрощённую версию

Bounding volume влияет на оценку углового размера объекта относительно камеры, что напрямую связано с пиксельной точностью.


Методы создания bounding volumes

CesiumJS предоставляет утилиты для вычисления bounding volumes из различных источников данных.

Из набора точек

Для облаков точек или произвольной геометрии:

  • Cesium.BoundingSphere.fromPoints
  • Cesium.AxisAlignedBoundingBox.fromPoints

Алгоритм:

  • проход по всем вершинам
  • вычисление экстремальных значений
  • построение минимального объёма, покрывающего все точки

Из геометрии

При работе с Cesium.Geometry:

  • учитываются вершины, индексы и трансформации
  • применяется мировая матрица объекта
  • вычисляется итоговый bounding volume в world-space

Из прямоугольных областей

Для географических регионов:

  • Cesium.Rectangle преобразуется в bounding volume
  • учитывается эллипсоид Земли (Cesium.Ellipsoid.WGS84)

Это важно для глобальных сцен, где геометрия привязана к поверхности планеты.


Комбинирование и иерархия объёмов

Bounding volumes часто объединяются в более крупные структуры:

  • объединение сфер (BoundingSphere.union)
  • объединение AABB через расширение min/max
  • пересчёт OBB через объединение полувекторов

Иерархические структуры позволяют:

  • ускорять traversal сцены
  • минимизировать количество точных проверок
  • эффективно управлять LOD

Типичная схема:

корневой bounding volume (вся сцена)
    ├── региональные volumes
    │       ├── тайлы высокого уровня
    │       └── тайлы низкого уровня
    └── отдельные объекты

Bounding volumes и производительность

Использование bounding volumes снижает вычислительную сложность рендеринга за счёт замены геометрических проверок:

  • вместо проверки каждой вершины используется одна проверка объёма
  • сложность от O(n) к O(1) для объекта
  • существенное уменьшение нагрузки на CPU

Особенно критично это для:

  • глобальных 3D-карт
  • городских моделей
  • облаков точек (point clouds)
  • фотограмметрических сцен

Каскадная система отсечения

CesiumJS применяет многоуровневую систему culling:

  1. Frustum culling — проверка bounding volume против камеры
  2. Occlusion culling — проверка перекрытия другими объектами (частично)
  3. Distance culling — отсечение по дальности
  4. SSE-based refinement — выбор детализации

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


Численная устойчивость и погрешности

При работе с глобальными координатами возникают особенности:

  • большие значения координат (ECEF)
  • потеря точности float64 при вычислениях
  • накопление ошибок при трансформациях

CesiumJS решает это через:

  • использование Cartesian3 в мировом пространстве
  • локальные системы координат для тайлов
  • периодическую нормализацию вычислений bounding volumes

Bounding sphere часто предпочтительнее в глобальных сценах именно из-за устойчивости к численным ошибкам.


Практическая роль в pipeline рендеринга

Bounding volumes участвуют во всех ключевых стадиях pipeline:

  • загрузка тайлов
  • построение сцены
  • отсечение невидимых объектов
  • сортировка по расстоянию
  • принятие решений о детализации

Каждый кадр камеры инициирует пересчёт видимости через traversal дерева bounding volumes.


Связь с пространственными структурами данных

Bounding volumes являются основой для:

  • k-d деревьев
  • BVH (Bounding Volume Hierarchy)
  • quadtrees и octrees
  • tile-based streaming структур

CesiumJS 3D Tiles фактически представляет собой гибрид BVH и quadtree, где каждый узел определяется bounding volume.


Оптимизация вычислений пересечения

CesiumJS использует оптимизированные алгоритмы:

  • предварительные проверки по радиусу (для сфер)
  • SIMD-оптимизированные операции в некоторых случаях
  • ранний выход при первой отрицательной плоскости фрустума
  • кэширование промежуточных вычислений камеры

Это позволяет обрабатывать тысячи bounding volumes за один кадр без существенных потерь производительности.


Bounding volumes в глобальной системе координат

В глобальных сценах Earth-centered, Earth-fixed (ECEF):

  • объекты могут находиться на расстояниях миллионов метров от центра
  • precision становится критическим фактором
  • bounding sphere становится базовой единицей оценки

OBB и AABB используются чаще в локальных системах координат тайлов, тогда как сфера — в глобальной агрегации.


Связь с визуализацией сложных данных

Bounding volumes позволяют визуализировать:

  • города с многоуровневой детализацией
  • спутниковые данные
  • облака точек LiDAR
  • процедурно генерируемые миры

Без них невозможно обеспечить интерактивную частоту кадров при таких объёмах данных.


Использование в кастомных слоях

При создании собственных источников данных в CesiumJS:

  • каждый объект должен иметь bounding volume
  • корректность объёма влияет на загрузку и видимость
  • ошибки в вычислении приводят к «прыгающим» тайлам или отсутствию объектов

Bounding volume становится контрактом между геометрией и движком рендеринга.