Level of detail управление

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

LOD (Level of Detail) в CesiumJS реализуется как иерархическая система тайлов, где каждый узел содержит геометрию определённого уровня детализации. При приближении камеры активируются более детальные тайлы, при удалении — упрощённые.

Ключевым понятием является геометрическая ошибка (geometric error), которая определяет, насколько сильно упрощённая версия отличается от более детализированной:

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

Каждый тайл содержит значение geometricError, на основе которого вычисляется необходимость его разделения.


Screen Space Error как центральный критерий

Основной механизм принятия решения о детализации — Screen Space Error (SSE). Он выражает ошибку геометрии в пикселях экрана, а не в мировых единицах.

SSE =

Если SSE превышает заданный порог, тайл подлежит разделению. Если ниже — остаётся текущий уровень детализации.

Параметр maximumScreenSpaceError в CesiumJS задаёт допустимый предел SSE:

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

Иерархия 3D Tiles и структура тайлов

LOD в CesiumJS наиболее полно реализуется через спецификацию 3D Tiles. Каждый tileset представляет собой дерево:

  • корневой тайл (root)
  • дочерние тайлы (children)
  • рекурсивное разбиение до нужного уровня детализации

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

  • bounding volume (объём ограничения: сфера, box, region)
  • geometricError
  • ссылку на дочерние тайлы
  • контент (glTF, b3dm, pnts и др.)

Алгоритм traversal:

  1. вычисление видимости bounding volume
  2. оценка screen space error
  3. решение: render / subdivide / skip

Bounding Volume и отсечение

Перед оценкой детализации выполняется отсечение (culling). Используются три типа ограничивающих объёмов:

  • сфера (BoundingSphere)
  • axis-aligned box
  • географическая область (region)

Если bounding volume вне фрустума камеры — тайл полностью исключается из обработки, что значительно снижает нагрузку.

Дополнительно применяется:

  • back-face culling
  • horizon culling (для глобальных сцен)
  • distance-based culling

Refinement: замещение и добавление

Каждый узел tileset задаёт стратегию замещения через параметр refine:

  • REPLACE — дочерние тайлы заменяют родительский
  • ADD — дочерние тайлы добавляются к родительскому

REPLACE используется в большинстве классических LOD-деревьев, так как предотвращает дублирование геометрии. ADD применяется для смешанных сцен, где требуется постепенное наращивание деталей.


Управление детализацией через параметры CesiumJS

Основные параметры, влияющие на LOD:

maximumScreenSpaceError

Контролирует порог перехода между уровнями детализации.

  • 16–32 — баланс качества и производительности
  • 8–12 — высокая детализация (нагрузка на GPU)
  • 64+ — агрессивное упрощение сцены

skipLevelOfDetail

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

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

loadSiblings

Определяет загрузку соседних тайлов для сглаживания переходов:

  • уменьшает «pop-in» эффект
  • увеличивает количество запросов

dynamicScreenSpaceError

Включает адаптацию SSE в зависимости от скорости движения камеры:

  • при быстром движении детализация снижается
  • при остановке камеры — повышается

Динамическая адаптация LOD

Динамическая система детализации учитывает не только геометрию, но и поведение камеры:

  • скорость перемещения
  • высота над поверхностью
  • угол обзора
  • плотность пикселей (devicePixelRatio)

В условиях быстрого движения используется временное снижение детализации, чтобы поддерживать стабильный FPS. При остановке камеры запускается догрузка более точных тайлов.


3D Tiles и геометрическая ошибка

Каждый тайл в 3D Tiles задаёт geometricError, который уменьшается по мере углубления дерева.

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

  • root: 1000+ метров ошибки
  • level 1: 500 м
  • level 2: 100 м
  • level 3: 10 м

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


LOD для terrain (Cesium Terrain)

Цифровые модели рельефа используют аналогичную систему:

  • heightmap tiles
  • quantized-mesh terrain

LOD управляется теми же принципами SSE, но дополнительно учитываются:

  • кривизна поверхности Земли
  • вертикальная ошибка высот
  • морфинг между уровнями (terrain morphing)

Морфинг обеспечивает плавный переход между LOD, предотвращая резкие скачки высот.


Imagery layers и детализация текстур

Помимо геометрии, LOD применяется к подложкам (imagery layers):

  • спутниковые тайлы (XYZ, WMTS)
  • географические текстуры

При изменении масштаба:

  • загружаются более детальные тайлы изображений
  • выполняется фильтрация и билинейная интерполяция
  • используется mipmapping для GPU-оптимизации

Каждый слой имеет собственную схему LOD, независимую от 3D Tiles.


Point Cloud LOD

Облака точек используют специфическую стратегию:

  • октодерево (octree)
  • агрегация точек в более крупные кластеры

LOD определяется плотностью точек на экран:

  • дальние расстояния → кластеры
  • ближние расстояния → отдельные точки

Используются методы:

  • point budget (ограничение количества точек)
  • hierarchical culling

Model LOD (glTF)

3D модели часто содержат несколько уровней детализации внутри одного ресурса:

  • high-poly mesh
  • medium-poly mesh
  • low-poly mesh

CesiumJS может переключать уровни через:

  • distance-based LOD selection
  • screen-space error approximation

Также применяются:

  • Draco compression для геометрии
  • texture LOD через mipmaps

Приоритет загрузки тайлов

LOD тесно связан с системой приоритетов запросов:

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

Приоритизация учитывает:

  • distance to camera
  • screen space error
  • visibility
  • parent-child dependency

Это предотвращает блокировку критически важных тайлов.


Кэширование и повторное использование

LOD-система опирается на многоуровневый кэш:

  • GPU cache (вершины и индексы)
  • in-memory tile cache
  • request cache

При повторном входе камеры в область сцены:

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

Диагностика LOD и отладочные режимы

Для анализа поведения LOD применяются встроенные визуализации:

  • отображение bounding volumes
  • цветовая индикация уровня тайла
  • отображение screen space error

Ключевые debug-флаги:

  • debugShowBoundingVolume
  • debugShowGeometricError
  • debugWireframe

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


Адаптация LOD под производительность устройства

LOD в CesiumJS адаптируется под:

  • GPU мощность
  • разрешение экрана
  • ограничения памяти
  • особенности мобильных устройств

На слабых устройствах:

  • увеличивается maximumScreenSpaceError
  • сокращается глубина дерева
  • активируется агрессивное пропускание уровней

На мощных системах:

  • уменьшается SSE
  • включается полная детализация 3D Tiles
  • увеличивается cache size

Влияние геометрии сцены на LOD

Сложность LOD-вычислений зависит от:

  • количества tilesets
  • плотности геометрии
  • перекрытия bounding volumes
  • количества активных imagery layers

Сцены с большим количеством перекрывающихся tilesets требуют более агрессивного culling и строгого контроля SSE.


Морфинг между уровнями детализации

Переход между LOD осуществляется через interpolation:

  • позиционная интерполяция вершин
  • плавное изменение высот
  • смешивание текстур

Это снижает визуальные артефакты при смене тайлов, особенно заметные в рельефе и городской геометрии.


Ограничения и особенности LOD-модели

LOD в CesiumJS имеет структурные ограничения:

  • резкие перепады качества при неверных geometricError
  • зависимость качества от корректности tileset.json
  • потенциальные артефакты при skipLevelOfDetail
  • рост нагрузки при избыточной загрузке siblings

Баланс между точностью и производительностью определяется комбинацией SSE, структуры дерева и стратегии refinement.