Технология CesiumJS опирается на формат 3D Tiles как основной механизм потоковой передачи и визуализации больших трёхмерных геопространственных данных. 3D Tiles представляет собой спецификацию для иерархической загрузки, отрисовки и управления сложными сценами, включающими фотограмметрию, облака точек, BIM-модели и процедурную геометрию.
3D Tiles строится на древовидной структуре, где каждый узел (tile) содержит геометрию разного уровня детализации (LOD). Основная идея заключается в том, что данные подгружаются и заменяются по мере необходимости в зависимости от положения камеры и требуемой точности отображения.
Каждый tileset начинается с файла tileset.json, который
описывает:
Иерархия может быть:
Ключевая идея — отказ от полной загрузки сцены. Вместо этого система выбирает только те узлы, которые видимы и необходимы для текущего уровня детализации.
Каждый тайл в 3D Tiles имеет ограничивающий объём (bounding volume), который используется для быстрого отсечения невидимых объектов. Поддерживаются формы:
Процесс рендеринга включает traversal дерева:
Screen-space error — ключевой параметр, определяющий, насколько детализированным должен быть тайл на экране. Чем ближе камера, тем ниже допустимая ошибка, и тем глубже происходит спуск по дереву.
Формат поддерживает несколько видов данных:
Содержит готовые 3D-модели с материалами и атрибутами. Часто используется для городских сцен.
Используется для массового размещения одинаковых объектов с разными трансформациями (например, деревья, фонари, автомобили).
Формат облаков точек, оптимизированный для LiDAR и фотограмметрии. Поддерживает атрибуты:
Современный формат, используемый как универсальный контейнер геометрии.
Geometric error определяет допустимое отклонение упрощённой модели от исходной. Он уменьшается по мере перехода к более детализированным уровням дерева.
Механизм выбора тайлов основывается на сравнении:
Если ошибка превышает порог — система углубляется в дочерние тайлы.
Это позволяет балансировать между:
CesiumJS использует асинхронную загрузку тайлов. Данные поступают по мере необходимости и кэшируются в памяти.
Механизм включает:
Приоритет загрузки определяется:
Таким образом, ближние и крупные объекты загружаются первыми.
Основной класс для работы с 3D Tiles —
Cesium3DTileset.
Он добавляется в сцену следующим образом:
const tileset = new Cesium.Cesium3DTileset({
url: "tileset.json"
});
viewer.scene.primitives.add(tileset);
Внутри происходит:
Tileset поддерживает события:
onTileLoadonTileFailonTileVisibleonTileUnloadCesiumJS поддерживает динамическую стилизацию через
Cesium3DTileStyle. Это позволяет изменять внешний вид
объектов без изменения исходных данных.
Пример логики стиля:
Стили применяются на уровне GPU-атрибутов, что делает процесс эффективным.
Внутри используется выражение, похожее на SQL-подобный синтаксис:
colorConditionfeature.property3D Tiles может использовать разные системы координат:
CesiumJS выполняет преобразования автоматически, используя матрицы трансформации каждого тайла.
Каждый узел может иметь:
Implicit tiling позволяет описывать бесконечно большие деревья без явного перечисления всех узлов. Вместо этого используется шаблон вычисления индексов:
Это особенно полезно для глобальных наборов данных, таких как:
Производительность 3D Tiles зависит от нескольких факторов:
Слишком глубокая иерархия увеличивает overhead traversal.
Слишком строгий threshold приводит к перегрузке GPU, слишком слабый — к размытию.
Использование instancing снижает количество draw calls.
Отсечение невидимых объектов на раннем этапе снижает нагрузку.
3D Tiles часто используется совместно с облачными хранилищами и потоковыми сервисами, где данные разбиты на небольшие сегменты.
Каждый tile может загружаться:
CesiumJS поддерживает прогрессивную загрузку без блокировки основного потока рендеринга.
Для облаков точек применяются дополнительные методы:
Это позволяет визуализировать миллиарды точек без потери интерактивности.
3D Tiles интегрируется в сцену CesiumJS как отдельный primitive слой. Он взаимодействует с:
Порядок рендеринга управляется depth testing и z-index логикой сцены.
Tileset может изменяться во время выполнения:
CesiumJS пересчитывает traversal без перезагрузки всей сцены.
Это важно для:
Каждый feature внутри tile может содержать атрибуты:
Эти данные доступны через picking API и используются для интерактивного взаимодействия.
Traversal 3D Tiles напрямую зависит от параметров камеры:
Изменение камеры мгновенно пересчитывает набор активных тайлов, обеспечивая адаптивный уровень детализации.
3D Tiles предназначен для работы с глобальными сценами, где:
Иерархическая структура позволяет поддерживать стабильный FPS даже при экстремальных объёмах данных, за счёт строгого контроля видимости и ошибок отображения.