Ground primitives

В CesiumJS ground primitives используются для отрисовки геометрии, «приклеенной» к поверхности земного эллипсоида или рельефа. В отличие от обычных примитивов сцены, которые располагаются в трёхмерном пространстве с фиксированной высотой, ground primitives учитывают террейн и 3D Tiles, обеспечивая корректное позиционирование на поверхности.

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


Архитектурная роль ground primitives

Ground primitives находятся между высокоуровневыми Entity API и низкоуровневыми Primitive API.

  • Entity API предоставляет декларативное описание объектов
  • Primitive API даёт максимальную производительность и контроль
  • Ground primitives реализуют компромисс: производительность близкая к primitives + привязка к земле

Внутри CesiumJS ground primitives используют специализированные буферы и шейдеры, которые учитывают:

  • высоту terrain provider
  • классификацию 3D Tiles
  • глубину сцены
  • приоритет отрисовки относительно других ground объектов

GroundPrimitive: базовый строительный блок

GroundPrimitive предназначен для рендеринга полигонов, которые лежат на поверхности земли.

Основные свойства

  • geometryInstances — набор геометрий
  • appearance — визуальное представление (материал/шейдер)
  • asynchronous — разрешение асинхронной обработки
  • classificationType — тип классификации поверхности

Ключевой механизм: геометрия не имеет фиксированной высоты, а «приклеивается» к поверхности террейна.


Геометрии и их особенности

GroundPrimitive работает с ограниченным набором геометрий:

  • PolygonGeometry
  • RectangleGeometry
  • CircleGeometry

Ограничение: не все типы геометрий поддерживаются, поскольку требуется возможность корректного проецирования на поверхность ellipsoid/terrain.

Особенность проекции

Перед рендерингом вершины:

  1. преобразуются в географические координаты
  2. запрашивают высоту у terrain provider
  3. корректируются под 3D Tiles классификацию (если включено)

ClassificationType и взаимодействие с 3D Tiles

Одним из ключевых механизмов является классификация.

  • TERRAIN — влияет только на рельеф
  • CESIUM_3D_TILE — влияет на 3D Tiles
  • BOTH — комбинированный режим

Суть классификации: ground primitive не просто рисуется поверх сцены, а может изменять визуальное поведение подлежащих слоёв.

Это используется для:

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

GroundPolylinePrimitive и линии на поверхности

Отдельный тип — GroundPolylinePrimitive, предназначенный для линий, повторяющих рельеф.

Отличие от PolylinePrimitive

Обычные полилинии:

  • существуют в 3D пространстве
  • требуют явной высоты

GroundPolylinePrimitive:

  • следуют terrain
  • используют экранную толщину
  • пересчитываются при изменении уровня детализации terrain

Геометрическая обработка полилиний

Полилиния разбивается на сегменты:

  • сегментация по тайлам terrain
  • интерполяция высот
  • адаптация к LOD

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

  • пересчитывается видимая часть
  • происходит ре-тесселяция при необходимости

Важно: это дорогостоящая операция, поэтому используется кэширование геометрии.


Производительность и батчинг

Ground primitives используют специализированный pipeline оптимизации:

Базовые принципы

  • группировка геометрий по материалам
  • минимизация draw calls
  • использование vertex compression
  • предвычисление индексов

Ограничения

  • динамическое изменение геометрии дорого
  • большое количество объектов снижает FPS быстрее, чем у ScreenSpace primitives
  • классификация 3D Tiles увеличивает нагрузку на GPU

Асинхронная обработка

Параметр asynchronous позволяет:

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

Однако:

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

Appearance и материалы

Appearance определяет визуальное поведение ground primitive.

Основные типы:

  • MaterialAppearance
  • PerInstanceColorAppearance
  • пользовательские шейдеры

Материалы поддерживают:

  • прозрачность
  • градиенты
  • текстуры
  • процедурные эффекты

Особенность: shading учитывает curvature Земли и освещение сцены.


Depth testing и z-index поведение

Ground primitives интегрируются в глубинный буфер сцены.

Основные эффекты:

  • корректное перекрытие terrain
  • взаимодействие с 3D Tiles
  • предотвращение z-fighting через depth bias

Однако при сложных сценах:

  • возможны конфликты с translucent materials
  • требуется настройка renderOrder в зависимости от слоя

Взаимодействие с terrain provider

Ground primitives тесно связаны с terrain provider:

  • Cesium World Terrain
  • локальные terrain tilesets
  • procedural terrain

При изменении terrain:

  • происходит перерасчёт высот
  • геометрия может переинтерполироваться
  • кэш invalidation зависит от tile availability

Особенности точности и артефакты

При работе с ground primitives возникают специфические проблемы:

1. Смещения на границах тайлов

Возникают из-за:

  • различий LOD
  • разной точности высот

2. Дрожание геометрии

При движении камеры:

  • пересчёт terrain вызывает микросмещения

3. Потери точности на больших координатах

Используется double precision, но:

  • шейдерная стадия ограничена float precision

Оптимизация использования

Эффективная работа ground primitives требует учёта:

Ограничение количества объектов

Большое число GroundPrimitive объектов ухудшает производительность быстрее, чем их агрегация.

Использование батчинга

Лучше объединять геометрии:

  • по материалу
  • по типу классификации

Минимизация пересчётов

Избегается частое изменение:

  • positions
  • hierarchy
  • extrudedHeight

Сравнение с Entity API

Ground primitives часто используются вместо Entity в высоконагруженных сценах.

Entity:

  • проще
  • медленнее
  • автоматически управляет состоянием

GroundPrimitive:

  • сложнее
  • быстрее
  • требует ручного контроля

Основной выбор:

  • аналитические карты → ground primitives
  • интерактивные сцены → entity

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

Ground primitives применяются в:

  • GIS-анализе
  • военных симуляциях
  • визуализации зон покрытия
  • тепловых картах
  • территориальном планировании

Их ключевая ценность — точное соответствие поверхности Земли без ручной коррекции высот.


Ограничения модели ground primitives

Несмотря на мощность, присутствуют ограничения:

  • не поддерживают полноценную 3D геометрию
  • сложные extrusion сценарии ограничены
  • зависимость от terrain quality
  • ограниченный набор типов геометрии
  • высокая стоимость динамических обновлений

Поведение при работе с 3D Tiles

При взаимодействии с tilesets:

  • возможна классификация зданий
  • поддержка clipping через polygon masking
  • корректная глубинная интеграция

Однако:

  • сложные tilesets увеличивают latency
  • требуется баланс между classification и performance

Внутренний рендеринг pipeline

Процесс рендеринга включает этапы:

  1. Triangulation геометрии
  2. Projection на ellipsoid
  3. Sampling terrain height
  4. Tile-based subdivision
  5. GPU buffer upload
  6. Shader execution с учетом material/appearance

Каждый этап оптимизирован под streaming данных CesiumJS.


Практическая роль в архитектуре сцен

Ground primitives часто становятся основой:

  • слоёв визуализации
  • интерактивных зон
  • геопривязанных интерфейсов
  • аналитических overlay систем

Их использование позволяет отделить:

  • геометрию сцены
  • визуальную семантику
  • слой данных

Итоговая роль в графическом пайплайне CesiumJS

Ground primitives формируют специализированный слой рендеринга, ориентированный на точное следование поверхности Земли, интеграцию с terrain и 3D Tiles и высокопроизводительную отрисовку геопространственных данных.