Horizon culling

Horizon culling — это один из ключевых механизмов оптимизации рендеринга в трёхмерных глобальных сценах, реализованных в CesiumJS. Он отвечает за отсечение объектов, которые находятся за горизонтом наблюдателя и, следовательно, физически не могут быть видимы из текущей точки обзора на поверхности или в околоземном пространстве.

В отличие от классического frustum culling (отсечения по пирамиде видимости камеры), horizon culling использует геометрию сферы (или эллипсоида) и учитывает кривизну планеты. Это делает его особенно важным в глобальных 3D-сценах, где поверхность Земли является непрерывной и имеет значительную протяжённость.


Геометрическая основа горизонта

В CesiumJS Земля моделируется как эллипсоид, приближённый к WGS84. Это означает, что линия горизонта зависит от положения наблюдателя и радиуса кривизны в конкретной точке.

Базовая идея

Если провести луч от камеры к объекту, он может:

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

Horizon culling не требует трассировки лучей для каждого объекта. Вместо этого используется аналитическое приближение.


Математическая модель горизонта

CesiumJS использует концепцию horizon plane approximation, основанную на векторной геометрии.

Пусть:

  • C — позиция камеры в ECEF (Earth-Centered, Earth-Fixed)
  • R — радиус планеты (локально зависит от эллипсоида)
  • V — вектор к проверяемому объекту

Условие видимости относительно горизонта

Объект считается потенциально видимым, если выполняется условие:

  • угол между направлением на объект и направлением к горизонту меньше критического значения

Или в векторной форме:

  • объект не лежит “ниже” касательной плоскости горизонта относительно камеры

Horizon Culling как векторная проверка

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

  • нормализованный радиус-вектор камеры
  • расстояние до центра эллипсоида
  • границу горизонта (horizon limit)

Основная идея алгоритма

Для камеры вычисляется horizon culling point — точка, за которой объекты гарантированно скрыты кривизной планеты.

После этого каждый bounding volume сравнивается с этой границей.


Bounding volumes и horizon culling

Horizon culling применяется не к отдельным вершинам, а к объёмам ограничений:

  • Bounding Sphere
  • Axis-Aligned Bounding Box (AABB)
  • Oriented Bounding Box (OBB)

Наиболее часто используется bounding sphere, поскольку он обеспечивает быструю и стабильную проверку.


Алгоритм отсечения

Пусть:

  • S — центр bounding sphere
  • r — радиус сферы
  • C — камера
  • H — вектор горизонта камеры

Проверка выполняется в несколько шагов:

  1. Вычисляется направление от центра Земли к камере
  2. Строится касательная плоскость горизонта
  3. Объект сравнивается с этой плоскостью
  4. Если сфера полностью ниже горизонта → объект отсекается

Интеграция в CesiumJS pipeline

Horizon culling встроен в стадию culling pipeline, которая выполняется перед передачей данных в WebGL.

Порядок упрощённо:

  1. View frustum culling
  2. Horizon culling
  3. Clipping (near/far plane)
  4. Rendering submission

Horizon culling выполняется после грубого отсечения по пирамиде видимости, так как оно дороже, чем frustum test, но значительно дешевле полного рендеринга.


Причины эффективности

Основное преимущество horizon culling заключается в снижении количества объектов, которые:

  • находятся за пределами кривизны Земли
  • технически не могут попасть в кадр
  • всё ещё попадают в frustum из-за его линейной природы

Без horizon culling глобальная сцена содержала бы большое количество “ложно видимых” объектов, особенно на больших дистанциях.


Поведение на разных высотах камеры

Эффективность и характер отсечения напрямую зависят от высоты наблюдателя.

Камера на поверхности

  • Горизонт очень близкий
  • Большая часть планеты скрыта
  • Horizon culling агрессивно отсекает удалённые объекты

Низкая орбита

  • Горизонт расширяется
  • Больше объектов попадает в потенциальную видимость
  • Отсечение становится мягче

Высокая орбита

  • Почти вся планета в зоне видимости
  • Horizon culling минимально влияет
  • Основная нагрузка переносится на frustum culling

Влияние эллипсоида

CesiumJS не использует идеальную сферу. Эллипсоид WGS84 имеет разные радиусы по осям:

  • экваториальный радиус больше полярного

Это приводит к тому, что:

  • линия горизонта не является идеальной окружностью
  • проверка горизонта становится зависимой от широты

Оптимизации внутри CesiumJS

Horizon culling оптимизирован несколькими способами:

1. Предварительные вычисления

Для камеры кэшируются:

  • нормализованные векторы
  • коэффициенты кривизны
  • параметры касательной плоскости

2. Групповая проверка объектов

Tile-based системы (например, 3D Tiles) позволяют:

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

3. Ранний выход (early rejection)

Если bounding sphere целиком ниже горизонта:

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

Horizon culling в 3D Tiles

В системе 3D Tiles horizon culling особенно важен.

Каждый tile имеет:

  • bounding sphere
  • geometric error
  • экранный порог детализации

Horizon culling применяется до refinement stage, что позволяет:

  • не загружать дочерние тайлы
  • избегать выборки данных, которые не будут видны

Взаимодействие с Level of Detail (LOD)

Horizon culling тесно связан с LOD-логикой:

  • если tile за горизонтом → не происходит refinement
  • если tile частично видим → применяется screen-space error
  • если tile полностью видим → включается детализация

Таким образом horizon culling влияет не только на рендеринг, но и на систему подгрузки данных.


Ошибки и ограничения

Несмотря на эффективность, механизм имеет ограничения.

1. Приближённость модели

Horizon culling — это геометрическое приближение:

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

2. Малые объекты на горизонте

Тонкие или высокие объекты (например, антенны) могут:

  • частично попадать за предел отсечения
  • исчезать при определённых углах камеры

3. Высокодинамические сцены

При быстром движении камеры:

  • возможны кратковременные визуальные артефакты
  • пересчёт horizon state может быть недостаточно частым

Роль в общей архитектуре рендеринга

Horizon culling является промежуточным фильтром между:

  • геометрической моделью мира (Ellipsoid)
  • системой видимости (camera frustum)
  • GPU-пайплайном (WebGL draw calls)

Он снижает нагрузку на последующие этапы, уменьшая количество:

  • вершинных буферов
  • отрисовочных вызовов
  • загрузок tile данных

Связь с производительностью

В глобальных сценах CesiumJS основная проблема — масштаб данных.

Horizon culling напрямую влияет на:

  • количество активных tile
  • число загруженных текстур
  • объём GPU памяти
  • частоту кадров

На больших сценах он может отсеивать значительную часть мира, которая формально попадает в frustum, но геометрически скрыта кривизной планеты.


Поведение при отключении

При отключении horizon culling:

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

Фактически сцена перестаёт учитывать глобальную геометрию планеты и ведёт себя как плоский мир с frustum-only отсечением.