Сцена (Scene) является центральным объектом визуализации в CesiumJS. Она отвечает за отображение глобуса, трехмерных объектов, примитивов, источников данных, освещения, камер и всех визуальных компонентов приложения.
При создании экземпляра Cesium.Viewer объект сцены
создаётся автоматически и доступен через свойство:
const viewer = new Cesium.Viewer("cesiumContainer");
const scene = viewer.scene;
Практически все операции по настройке визуализации выполняются через
объект Scene.
Сцена объединяет несколько ключевых подсистем:
Camera);Globe);PrimitiveCollection);EntityCollection);Схематически взаимодействие выглядит следующим образом:
Scene
├── Camera
├── Globe
├── Primitives
├── Imagery Layers
├── Terrain
├── PostProcessStages
├── SkyBox
└── Lighting
Каждый кадр Cesium обновляет состояние этих компонентов и формирует итоговое изображение.
Во многих случаях требуется непосредственное управление сценой.
const scene = viewer.scene;
После этого становятся доступны настройки визуализации:
scene.fog.enabled = false;
scene.globe.enableLighting = true;
scene.skyAtmosphere.show = true;
Cesium поддерживает несколько режимов отображения Земли.
Стандартный режим визуализации.
viewer.scene.mode === Cesium.SceneMode.SCENE3D;
Переключение:
viewer.scene.morphTo3D(2);
Параметр указывает длительность анимации в секундах.
Представляет поверхность как плоскую карту.
viewer.scene.morphTo2D(2);
Особенности:
Промежуточный режим между 2D и 3D.
viewer.scene.morphToColumbusView(2);
Особенности:
Если часть сцены не заполнена объектами или изображениями, отображается цвет фона.
По умолчанию используется черный цвет.
Изменение:
viewer.scene.backgroundColor = Cesium.Color.DARKBLUE;
Создание собственного цвета:
viewer.scene.backgroundColor =
new Cesium.Color(0.1, 0.2, 0.3, 1.0);
Компоненты задаются в диапазоне от 0 до 1:
R, G, B, Alpha
Глобус является частью сцены.
Получение объекта:
const globe = viewer.scene.globe;
Иногда требуется отображать только объекты без Земли.
viewer.scene.globe.show = false;
Возврат:
viewer.scene.globe.show = true;
Подобный режим часто используется при визуализации космических объектов.
viewer.scene.globe.translucency.enabled = true;
viewer.scene.globe.translucency.frontFaceAlpha = 0.5;
Результат:
Cesium имитирует атмосферное рассеяние света.
Получение объекта атмосферы:
const atmosphere = viewer.scene.skyAtmosphere;
viewer.scene.skyAtmosphere.show = true;
Отключение:
viewer.scene.skyAtmosphere.show = false;
viewer.scene.skyAtmosphere.brightnessShift = 0.2;
Уменьшение яркости:
viewer.scene.skyAtmosphere.brightnessShift = -0.3;
Параметр влияет на общее восприятие освещённости планеты.
Туман используется для повышения реалистичности и оптимизации производительности.
Получение объекта:
const fog = viewer.scene.fog;
fog.enabled = true;
Отключение:
fog.enabled = false;
fog.density = 0.00015;
Увеличение значения приводит к более быстрому исчезновению удалённых объектов.
fog.maxHeight = 800000;
При превышении указанной высоты туман автоматически отключается.
Освещение играет важную роль при работе с рельефом и 3D-моделями.
viewer.scene.globe.enableLighting = true;
После включения становятся заметны:
viewer.scene.globe.enableLighting = true;
Для корректного отображения необходимо также настроить время симуляции.
Тени повышают реализм визуализации.
Включение:
viewer.shadows = true;
Проверка:
console.log(viewer.shadows);
Для объектов:
entity.model.shadows = Cesium.ShadowMode.ENABLED;
Доступные варианты:
Cesium.ShadowMode.DISABLED
Cesium.ShadowMode.ENABLED
Cesium.ShadowMode.CAST_ONLY
Cesium.ShadowMode.RECEIVE_ONLY
Cesium содержит встроенную визуализацию космоса.
viewer.scene.skyBox.show = true;
Скрытие:
viewer.scene.skyBox.show = false;
viewer.scene.skyBox = new Cesium.SkyBox({
sources: {
positiveX: "px.jpg",
negativeX: "nx.jpg",
positiveY: "py.jpg",
negativeY: "ny.jpg",
positiveZ: "pz.jpg",
negativeZ: "nz.jpg"
}
});
SkyBox представляет собой кубическую текстуру, окружающую сцену.
Cesium предоставляет набор эффектов постобработки.
Получение коллекции:
const stages = viewer.scene.postProcessStages;
const blur = Cesium.PostProcessStageLibrary.createBlurStage();
viewer.scene.postProcessStages.add(blur);
const bw = Cesium.PostProcessStageLibrary.createBlackAndWhiteStage();
viewer.scene.postProcessStages.add(bw);
const nightVision =
Cesium.PostProcessStageLibrary.createNightVisionStage();
viewer.scene.postProcessStages.add(nightVision);
viewer.scene.postProcessStages.remove(nightVision);
По умолчанию Cesium постоянно перерисовывает сцену.
Для экономии ресурсов можно перейти к режиму рендеринга по требованию.
viewer.scene.requestRenderMode = true;
Дополнительно:
viewer.scene.maximumRenderTimeChange = Infinity;
Теперь новый кадр создаётся только при изменении сцены.
viewer.scene.requestRender();
Полезно после изменения данных:
entity.position = newPosition;
viewer.scene.requestRender();
Cesium предоставляет события жизненного цикла рендеринга.
viewer.scene.preRender.addEventListener(
function(scene, time) {
console.log("Перед рендерингом");
}
);
Вызывается непосредственно перед построением кадра.
viewer.scene.postRender.addEventListener(
function(scene, time) {
console.log("После рендеринга");
}
);
Используется для:
viewer.resolutionScale = 1.5;
Увеличение значения повышает качество изображения.
Для слабых устройств:
viewer.resolutionScale = 0.75;
Проверка поддержки:
console.log(
viewer.scene.postProcessStages.fxaa.enabled
);
Включение:
viewer.scene.postProcessStages.fxaa.enabled = true;
Отключение:
viewer.scene.postProcessStages.fxaa.enabled = false;
Для анализа производительности используется встроенный монитор.
viewer.scene.debugShowFramesPerSecond = true;
На экране появятся:
Отключение:
viewer.scene.debugShowFramesPerSecond = false;
Cesium содержит набор диагностических инструментов.
viewer.scene.globe.showTileCoordinates = true;
Используется при анализе загрузки тайлов.
Для terrain:
viewer.scene.globe._surface.tileProvider.wireframe = true;
Режим позволяет увидеть структуру сетки рельефа.
viewer.scene.debugShowCommands = true;
Каждая команда будет отображаться отдельным цветом.
viewer.scene.debugShowFrustums = true;
Полезно при анализе работы камеры.
Буфер глубины используется для корректного перекрытия объектов.
viewer.scene.globe.depthTestAgainstTerrain = true;
После включения объекты скрываются за горами и возвышенностями.
Пример:
viewer.scene.globe.depthTestAgainstTerrain = false;
В этом случае маркеры всегда остаются видимыми.
Сцена корректно поддерживает альфа-композицию.
Полупрозрачный примитив:
const color = Cesium.Color.RED.withAlpha(0.5);
Для сущности:
entity.polygon.material =
Cesium.Color.BLUE.withAlpha(0.3);
Порядок рендеринга прозрачных объектов автоматически рассчитывается движком.
Коллекция примитивов располагается непосредственно внутри сцены.
Получение:
const primitives = viewer.scene.primitives;
Добавление:
primitives.add(myPrimitive);
Удаление:
primitives.remove(myPrimitive);
Очистка:
primitives.removeAll();
Использование примитивов обеспечивает максимальную производительность при отображении большого количества объектов.
При завершении работы приложения необходимо корректно освобождать ресурсы WebGL.
Проверка:
if (!viewer.isDestroyed()) {
viewer.destroy();
}
После уничтожения:
Корректное управление сценой является фундаментом эффективных
приложений на CesiumJS. Через объект Scene контролируются
визуализация планеты, освещение, атмосфера, туман, рендеринг,
постобработка, производительность и взаимодействие всех графических
компонентов, что позволяет создавать как простые геоинформационные
системы, так и сложные трехмерные цифровые двойники территорий и
объектов.