Sky box и космос

SkyBox в CesiumJS представляет собой один из ключевых визуальных компонентов сцены, отвечающий за формирование окружения, которое воспринимается как далёкое пространство за пределами земной поверхности. Реализация основана на кубической карте (cube map), где каждая грань куба содержит текстуру, проецируемую на внутреннюю сторону сферы наблюдения. Такой подход создаёт иллюзию бесконечного пространства, независимо от положения камеры и масштаба сцены.

SkyBox строится на основе шести текстур:

  • positiveX / negativeX
  • positiveY / negativeY
  • positiveZ / negativeZ

Каждая текстура соответствует одной из граней куба и формирует непрерывное визуальное окружение. В момент рендеринга фрагментный шейдер вычисляет направление взгляда камеры и выбирает соответствующую текстуру по максимальной компоненте вектора направления.

Важной особенностью является то, что SkyBox всегда центрирован относительно камеры. Это исключает эффект параллакса: звёзды и фоновые объекты не смещаются при перемещении наблюдателя, создавая иллюзию бесконечно удалённой сферы.

Базовая конфигурация SkyBox в Viewer

В стандартной конфигурации Scene SkyBox создаётся автоматически через Cesium.Viewer. Однако он может быть переопределён вручную через параметр skyBox:

const viewer = new Cesium.Viewer("cesiumContainer", {
    skyBox: new Cesium.SkyBox({
        sources: {
            positiveX: "textures/sky/px.png",
            negativeX: "textures/sky/nx.png",
            positiveY: "textures/sky/py.png",
            negativeY: "textures/sky/ny.png",
            positiveZ: "textures/sky/pz.png",
            negativeZ: "textures/sky/nz.png"
        }
    })
});

Каждая текстура должна быть корректно выровнена относительно мировой системы координат. Ошибки ориентации приводят к визуальным разрывам или зеркальному отображению звёздного поля.

SkyBox в связке с освещением сцены

SkyBox не является источником освещения напрямую, однако он тесно взаимодействует с системой освещения сцены. В CesiumJS освещение земли и объектов определяется положением Солнца, а SkyBox выполняет исключительно визуальную функцию фона.

При включённой модели физически корректного освещения (PBR) SkyBox может визуально усиливать ощущение глубины пространства, но не влияет на интенсивность теней или глобальное освещение.

Роль времени суток и динамическая подмена SkyBox

Визуальное восприятие SkyBox часто связывается с параметром JulianDate, который определяет положение Солнца и Луны. В зависимости от времени суток SkyBox может динамически заменяться:

  • дневной — светлые градиенты, облака
  • сумеречный — тёплые переходные оттенки
  • ночной — звёздное небо или космос

Пример динамической смены:

function updateSkyBox(viewer, isNight) {
    viewer.scene.skyBox = isNight
        ? new Cesium.SkyBox({
            sources: {
                positiveX: "textures/space/px.png",
                negativeX: "textures/space/nx.png",
                positiveY: "textures/space/py.png",
                negativeY: "textures/space/ny.png",
                positiveZ: "textures/space/pz.png",
                negativeZ: "textures/space/nz.png"
            }
        })
        : new Cesium.SkyBox({
            sources: {
                positiveX: "textures/day/px.png",
                negativeX: "textures/day/nx.png",
                positiveY: "textures/day/py.png",
                negativeY: "textures/day/ny.png",
                positiveZ: "textures/day/pz.png",
                negativeZ: "textures/day/nz.png"
            }
        });
}

Подобная замена часто используется в симуляторах орбитального движения, где переход между освещённой и теневой частью Земли требует смены фоновой среды.

Космос как SkyBox: звёздные поля и HDR окружение

Космические сцены в CesiumJS обычно реализуются через высокодетализированные cube maps, содержащие:

  • звёздные каталоги (procedural star fields или baked textures)
  • туманности
  • градиентные переходы глубины пространства

При использовании статических текстур важно учитывать отсутствие динамического мерцания звёзд. Для повышения реализма применяются процедурные шейдеры, но SkyBox остаётся базовой оболочкой.

Пример космического SkyBox:

const spaceSkyBox = new Cesium.SkyBox({
    sources: {
        positiveX: "space/px.jpg",
        negativeX: "space/nx.jpg",
        positiveY: "space/py.jpg",
        negativeY: "space/ny.jpg",
        positiveZ: "space/pz.jpg",
        negativeZ: "space/nz.jpg"
    }
});

viewer.scene.skyBox = spaceSkyBox;

Отключение SkyBox и переход к чистому космосу

В ряде сценариев SkyBox полностью отключается, чтобы оставить только процедурный фон или чёрное пространство:

viewer.scene.skyBox = undefined;

При этом фон сцены становится зависимым от параметра backgroundColor:

viewer.scene.backgroundColor = Cesium.Color.BLACK;

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

SkyBox и SkyAtmosphere: взаимодействие слоёв окружения

SkyBox функционирует параллельно с системой атмосферного рассеяния. При включённой модели атмосферы:

  • SkyBox становится фоном за пределами атмосферы
  • SkyAtmosphere формирует голубую дымку и градиенты горизонта
  • при приближении к поверхности SkyBox визуально исчезает за счёт затенения
viewer.scene.skyAtmosphere.show = true;

Конфликт между SkyBox и атмосферой возникает при некорректной настройке прозрачности, когда обе системы визуально накладываются, создавая двойной фон.

Производительность и особенности рендеринга

SkyBox рендерится как один из первых слоёв сцены и оптимизирован под минимальную нагрузку на GPU. Основные факторы производительности:

  • разрешение cube map текстур
  • формат сжатия (ETC1, S3TC, ASTC)
  • количество смен SkyBox в runtime
  • использование mipmaps

Высокое разрешение (4K и выше на грань) существенно увеличивает потребление памяти видеокарты, поскольку фактически загружается шесть текстур одновременно.

Оптимизация достигается через:

  • использование компрессии текстур
  • повторное использование SkyBox без пересоздания объекта
  • кэширование материалов

Процедурные альтернативы SkyBox

Хотя SkyBox традиционно опирается на статические текстуры, в CesiumJS возможно использование процедурных подходов через кастомные шейдеры. В таких случаях SkyBox заменяется динамически генерируемым фоном:

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

Однако даже при наличии процедурного слоя SkyBox часто сохраняется как fallback-решение для совместимости и производительности.

Влияние камеры и ограничения модели

SkyBox не подчиняется трансформации сцены, связанной с ModelMatrix или координатными преобразованиями. Его поведение строго связано с камерой:

  • вращение камеры изменяет видимую часть куба
  • перемещение камеры не влияет на позицию SkyBox
  • масштабирование не применяется

Это фиксирует SkyBox как бесконечно удалённую оболочку, независимую от сцены Земли или объектов в ней.

Такой подход обеспечивает стабильность восприятия космического окружения при любых орбитальных или наземных режимах навигации.