glTF рассматривается в CesiumJS как основной формат 3D-контента для отображения произвольных моделей в глобальной сцене. Он используется для интеграции объектов зданий, техники, персонажей, датчиков и любых иных трехмерных ассетов в географический контекст с высокой производительностью и поддержкой потоковой отрисовки.
CesiumJS поддерживает загрузку glTF через несколько уровней API:
низкоуровневый Model, высокоуровневые сущности
Entity и интеграцию через 3D Tiles. Выбор подхода
определяется задачами: единичная модель, динамическая сцена или
крупномасштабный потоковый датасет.
Внутри CesiumJS модель glTF проходит несколько этапов:
Результатом становится объект, который участвует в сцене как полноценный графический примитив.
Низкоуровневый способ загрузки обеспечивает максимальный контроль над моделью.
import * as Cesium from "cesium";
const viewer = new Cesium.Viewer("cesiumContainer");
const model = Cesium.Model.fromGltf({
url: "models/vehicle.glb",
modelMatrix: Cesium.Matrix4.fromTranslation(
Cesium.Cartesian3.fromDegrees(30.5, 50.4, 100)
),
scale: 1.0
});
viewer.scene.primitives.add(model);
.gltf или
.glbСовременный подход использует fromGltfAsync, позволяющий
не блокировать основной поток.
const model = await Cesium.Model.fromGltfAsync({
url: "models/building.glb",
modelMatrix: Cesium.Transforms.eastNorthUpToFixedFrame(
Cesium.Cartesian3.fromDegrees(37.6173, 55.7558, 0)
)
});
viewer.scene.primitives.add(model);
Асинхронная загрузка особенно важна при работе с тяжелыми сценами, где требуется плавная отрисовка без фризов интерфейса.
Entity-подход интегрирует glTF модель в декларативную модель сцены.
const entity = viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(10.0, 45.0, 0),
model: {
uri: "models/airplane.glb",
scale: 2.0,
minimumPixelSize: 64
}
});
Этот способ используется в сценариях, где требуется:
Ключевая особенность CesiumJS — строгая работа с геодезическими координатами.
const position = Cesium.Cartesian3.fromDegrees(
69.2401,
41.2995,
500
);
const modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(position);
Этот метод обеспечивает корректную ориентацию модели относительно поверхности Земли.
Для точного позиционирования используется комбинация Heading-Pitch-Roll:
const hpr = new Cesium.HeadingPitchRoll(
Cesium.Math.toRadians(90),
Cesium.Math.toRadians(0),
Cesium.Math.toRadians(0)
);
const modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(
position,
hpr
);
Это позволяет:
glTF модели часто требуют адаптации к масштабу сцены.
model.scale = 5.0;
model.minimumPixelSize = 128;
model.maximumScale = 20000;
Позволяет сохранять видимость объекта при удалении камеры.
Ограничивает чрезмерное увеличение модели при приближении.
CesiumJS поддерживает PBR-материалы glTF (Physically Based Rendering):
viewer.scene.globe.enableLighting = true;
При включённом освещении модель реагирует на:
Для повышения производительности используются:
Сжимает геометрию:
Cesium.Model.fromGltf({
url: "compressed.glb"
});
Cesium автоматически распознаёт Draco при наличии декодера.
Используются для GPU-декодируемых текстур, уменьшая нагрузку на память.
CesiumJS использует внутренний кэш ресурсов:
При работе с удалёнными серверами важны:
glTF часто используется как часть тайлового набора.
const tileset = new Cesium.Cesium3DTileset({
url: "tileset.json"
});
viewer.scene.primitives.add(tileset);
Внутри каждого тайла может находиться glTF-геометрия, что обеспечивает:
CesiumJS поддерживает встроенные анимации:
model.activeAnimations.addAll();
Управление:
Основные узкие места:
Решается:
Решается:
Решается:
const position = Cesium.Cartesian3.fromDegrees(55.751244, 37.618423, 50);
const modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(
position,
new Cesium.HeadingPitchRoll(
Cesium.Math.toRadians(45),
0,
0
)
);
const model = Cesium.Model.fromGltf({
url: "models/drone.glb",
modelMatrix: modelMatrix,
scale: 3.0,
minimumPixelSize: 128,
shadows: Cesium.ShadowMode.ENABLED
});
viewer.scene.primitives.add(model);
model.readyPromise.then(() => {
model.activeAnimations.addAll({
loop: Cesium.ModelAnimationLoop.REPEAT
});
});
Модели могут быть связаны с камерой:
viewer.trackedEntity = entity;
или через программное управление:
viewer.camera.lookAt(position, new Cesium.Cartesian3(0, -1000, 500));
Для динамических моделей используется изменение
modelMatrix:
model.modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(
Cesium.Cartesian3.fromDegrees(newLon, newLat, newHeight)
);
Это позволяет реализовать:
CesiumJS использует Earth-Centered Earth-Fixed (ECEF):
Это влияет на:
Внутренний цикл выглядит следующим образом:
Этот процесс делает возможным отображение сложных 3D сцен в реальном времени даже на ограниченном оборудовании.