Composite tiles представляют собой специальный формат тайлов в экосистеме 3D Tiles, позволяющий объединять несколько различных типов тайлов в одном бинарном контейнере. Такой подход используется для эффективной передачи разнородных пространственных данных через единую структуру.
Формат особенно полезен в случаях, когда одна область сцены содержит разные представления данных:
Вместо создания отдельных запросов для каждого типа содержимого сервер может передать один composite tile, содержащий несколько вложенных тайлов.
Стандарт 3D Tiles поддерживает несколько основных форматов содержимого:
| Формат | Назначение |
|---|---|
| B3DM | Батчи 3D-моделей |
| I3DM | Инстансированные модели |
| PNTS | Облака точек |
| CMPT | Composite tiles |
| VCTR | Векторные данные |
| GEOJSON | Геопространственные объекты |
Формат CMPT (Composite Tile) выступает контейнером верхнего уровня, внутри которого могут располагаться другие тайлы.
Схематически структура выглядит следующим образом:
CMPT
├── B3DM
├── PNTS
├── I3DM
└── B3DM
Каждый вложенный элемент сохраняет собственный внутренний формат и интерпретируется CesiumJS как самостоятельный тайл.
Наиболее распространённые сценарии применения:
Одна территория может включать:
Объединение в CMPT позволяет загрузить всё содержимое одним запросом.
Например:
CMPT
├── Современные здания (B3DM)
├── Архивные модели (B3DM)
└── Облако точек раскопок (PNTS)
Композитный тайл может содержать:
CMPT
├── Поверхностные объекты
├── Подземные коммуникации
├── Точки измерений
└── Служебные метаданные
Файл Composite Tile начинается со стандартного заголовка.
struct CompositeHeader
{
char magic[4];
uint32 version;
uint32 byteLength;
uint32 tilesLength;
}
Содержит строку:
cmpt
Она определяет тип тайла.
Версия формата.
Обычно:
1
Полный размер файла в байтах.
Пример:
byteLength = 125632
Количество вложенных тайлов.
Например:
tilesLength = 4
Означает наличие четырёх дочерних элементов внутри контейнера.
После заголовка последовательно размещаются бинарные данные вложенных тайлов.
Пример:
CMPT
│
├── Header
│
├── Tile #1 (B3DM)
├── Tile #2 (PNTS)
├── Tile #3 (I3DM)
└── Tile #4 (B3DM)
Каждый внутренний тайл содержит собственный заголовок и собственное содержимое.
CesiumJS анализирует контейнер, определяет тип каждого вложенного элемента и создаёт соответствующий объект загрузки.
Допустим имеется следующий файл:
cmpt
├── b3dm
├── b3dm
├── pnts
└── i3dm
При загрузке происходит следующий процесс:
При использовании стандартного загрузчика специальная обработка обычно не требуется.
const tileset = await Cesium.Cesium3DTileset.fromUrl(
"tileset.json"
);
viewer.scene.primitives.add(tileset);
Если внутри набора присутствуют Composite Tiles, движок автоматически:
Для прикладного кода различий практически нет.
Последовательность действий внутри движка выглядит следующим образом.
GET tile.cmpt
Сервер возвращает единый контейнер.
Проверяется сигнатура:
cmpt
Если сигнатура отсутствует, загрузка завершается ошибкой.
Например:
tilesLength = 3
Tile 1 → b3dm
Tile 2 → pnts
Tile 3 → i3dm
Для каждого вложенного формата создаётся специализированный объект:
Batched3DModel3DTileContent
PointCloud3DTileContent
Instanced3DModel3DTileContent
Все извлечённые данные попадают в графический конвейер и отображаются как единый узел тайлового дерева.
Важно понимать, что Composite Tile не является узлом дерева сам по себе.
Он представляет содержимое конкретного узла.
Пример:
{
"root": {
"boundingVolume": {
"box": [...]
},
"content": {
"uri": "city.cmpt"
}
}
}
Здесь узел дерева один, однако его содержимое включает несколько внутренних тайлов.
Bounding Volume задаётся на уровне узла tileset.
Вложенные тайлы обычно используют границы родительского контейнера.
Пример:
{
"boundingVolume": {
"region": [
-1.0,
0.5,
-0.9,
0.6,
0,
120
]
}
}
При определении видимости сначала проверяется контейнер.
Если контейнер находится вне области обзора камеры, его содержимое даже не анализируется.
Это снижает нагрузку на систему.
Без CMPT:
tile1.b3dm
tile2.pnts
tile3.i3dm
Требуются три отдельных запроса.
С использованием CMPT:
city.cmpt
Необходим только один запрос.
Снижаются:
Особенно заметно это при работе через мобильные сети.
Вместо большого количества файлов можно хранить единый контейнер.
Например:
District_15.cmpt
вместо:
District_15_buildings.b3dm
District_15_trees.i3dm
District_15_scan.pnts
Все пространственно связанные объекты поступают одновременно.
Это уменьшает вероятность визуальных артефактов вида:
Здания уже появились
Деревья ещё не загружены
Облако точек отсутствует
Несмотря на преимущества, существуют и недостатки.
Если один компонент требуется часто, а другой редко, объединение может привести к избыточной передаче данных.
Пример:
10 МБ B3DM
1 МБ PNTS
Даже если нужен только B3DM, придётся загружать весь контейнер размером 11 МБ.
Нельзя запросить только один вложенный тайл.
Всегда загружается весь файл CMPT.
Генератор тайлов должен:
Исторически формат CMPT активно применялся в ранних версиях спецификации 3D Tiles.
С развитием стандарта появились более гибкие механизмы организации содержимого:
Во многих новых проектах предпочтение отдаётся этим технологиям, поскольку они позволяют описывать сложные наборы данных без необходимости объединять несколько тайлов в один бинарный контейнер.
Тем не менее CesiumJS продолжает поддерживать Composite Tiles для обеспечения совместимости с существующими наборами данных.
Node
└── city.cmpt
├── b3dm
├── pnts
└── i3dm
Особенности:
Node
├── buildings.b3dm
├── trees.i3dm
└── scan.pnts
Особенности:
При анализе проблем полезно проверять:
Первые четыре байта должны содержать:
cmpt
Поле:
byteLength
должно совпадать с фактическим размером контейнера.
Значение:
tilesLength
обязано соответствовать реальному числу вложенных тайлов.
Допустимые сигнатуры:
b3dm
i3dm
pnts
vctr
geom
Некорректная сигнатура приводит к ошибке разбора содержимого.
Во время работы движка выполняются следующие стадии:
Request
↓
Download CMPT
↓
Parse Header
↓
Extract Tiles
↓
Create Contents
↓
Upload To GPU
↓
Render
После удаления тайла из кэша происходит обратный процесс:
Release GPU Resources
↓
Destroy Content Objects
↓
Remove Tile From Cache
Таким образом, Composite Tiles представляют собой контейнерный формат 3D Tiles, предназначенный для объединения нескольких разнородных типов пространственных данных в одном тайле. CesiumJS автоматически распознаёт формат CMPT, извлекает вложенные структуры и отображает их через стандартный механизм потоковой загрузки и рендеринга трёхмерных геопространственных сцен.