Sky-слой (sky) предназначен для отображения неба в
трёхмерной сцене. Он используется совместно с наклонённой камерой и
3D-объектами, создавая реалистичный фон за пределами карты. В отличие от
обычных слоёв, которые рисуются на поверхности карты, слой неба
визуализируется вокруг всей сцены и формирует окружение, воспринимаемое
как атмосфера.
Sky-слой особенно важен при работе с:
Без такого слоя при сильном наклоне карты пользователь будет видеть пустой фон, что существенно ухудшает восприятие трёхмерного пространства.
Sky-слой добавляется через метод addLayer() аналогично
другим слоям.
Простейший пример:
map.addLayer({
id: 'sky',
type: 'sky'
});
После добавления MapLibre автоматически создаёт небесную сферу вокруг сцены.
Чаще всего слой добавляется после полной загрузки стиля:
map.on('load', () => {
map.addLayer({
id: 'sky',
type: 'sky'
});
});
Sky-слой не является обычным прямоугольным изображением.
Внутри движка создаётся специальная геометрия, окружающая камеру со всех сторон. При изменении угла обзора происходит пересчёт направления взгляда, а неба визуализируется соответствующая часть этой сферы.
Такой подход обеспечивает:
Для настройки используются специальные свойства через блок
paint.
Структура:
map.addLayer({
id: 'sky',
type: 'sky',
paint: {
// настройки
}
});
Наиболее важные параметры:
| Свойство | Назначение |
|---|---|
sky-type |
Тип визуализации неба |
sky-atmosphere-color |
Цвет атмосферы |
sky-atmosphere-halo-color |
Цвет ореола вокруг солнца |
sky-atmosphere-sun |
Положение солнца |
sky-atmosphere-sun-intensity |
Интенсивность освещения |
sky-gradient |
Цветовой градиент |
sky-gradient-center |
Центр градиента |
sky-gradient-radius |
Радиус градиента |
sky-opacity |
Прозрачность |
Свойство sky-type определяет алгоритм отрисовки.
Поддерживаются два режима:
paint: {
'sky-type': 'gradient'
}
или
paint: {
'sky-type': 'atmosphere'
}
Использует обычный цветовой градиент.
Преимущества:
Недостатки:
Использует модель атмосферного рассеивания света.
Пример:
paint: {
'sky-type': 'atmosphere'
}
Особенности:
Для современных 3D-карт обычно используется именно этот режим.
Основной цвет атмосферы задаётся через свойство:
paint: {
'sky-type': 'atmosphere',
'sky-atmosphere-color': '#87CEEB'
}
Пример полного слоя:
map.addLayer({
id: 'sky',
type: 'sky',
paint: {
'sky-type': 'atmosphere',
'sky-atmosphere-color': '#87CEEB'
}
});
Значение может задаваться:
'#87CEEB'
или
'rgb(135,206,235)'
или
'rgba(135,206,235,1)'
Для создания свечения используется параметр:
'sky-atmosphere-halo-color'
Пример:
paint: {
'sky-type': 'atmosphere',
'sky-atmosphere-halo-color': '#FFFFFF'
}
Увеличение яркости ореола помогает визуально выделить направление солнечного света.
Солнце задаётся через массив из двух чисел:
'sky-atmosphere-sun': [azimuth, polar]
где:
azimuth — направление по горизонту;polar — высота солнца.Пример:
paint: {
'sky-type': 'atmosphere',
'sky-atmosphere-sun': [0, 0]
}
Другой пример:
paint: {
'sky-type': 'atmosphere',
'sky-atmosphere-sun': [180, 45]
}
Значения интерпретируются в градусах.
Яркость атмосферного освещения регулируется параметром:
'sky-atmosphere-sun-intensity'
Пример:
paint: {
'sky-type': 'atmosphere',
'sky-atmosphere-sun-intensity': 15
}
Меньшие значения создают мягкое освещение:
'sky-atmosphere-sun-intensity': 3
Большие значения делают атмосферу более контрастной:
'sky-atmosphere-sun-intensity': 30
Для режима gradient используется свойство:
'sky-gradient'
Пример:
paint: {
'sky-type': 'gradient',
'sky-gradient': [
'interpolate',
['linear'],
['sky-radial-progress'],
0,
'#87CEEB',
1,
'#1E3A5F'
]
}
Здесь применяется выражение MapLibre Style Specification.
Переменная:
['sky-radial-progress']
возвращает относительное положение пикселя внутри небесной сферы.
Направление градиента можно изменить.
Пример:
paint: {
'sky-type': 'gradient',
'sky-gradient-center': [0, 0]
}
Изменение центра позволяет имитировать:
Свойство:
'sky-gradient-radius'
контролирует область распространения цвета.
Пример:
paint: {
'sky-type': 'gradient',
'sky-gradient-radius': 90
}
Малый радиус:
'sky-gradient-radius': 30
создаёт концентрированное свечение.
Большой радиус:
'sky-gradient-radius': 180
даёт плавный переход по всему небосводу.
Для управления видимостью используется свойство:
'sky-opacity'
Пример:
paint: {
'sky-opacity': 0.7
}
Полностью непрозрачное небо:
'sky-opacity': 1
Полностью скрытое:
'sky-opacity': 0
Свойства можно менять после создания слоя.
Изменение цвета:
map.setPaintProperty(
'sky',
'sky-atmosphere-color',
'#FFB347'
);
Изменение интенсивности солнца:
map.setPaintProperty(
'sky',
'sky-atmosphere-sun-intensity',
20
);
Изменение прозрачности:
map.setPaintProperty(
'sky',
'sky-opacity',
0.5
);
Sky-слой позволяет создавать смену времени суток без замены стиля карты.
paint: {
'sky-type': 'atmosphere',
'sky-atmosphere-color': '#FFDAB9',
'sky-atmosphere-sun': [90, 15],
'sky-atmosphere-sun-intensity': 5
}
Особенности:
paint: {
'sky-type': 'atmosphere',
'sky-atmosphere-color': '#87CEEB',
'sky-atmosphere-sun': [180, 80],
'sky-atmosphere-sun-intensity': 20
}
Особенности:
paint: {
'sky-type': 'atmosphere',
'sky-atmosphere-color': '#FF8C69',
'sky-atmosphere-sun': [270, 10],
'sky-atmosphere-sun-intensity': 7
}
Особенности:
paint: {
'sky-type': 'gradient',
'sky-gradient': [
'interpolate',
['linear'],
['sky-radial-progress'],
0,
'#0A0A23',
1,
'#000000'
]
}
Особенности:
Наиболее эффектно Sky-слой выглядит при наличии экструдированных зданий.
Пример:
map.addLayer({
id: 'buildings',
source: 'composite',
'source-layer': 'building',
type: 'fill-extrusion',
paint: {
'fill-extrusion-height': ['get', 'height'],
'fill-extrusion-color': '#cccccc'
}
});
Затем добавляется небо:
map.addLayer({
id: 'sky',
type: 'sky',
paint: {
'sky-type': 'atmosphere'
}
});
После наклона камеры:
map.easeTo({
pitch: 70
});
город начинает восприниматься как полноценная трёхмерная сцена.
Sky-слой особенно полезен при работе с Terrain.
Пример:
map.setTerrain({
source: 'dem-source',
exaggeration: 1.5
});
При отображении горных ландшафтов атмосферное небо значительно улучшает восприятие глубины пространства.
Особенно заметен эффект при:
Положение солнца может изменяться в реальном времени.
Пример:
let angle = 0;
function animateSun() {
angle += 0.5;
map.setPaintProperty(
'sky',
'sky-atmosphere-sun',
[angle, 30]
);
requestAnimationFrame(animateSun);
}
animateSun();
Такая техника используется для:
Sky-слой не предназначен для отображения:
Для подобных задач обычно используются:
Sky-слой относится к числу наиболее лёгких графических элементов MapLibre GL JS.
Причины высокой производительности:
Даже на сложных трёхмерных сценах влияние Sky-слоя на производительность обычно минимально по сравнению с рендерингом зданий, рельефа или пользовательских WebGL-объектов.
map.on('load', () => {
map.addLayer({
id: 'sky',
type: 'sky',
paint: {
'sky-type': 'atmosphere',
'sky-atmosphere-color': '#87CEEB',
'sky-atmosphere-halo-color': '#FFFFFF',
'sky-atmosphere-sun': [180, 45],
'sky-atmosphere-sun-intensity': 15,
'sky-opacity': 1
}
});
});
Такой набор параметров создаёт универсальное дневное небо, хорошо сочетающееся с трёхмерными зданиями, рельефом и сценами с высоким углом наклона камеры.