В CesiumJS освещение сцены опирается на физически обоснованную модель положения Солнца относительно Земли. Это означает, что свет, тени, цвет неба и общая визуальная атмосфера напрямую зависят от текущего времени и географических координат камеры. Центральной идеей является связка времени (JulianDate) и астрономического положения Солнца, вычисляемого на лету.
CesiumJS не использует стандартный объект Date как
основной источник времени. Вместо этого применяется высокоточная
система:
Ключевой объект управления временем — Clock:
const viewer = new Cesium.Viewer("cesiumContainer");
viewer.clock.currentTime = Cesium.JulianDate.now();
viewer.clock.multiplier = 60; // ускорение времени (1 секунда = 1 минута)
viewer.clock.shouldAnimate = true;
Параметры Clock:
currentTime — текущее время сценыmultiplier — коэффициент ускорения времениshouldAnimate — включение/выключение анимации
времениstartTime, stopTime — границы временного
интервалаСолнце в CesiumJS не является статическим источником света. Его
положение вычисляется алгоритмически на основе текущего
JulianDate.
Основной механизм:
Внутренне Cesium использует астрономические модели, приближённые к реальным эфемеридам.
Чтобы солнечный свет влиял на визуализацию объектов, необходимо активировать освещение сцены:
const viewer = new Cesium.Viewer("cesiumContainer", {
shouldAnimate: true
});
viewer.scene.globe.enableLighting = true;
При включённом enableLighting:
CesiumJS использует направленный источник света, имитирующий Солнце как бесконечно удалённый источник. Его направление вычисляется автоматически, но может быть извлечено через:
const sunDirection = Cesium.Simon97.SunDirection || Cesium.SunDirection; // концептуально
Практически чаще используется:
const sunPosition = Cesium.Simon97.SunPosition?.compute || Cesium.SunPosition;
Однако в стандартной работе разработчик не управляет этим напрямую —
направление синхронизировано с Clock.
Солнечное положение напрямую влияет на визуальную атмосферу через
SkyAtmosphere.
viewer.scene.skyAtmosphere.show = true;
Эффекты:
Манипуляция временем позволяет моделировать сутки, месяцы и годы в ускоренном режиме.
const start = Cesium.JulianDate.fromDate(new Date(2026, 5, 9, 6));
const stop = Cesium.JulianDate.addHours(start, 24, new Cesium.JulianDate());
viewer.clock.startTime = start;
viewer.clock.stopTime = stop;
viewer.clock.currentTime = start;
viewer.clock.multiplier = 300; // ускорение в 300 раз
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
Основные режимы clockRange:
UNBOUNDED — бесконечное движение времениCLAMPED — остановка на границахLOOP_STOP — зацикливание интервалаСолнечное положение управляет не только освещением, но и тенями:
viewer.shadows = true;
viewer.terrainShadows = Cesium.ShadowMode.ENABLED;
Особенности:
В некоторых режимах камера может использоваться вместе с солнечным направлением для усиления визуального восприятия:
viewer.scene.light = new Cesium.SunLight();
Это позволяет:
Положение Солнца в CesiumJS зависит не только от времени, но и от координат:
Эта зависимость проявляется особенно сильно при использовании глобального масштаба сцены.
Изменение времени напрямую влияет на освещение сцены:
function setTime(hoursFromStart) {
const newTime = Cesium.JulianDate.addHours(
viewer.clock.startTime,
hoursFromStart,
new Cesium.JulianDate()
);
viewer.clock.currentTime = newTime;
}
Это используется для:
При активной симуляции солнечного освещения важно учитывать нагрузку:
Практика оптимизации:
CesiumJS допускает сочетание солнечного света с локальными источниками:
При этом солнечный свет остаётся базовым глобальным источником, определяющим дневной цикл сцены.
Система освещения в CesiumJS строится вокруг нескольких принципов:
Эта модель позволяет синхронизировать: