Composite tiles

Composite tiles представляют собой специальный формат тайлов в экосистеме 3D Tiles, позволяющий объединять несколько различных типов тайлов в одном бинарном контейнере. Такой подход используется для эффективной передачи разнородных пространственных данных через единую структуру.

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

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

Вместо создания отдельных запросов для каждого типа содержимого сервер может передать один composite tile, содержащий несколько вложенных тайлов.


Роль Composite Tiles в архитектуре 3D Tiles

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

Формат Назначение
B3DM Батчи 3D-моделей
I3DM Инстансированные модели
PNTS Облака точек
CMPT Composite tiles
VCTR Векторные данные
GEOJSON Геопространственные объекты

Формат CMPT (Composite Tile) выступает контейнером верхнего уровня, внутри которого могут располагаться другие тайлы.

Схематически структура выглядит следующим образом:

CMPT
├── B3DM
├── PNTS
├── I3DM
└── B3DM

Каждый вложенный элемент сохраняет собственный внутренний формат и интерпретируется CesiumJS как самостоятельный тайл.


Когда используются Composite Tiles

Наиболее распространённые сценарии применения:

Смешанные городские сцены

Одна территория может включать:

  • здания в B3DM;
  • деревья через I3DM;
  • лазерное сканирование через PNTS.

Объединение в CMPT позволяет загрузить всё содержимое одним запросом.


Исторические данные

Например:

CMPT
├── Современные здания (B3DM)
├── Архивные модели (B3DM)
└── Облако точек раскопок (PNTS)

Инженерные системы

Композитный тайл может содержать:

CMPT
├── Поверхностные объекты
├── Подземные коммуникации
├── Точки измерений
└── Служебные метаданные

Формат файла CMPT

Файл Composite Tile начинается со стандартного заголовка.

Структура заголовка

struct CompositeHeader
{
    char magic[4];
    uint32 version;
    uint32 byteLength;
    uint32 tilesLength;
}

Поля заголовка

magic

Содержит строку:

cmpt

Она определяет тип тайла.


version

Версия формата.

Обычно:

1

byteLength

Полный размер файла в байтах.

Пример:

byteLength = 125632

tilesLength

Количество вложенных тайлов.

Например:

tilesLength = 4

Означает наличие четырёх дочерних элементов внутри контейнера.


Структура содержимого

После заголовка последовательно размещаются бинарные данные вложенных тайлов.

Пример:

CMPT
│
├── Header
│
├── Tile #1 (B3DM)
├── Tile #2 (PNTS)
├── Tile #3 (I3DM)
└── Tile #4 (B3DM)

Каждый внутренний тайл содержит собственный заголовок и собственное содержимое.

CesiumJS анализирует контейнер, определяет тип каждого вложенного элемента и создаёт соответствующий объект загрузки.


Пример внутреннего устройства

Допустим имеется следующий файл:

cmpt
├── b3dm
├── b3dm
├── pnts
└── i3dm

При загрузке происходит следующий процесс:

  1. Считывается заголовок CMPT.
  2. Определяется количество вложенных тайлов.
  3. Для каждого тайла читается собственный magic.
  4. Создаётся соответствующий обработчик.
  5. Выполняется подготовка данных к рендерингу.

Работа Composite Tiles в CesiumJS

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

const tileset = await Cesium.Cesium3DTileset.fromUrl(
    "tileset.json"
);

viewer.scene.primitives.add(tileset);

Если внутри набора присутствуют Composite Tiles, движок автоматически:

  • обнаруживает формат CMPT;
  • извлекает вложенные тайлы;
  • создаёт объекты содержимого;
  • передаёт их в систему рендеринга.

Для прикладного кода различий практически нет.


Процесс загрузки Composite Tile

Последовательность действий внутри движка выглядит следующим образом.

Этап 1. Получение бинарного файла

GET tile.cmpt

Сервер возвращает единый контейнер.


Этап 2. Проверка заголовка

Проверяется сигнатура:

cmpt

Если сигнатура отсутствует, загрузка завершается ошибкой.


Этап 3. Чтение tilesLength

Например:

tilesLength = 3

Этап 4. Извлечение вложенных тайлов

Tile 1 → b3dm
Tile 2 → pnts
Tile 3 → i3dm

Этап 5. Создание контента

Для каждого вложенного формата создаётся специализированный объект:

Batched3DModel3DTileContent
PointCloud3DTileContent
Instanced3DModel3DTileContent

Этап 6. Рендеринг

Все извлечённые данные попадают в графический конвейер и отображаются как единый узел тайлового дерева.


Composite Tiles и дерево тайлов

Важно понимать, что Composite Tile не является узлом дерева сам по себе.

Он представляет содержимое конкретного узла.

Пример:

{
  "root": {
    "boundingVolume": {
      "box": [...]
    },
    "content": {
      "uri": "city.cmpt"
    }
  }
}

Здесь узел дерева один, однако его содержимое включает несколько внутренних тайлов.


Bounding Volume

Bounding Volume задаётся на уровне узла tileset.

Вложенные тайлы обычно используют границы родительского контейнера.

Пример:

{
  "boundingVolume": {
    "region": [
      -1.0,
      0.5,
      -0.9,
      0.6,
      0,
      120
    ]
  }
}

При определении видимости сначала проверяется контейнер.

Если контейнер находится вне области обзора камеры, его содержимое даже не анализируется.

Это снижает нагрузку на систему.


Преимущества Composite Tiles

Уменьшение количества HTTP-запросов

Без CMPT:

tile1.b3dm
tile2.pnts
tile3.i3dm

Требуются три отдельных запроса.

С использованием CMPT:

city.cmpt

Необходим только один запрос.


Ускорение сетевой передачи

Снижаются:

  • накладные расходы HTTP;
  • количество TLS-соединений;
  • задержки сети.

Особенно заметно это при работе через мобильные сети.


Упрощение организации данных

Вместо большого количества файлов можно хранить единый контейнер.

Например:

District_15.cmpt

вместо:

District_15_buildings.b3dm
District_15_trees.i3dm
District_15_scan.pnts

Совместная загрузка связанных данных

Все пространственно связанные объекты поступают одновременно.

Это уменьшает вероятность визуальных артефактов вида:

Здания уже появились
Деревья ещё не загружены
Облако точек отсутствует

Ограничения Composite Tiles

Несмотря на преимущества, существуют и недостатки.

Увеличение размера файла

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

Пример:

10 МБ B3DM
1 МБ PNTS

Даже если нужен только B3DM, придётся загружать весь контейнер размером 11 МБ.


Отсутствие независимой подгрузки

Нельзя запросить только один вложенный тайл.

Всегда загружается весь файл CMPT.


Более сложное создание

Генератор тайлов должен:

  1. создать отдельные внутренние тайлы;
  2. вычислить размеры;
  3. сформировать общий заголовок;
  4. корректно выровнять данные по границам памяти.

Использование Composite Tiles в современных версиях 3D Tiles

Исторически формат CMPT активно применялся в ранних версиях спецификации 3D Tiles.

С развитием стандарта появились более гибкие механизмы организации содержимого:

  • Multiple Contents;
  • Metadata Extensions;
  • 3D Tiles Next;
  • Implicit Tiling.

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

Тем не менее CesiumJS продолжает поддерживать Composite Tiles для обеспечения совместимости с существующими наборами данных.


Сравнение Composite Tiles и Multiple Contents

Composite Tiles

Node
 └── city.cmpt
      ├── b3dm
      ├── pnts
      └── i3dm

Особенности:

  • единый бинарный контейнер;
  • одно содержимое в узле дерева;
  • физическое объединение данных.

Multiple Contents

Node
 ├── buildings.b3dm
 ├── trees.i3dm
 └── scan.pnts

Особенности:

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

Отладка Composite Tiles

При анализе проблем полезно проверять:

Заголовок файла

Первые четыре байта должны содержать:

cmpt

Размер файла

Поле:

byteLength

должно совпадать с фактическим размером контейнера.


Количество вложенных элементов

Значение:

tilesLength

обязано соответствовать реальному числу вложенных тайлов.


Типы внутренних тайлов

Допустимые сигнатуры:

b3dm
i3dm
pnts
vctr
geom

Некорректная сигнатура приводит к ошибке разбора содержимого.


Внутренний жизненный цикл Composite Tile в CesiumJS

Во время работы движка выполняются следующие стадии:

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, извлекает вложенные структуры и отображает их через стандартный механизм потоковой загрузки и рендеринга трёхмерных геопространственных сцен.