В CesiumJS освещение глобуса основано на физически корректной модели взаимодействия солнечного света с поверхностью Земли. Основной принцип — вычисление направления света от Солнца в зависимости от текущего времени сцены и использование этого направления для затенения геометрии эллипсоида и рельефа.
Ключевой объект, отвечающий за освещение поверхности, — это глобус
сцены (Scene.globe), который интегрирован с системой
освещения движка и получает данные о положении Солнца через
астрономические расчёты Cesium.
Главный переключатель освещения глобуса:
viewer.scene.globe.enableLighting = true;
При включённом освещении:
При отключении (false) поверхность отображается
равномерно освещённой, без зависимости от времени суток.
Cesium использует JulianDate для вычисления положения
Солнца:
Свет в сцене представляется как направленный источник, движущийся относительно Земли:
const sunPosition = Cesium.Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame(time);
Этот вектор затем преобразуется в координаты сцены и используется для вычисления освещения каждого фрагмента глобуса.
Один из ключевых визуальных эффектов — терминатор (граница света и тени). Он формируется естественным образом благодаря скалярному произведению нормали поверхности и направления света:
В шейдерной логике это выражается через dot product:
float lightIntensity = max(dot(normal, lightDirection), 0.0);
Освещение глобуса влияет не только на геометрию, но и на все типы поверхностей:
Освещение тесно связано с моделью атмосферы:
viewer.scene.skyAtmosphere.show = true;
Атмосферное рассеивание усиливает реализм освещения:
SkyAtmosphere использует приближенную модель Рэлеевского и Ми-рассеяния, что влияет на цвет неба и косвенно на визуальное восприятие освещённости глобуса.
Освещение глобуса полностью зависит от времени сцены:
viewer.clock.multiplier = 10;
viewer.clock.shouldAnimate = true;
Изменение времени приводит к:
При ускоренном времени можно наблюдать суточный цикл освещения в реальном времени.
Освещение является вычислительно затратной частью рендеринга, поэтому Cesium использует несколько оптимизаций:
Включение освещения увеличивает нагрузку на GPU за счёт:
Особенно заметно влияние при:
При некорректной настройке могут возникать эффекты:
Эти эффекты регулируются балансом между:
globe.enableLightingscene.globe.undergroundColorscene.skyAtmosphere.hueShift и
saturationShiftОсвещение глобуса особенно заметно на водных поверхностях:
В связке с PBR-материалами воды отражения становятся более реалистичными и зависят от roughness и specular компонентов.
Хотя глобусное освещение не является полноценной системой теней, оно взаимодействует с:
viewer.shadows = true;
Тени объектов (например, 3D Tiles или моделей) накладываются поверх освещённого глобуса, усиливая визуальную глубину сцены.
Хотя базовый механизм фиксирован, косвенно влияние можно регулировать через:
scene.light (если переопределён)Это позволяет создавать стилизованные режимы:
Освещение глобуса не ограничивается поверхностью Земли:
Это создаёт единое световое пространство между глобусом, зданиями и объектами.
Некоторые особенности модели освещения:
Эти эффекты обусловлены геометрией эллипсоида и наклоном земной оси, используемым в астрономических расчётах Cesium.
Освещение играет важную роль в пространственном восприятии:
В результате освещение становится не просто визуальным эффектом, а инструментом географического анализа.