Atmosphere эффекты

Роль атмосферы в визуализации 3D-мира

Атмосферные эффекты формируют визуальную связку между поверхностью планеты, небом и источниками света, создавая физически правдоподобную сцену. В CesiumJS они отвечают за моделирование рассеяния света в атмосфере, цвет неба, переходы у горизонта, мягкость дальних объектов и общее восприятие масштаба планеты.

Основные задачи атмосферного слоя:

  • имитация рассеяния света в атмосфере Земли
  • формирование реалистичного горизонта
  • управление оттенками неба в зависимости от угла солнца
  • интеграция с освещением сцены
  • визуальное объединение земли и неба без «жесткой границы»

CesiumJS использует физически вдохновлённую модель рассеяния света (Rayleigh и Mie scattering), адаптированную для real-time рендеринга в WebGL.


SkyAtmosphere — основной компонент неба

Ключевой объект атмосферного рендеринга — SkyAtmosphere. Он отвечает за визуализацию неба вокруг камеры и имитацию рассеяния солнечного света в верхних слоях атмосферы.

Инициализация осуществляется через сцену:

const viewer = new Cesium.Viewer("cesiumContainer");

viewer.scene.skyAtmosphere = new Cesium.SkyAtmosphere();

Внутренние принципы работы

SkyAtmosphere формирует небесный купол, который:

  • рассчитывает рассеяние света в зависимости от угла обзора
  • учитывает положение солнца
  • симулирует плотность атмосферы по высоте
  • создаёт градиенты от зенита к горизонту

Модель основана на упрощённой физике:

  • Rayleigh scattering — отвечает за голубой цвет неба
  • Mie scattering — отвечает за дымку, туманность и ореолы вокруг солнца

Основные параметры SkyAtmosphere

Включение и отключение

viewer.scene.skyAtmosphere.show = true;

При отключении атмосферы сцена переходит к более «космическому» виду без рассеяния света.


Контроль визуального оттенка

SkyAtmosphere позволяет управлять цветовой коррекцией:

const atmosphere = viewer.scene.skyAtmosphere;

atmosphere.brightnessShift = 0.2;
atmosphere.hueShift = -0.1;
atmosphere.saturationShift = 0.3;

Эти параметры влияют на итоговый цвет неба:

  • brightnessShift — общая яркость атмосферы
  • hueShift — смещение оттенка
  • saturationShift — насыщенность

Такая настройка часто используется для стилизации сцены (например, «марсианская» или «сумеречная» атмосфера).


Оптическая плотность и масштаб атмосферы

atmosphere.ellipsoidScale = 1.0;
atmosphere.atmosphereLightIntensity = 10.0;
  • ellipsoidScale влияет на воспринимаемую толщину атмосферы
  • atmosphereLightIntensity управляет силой светового рассеяния

Чем выше интенсивность, тем ярче проявляется ореол вокруг солнца и световой градиент у горизонта.


Взаимодействие атмосферы с солнцем и освещением

Положение солнца напрямую влияет на внешний вид неба и земли.

viewer.scene.globe.enableLighting = true;

При включённом освещении:

  • дневная сторона планеты становится ярче
  • ночная сторона затемняется
  • атмосфера усиливает переход между ними

Солнце в CesiumJS представлено через Sun в сцене, и его позиция вычисляется на основе времени:

viewer.clock.currentTime = Cesium.JulianDate.now();

Изменение времени приводит к динамическому изменению:

  • цвета неба (утро, день, закат, ночь)
  • интенсивности рассеяния
  • длины теней
  • насыщенности горизонта

Атмосфера и поверхность Земли

Ground Atmosphere

CesiumJS поддерживает визуализацию атмосферной дымки у поверхности:

viewer.scene.globe.showGroundAtmosphere = true;

Этот эффект добавляет:

  • мягкий переход между землёй и горизонтом
  • лёгкую дымку на больших расстояниях
  • визуальное уменьшение резкости дальних объектов

Он особенно заметен при низких углах обзора, когда камера близка к поверхности.


Влияние на восприятие глубины

Атмосфера усиливает глубину сцены за счёт:

  • контрастного затухания дальних объектов
  • изменения цветовой температуры вдаль
  • визуального «размывания» горизонта

Без атмосферы сцена становится более «плоской», так как отсутствует естественный воздушный градиент.


SkyBox и SkyAtmosphere

CesiumJS может использовать два подхода к визуализации неба:

  • SkyBox — кубическая текстура окружения
  • SkyAtmosphere — физически основанное рассеяние света
viewer.scene.skyBox.show = true;
viewer.scene.skyAtmosphere.show = true;

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

  • SkyBox формирует фон (звёзды, космос)
  • SkyAtmosphere перекрывает его в области атмосферы Земли

На больших высотах SkyBox становится более заметным, на малых — доминирует атмосфера.


Эффекты ореола и рассеяния света

Солнечный ореол

При взгляде в сторону солнца формируется яркое свечение — результат Mie scattering. Оно зависит от:

  • угла между камерой и солнцем
  • плотности атмосферы
  • настроек интенсивности света

Цветовые градиенты

Небо формирует непрерывный градиент:

  • зенит — насыщенный синий
  • средние углы — голубой
  • горизонт — бело-оранжевые оттенки

Этот переход вычисляется в шейдерах в реальном времени.


Техническая реализация в WebGL

CesiumJS реализует атмосферу через GPU-шейдеры. Основные этапы:

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

Упрощённая схема:

pixelColor = integrate(rayleigh + mie scattering + extinction)

Оптимизации:

  • ограничение числа шагов интеграции
  • приближение плотности атмосферы экспонентой
  • использование precomputed constants

Производительность и оптимизация

Атмосферные эффекты являются GPU-интенсивными, поэтому:

  • уменьшается количество семплов при дальних зумах
  • применяется адаптивная точность интеграции
  • отключаются лишние эффекты на слабых устройствах

Практические влияющие параметры:

  • количество пикселей на экран
  • качество теней
  • включение пост-обработки
  • активность fog и bloom эффектов

Взаимодействие с туманом (Fog)

Хотя туман формально не является частью атмосферы, он усиливает её эффект:

viewer.scene.fog.enabled = true;
viewer.scene.fog.density = 0.0002;

Туман:

  • усиливает перспективу
  • скрывает дальние объекты
  • создаёт эффект влажного воздуха

В сочетании с SkyAtmosphere создаётся более глубокая сцена.


Временная динамика атмосферы

Атмосфера в CesiumJS тесно связана с временем суток:

  • утро — мягкие розовые и оранжевые оттенки
  • день — яркое голубое небо
  • закат — насыщенные красно-оранжевые переходы
  • ночь — минимальное рассеяние, доминирование SkyBox

Изменение времени автоматически перестраивает:

  • интенсивность Rayleigh scattering
  • угол падения солнечного света
  • яркость горизонта

Типичные сценарии использования

  • визуализация глобальных карт с реалистичным небом
  • симуляция авиационных маршрутов и полётов
  • образовательные геоинформационные системы
  • демонстрации климатических и световых моделей
  • стилизованные 3D-карты с художественной атмосферой