Визуальная система освещения в Mapbox GL JS является частью описания
стиля карты и влияет на то, как рендерятся трёхмерные объекты, рельеф,
здания и любые слои, поддерживающие шейдинг. Освещение в Mapbox
реализовано на уровне сцены WebGL и управляется через объект
light, который входит в спецификацию стиля.
Ключевая особенность системы заключается в том, что освещение не является постэффектом или внешним слоем, а напрямую влияет на вычисление цвета пикселей во время рендеринга.
Объект light задаётся внутри style specification:
{
"version": 8,
"lights": {
"ambient-light": {
"type": "ambient",
"color": "#ffffff",
"intensity": 0.3
},
"directional-light": {
"type": "directional",
"color": "#ffffff",
"intensity": 0.8,
"direction": [180, 45]
}
}
}
В Mapbox GL JS чаще используется динамическое управление освещением через API:
map.setLight({
anchor: "map",
color: "white",
intensity: 0.5,
position: [1.15, 210, 30]
});
Рассеянный свет задаёт базовую освещённость сцены. Он не имеет направления и равномерно влияет на все объекты.
Характеристики:
Основное назначение — предотвращение полной темноты на неосвещённых поверхностях.
Направленный свет имитирует солнце. Все лучи считаются параллельными, а освещение зависит от ориентации поверхностей.
Параметры:
intensity — сила светаcolor — цвет источникаposition — сферические координаты источникаПример:
map.setLight({
color: "#ffffff",
intensity: 0.9,
position: [1.2, 180, 45]
});
Где:
Mapbox GL JS использует сферическую систему координат:
Это позволяет имитировать движение солнца в течение дня.
Освещение часто используется для симуляции суточного цикла.
Пример плавного изменения положения источника света:
function setTimeOfDay(hour) {
const azimuth = (hour / 24) * 360;
const elevation = hour < 12
? (hour / 12) * 60
: ((24 - hour) / 12) * 60;
map.setLight({
anchor: "map",
position: [azimuth, elevation, 1.2]
});
}
При анимации важно учитывать:
Слой fill-extrusion является основным потребителем
системы освещения.
map.addLayer({
id: "buildings",
type: "fill-extrusion",
source: "composite",
"source-layer": "building",
paint: {
"fill-extrusion-color": "#aaa",
"fill-extrusion-height": ["get", "height"],
"fill-extrusion-base": ["get", "min_height"],
"fill-extrusion-opacity": 0.9
}
});
Освещение влияет на:
Каждая грань здания вычисляет нормаль, после чего применяется скалярное произведение с направлением света.
В основе лежит классическая модель Lambert:
[ I = I_0 (0, )]
где:
В Mapbox GL JS эта модель упрощена, но принцип остаётся тем же: угол между поверхностью и светом определяет яркость.
При использовании terrain (DEM-данных) освещение становится критическим для восприятия глубины.
Рельеф может быть дополнительно усилен слоями типа hillshade:
map.addLayer({
id: "hillshade",
type: "hillshade",
source: "dem",
paint: {
"hillshade-exaggeration": 0.5,
"hillshade-shadow-color": "#000000",
"hillshade-highlight-color": "#ffffff"
}
});
В Mapbox GL JS нет полноценной физической модели теней (shadow mapping), но визуальный эффект достигается комбинацией:
Тени в городских сценах фактически являются результатом затенённых граней.
Интенсивность влияет на общую экспозицию сцены:
map.setLight({
intensity: 0.2
});
Высокие значения:
Низкие значения:
Цвет источника света используется для имитации атмосферы:
Пример:
map.setLight({
color: "#ffcc88",
intensity: 0.7
});
Слой sky усиливает восприятие освещения за счёт
окружения сцены.
map.addLayer({
id: "sky",
type: "sky",
paint: {
"sky-type": "atmosphere",
"sky-atmosphere-sun": [0.0, 0.0],
"sky-atmosphere-sun-intensity": 10
}
});
Sky слой взаимодействует с направлением света, создавая визуальную связку между небом и поверхностью карты.
Освещение в Mapbox GL JS оптимизировано для GPU:
При сложных сценах важно учитывать:
Реалистичная сцена формируется комбинацией:
Типичная конфигурация:
map.setLight({
anchor: "map",
color: "#ffffff",
intensity: 0.6,
position: [210, 45, 1.1]
});
Система освещения Mapbox GL JS имеет ряд упрощений:
Это компенсируется скоростью рендеринга и стабильностью работы в браузере.
Освещение тесно связано с визуальной темой стиля:
Изменение light может полностью менять восприятие одной и той же карты без изменения геометрии или данных.