3D Tiles

Технология CesiumJS опирается на формат 3D Tiles как основной механизм потоковой передачи и визуализации больших трёхмерных геопространственных данных. 3D Tiles представляет собой спецификацию для иерархической загрузки, отрисовки и управления сложными сценами, включающими фотограмметрию, облака точек, BIM-модели и процедурную геометрию.

3D Tiles строится на древовидной структуре, где каждый узел (tile) содержит геометрию разного уровня детализации (LOD). Основная идея заключается в том, что данные подгружаются и заменяются по мере необходимости в зависимости от положения камеры и требуемой точности отображения.

Каждый tileset начинается с файла tileset.json, который описывает:

  • структуру дерева тайлов
  • bounding volume каждого узла
  • ссылки на дочерние элементы
  • геометрическую ошибку (geometric error)
  • тип контента (b3dm, pnts, i3dm, glTF)

Иерархия может быть:

  • регулярным деревом (quadtree/octree)
  • неравномерной адаптивной структурой
  • implicit tiling (вычисляемая структура без явного перечисления всех узлов)

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

Bounding Volume и отбор видимых тайлов

Каждый тайл в 3D Tiles имеет ограничивающий объём (bounding volume), который используется для быстрого отсечения невидимых объектов. Поддерживаются формы:

  • сфера (bounding sphere)
  • осево-ориентированный параллелепипед (AABB)
  • произвольный выпуклый многоугольник (region)

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

  1. Проверка пересечения bounding volume с frustum камеры
  2. Оценка screen-space error
  3. Решение: отрисовать тайл или перейти к дочерним узлам

Screen-space error — ключевой параметр, определяющий, насколько детализированным должен быть тайл на экране. Чем ближе камера, тем ниже допустимая ошибка, и тем глубже происходит спуск по дереву.

Типы контента 3D Tiles

Формат поддерживает несколько видов данных:

b3dm (Bathed 3D Model)

Содержит готовые 3D-модели с материалами и атрибутами. Часто используется для городских сцен.

i3dm (Instanced 3D Model)

Используется для массового размещения одинаковых объектов с разными трансформациями (например, деревья, фонари, автомобили).

pnts (Point Clouds)

Формат облаков точек, оптимизированный для LiDAR и фотограмметрии. Поддерживает атрибуты:

  • цвет
  • нормали
  • интенсивность
  • классификация

glTF

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

Геометрическая ошибка и LOD-управление

Geometric error определяет допустимое отклонение упрощённой модели от исходной. Он уменьшается по мере перехода к более детализированным уровням дерева.

Механизм выбора тайлов основывается на сравнении:

  • projected error (ошибка в пикселях)
  • threshold (обычно заданный порог, например 2.0 или 1.0 пикселя)

Если ошибка превышает порог — система углубляется в дочерние тайлы.

Это позволяет балансировать между:

  • качеством изображения
  • производительностью GPU
  • объёмом памяти

Потоковая загрузка и кэширование

CesiumJS использует асинхронную загрузку тайлов. Данные поступают по мере необходимости и кэшируются в памяти.

Механизм включает:

  • request scheduler (контроль приоритетов)
  • tile cache (LRU-кэш)
  • progressive refinement (постепенное уточнение сцены)

Приоритет загрузки определяется:

  • расстоянием до камеры
  • размером экрана тайла
  • важностью в иерархии

Таким образом, ближние и крупные объекты загружаются первыми.

Cesium3DTileset в CesiumJS API

Основной класс для работы с 3D Tiles — Cesium3DTileset.

Он добавляется в сцену следующим образом:

const tileset = new Cesium.Cesium3DTileset({
    url: "tileset.json"
});

viewer.scene.primitives.add(tileset);

Внутри происходит:

  • загрузка root tile
  • инициализация traversal
  • подключение к системе рендеринга сцены

Tileset поддерживает события:

  • onTileLoad
  • onTileFail
  • onTileVisible
  • onTileUnload

Стайлинг 3D Tiles

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

Пример логики стиля:

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

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

Внутри используется выражение, похожее на SQL-подобный синтаксис:

  • условия colorCondition
  • доступ к свойствам feature.property

Пространственные данные и coordinate systems

3D Tiles может использовать разные системы координат:

  • WGS84 (EPSG:4326)
  • ECEF (Earth-Centered, Earth-Fixed)
  • локальные системы для BIM/инженерных моделей

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

Каждый узел может иметь:

  • transform matrix (4x4)
  • bounding volume в локальных координатах
  • глобальную геопозицию через root transform

Implicit Tiling

Implicit tiling позволяет описывать бесконечно большие деревья без явного перечисления всех узлов. Вместо этого используется шаблон вычисления индексов:

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

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

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

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

Производительность 3D Tiles зависит от нескольких факторов:

1. Ограничение глубины дерева

Слишком глубокая иерархия увеличивает overhead traversal.

2. Баланс геометрической ошибки

Слишком строгий threshold приводит к перегрузке GPU, слишком слабый — к размытию.

3. Batch-обработка

Использование instancing снижает количество draw calls.

4. Frustum culling

Отсечение невидимых объектов на раннем этапе снижает нагрузку.

Облачные данные и интеграция с потоковыми сервисами

3D Tiles часто используется совместно с облачными хранилищами и потоковыми сервисами, где данные разбиты на небольшие сегменты.

Каждый tile может загружаться:

  • по HTTP
  • через CDN
  • через специализированные геосервисы

CesiumJS поддерживает прогрессивную загрузку без блокировки основного потока рендеринга.

Point Cloud оптимизация

Для облаков точек применяются дополнительные методы:

  • point attenuation (уменьшение плотности)
  • eye-dome lighting (визуальное усиление глубины)
  • hierarchical clustering

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

Интеграция с Scene Graph

3D Tiles интегрируется в сцену CesiumJS как отдельный primitive слой. Он взаимодействует с:

  • terrain provider
  • imagery layers
  • custom primitives

Порядок рендеринга управляется depth testing и z-index логикой сцены.

Динамическое обновление tileset

Tileset может изменяться во время выполнения:

  • добавление новых тайлов
  • обновление контента
  • удаление узлов

CesiumJS пересчитывает traversal без перезагрузки всей сцены.

Это важно для:

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

Система атрибутов и семантика данных

Каждый feature внутри tile может содержать атрибуты:

  • идентификаторы объектов
  • метаданные зданий
  • классификацию материалов
  • физические параметры

Эти данные доступны через picking API и используются для интерактивного взаимодействия.

Взаимодействие с камерой

Traversal 3D Tiles напрямую зависит от параметров камеры:

  • FOV (field of view)
  • position
  • orientation
  • near/far planes

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

Масштабируемость и глобальные сцены

3D Tiles предназначен для работы с глобальными сценами, где:

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

Иерархическая структура позволяет поддерживать стабильный FPS даже при экстремальных объёмах данных, за счёт строгого контроля видимости и ошибок отображения.