Управление камерой в 3D

Камера в Mapbox GL JS представляет собой абстракцию виртуального наблюдателя, определяющего, какая часть геопространственной сцены отображается и под каким углом она воспринимается. В 3D-режиме камера управляет не только положением центра карты, но и перспективой, наклоном, вращением и масштабированием сцены, формируя полноценную модель навигации в пространстве.


Камера в Mapbox GL JS опирается на Web Mercator-проекцию и описывается набором параметров, задающих положение наблюдателя относительно карты:

  • center — географические координаты центра
  • zoom — уровень приближения
  • bearing — поворот вокруг вертикальной оси
  • pitch — наклон камеры относительно поверхности

Эти параметры формируют матрицу преобразования, которая интерпретируется WebGL-рендерером для построения сцены.


Центр и масштаб как базовые координаты наблюдения

Параметр center задаёт точку, находящуюся в фокусе камеры. Он определяет смещение сцены относительно экрана, выраженное в долготе и широте.

map.setCenter([69.2401, 41.2995]);

Параметр zoom управляет логарифмическим масштабированием сцены. Изменение zoom эквивалентно приближению или удалению камеры от поверхности Земли.

map.setZoom(12);

Масштабирование в Mapbox GL JS нелинейно: каждый следующий уровень увеличивает детализацию примерно в два раза, что соответствует тайловой структуре данных.


Азимут и вращение сцены

Параметр bearing задаёт вращение карты вокруг оси Z. Значение измеряется в градусах по часовой стрелке относительно севера.

map.setBearing(45);

В 3D-сцене вращение влияет на ориентацию всех объектов, включая здания, рельеф и слои данных. При значениях, отличных от нуля, север перестаёт быть фиксированным верхним направлением, что усиливает пространственное восприятие сцены.


Наклон камеры и перспектива

Параметр pitch отвечает за угол наклона камеры относительно плоскости карты. В 2D-режиме значение равно 0, в 3D-сцене может достигать значений до 60–85 градусов.

map.setPitch(60);

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


Единая модель CameraOptions

Большинство операций с камерой выполняется через объект CameraOptions, который позволяет задавать сразу несколько параметров:

map.jumpTo({
  center: [69.2401, 41.2995],
  zoom: 13,
  bearing: 30,
  pitch: 45
});

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


Методы управления состоянием камеры

jumpTo

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

map.jumpTo({
  center: [69.0, 41.0],
  zoom: 10
});

easeTo

Плавный переход между состояниями с интерполяцией параметров.

map.easeTo({
  center: [69.2401, 41.2995],
  zoom: 14,
  duration: 2000
});

Алгоритм интерполяции обеспечивает сглаживание траектории движения камеры, включая нелинейные изменения масштаба.

flyTo

Анимация с траекторией, имитирующей полёт над поверхностью. Используется сферическая интерполяция и сглаживание ускорения.

map.flyTo({
  center: [69.2401, 41.2995],
  zoom: 15,
  speed: 1.2,
  curve: 1.8
});

Параметр curve влияет на высоту дуги полёта, а speed регулирует динамику перемещения.


Камера в 3D-сцене и рельеф

Для активации трёхмерного рельефа используется источник DEM-данных и настройка terrain:

map.addSource('terrain', {
  type: 'raster-dem',
  url: 'mapbox://mapbox.terrain-rgb',
  tileSize: 512,
  maxzoom: 14
});

map.setTerrain({
  source: 'terrain',
  exaggeration: 1.5
});

После активации рельефа камера начинает учитывать высотные данные, формируя полноценную 3D-поверхность.

Pitch в этом режиме становится ключевым параметром восприятия: при увеличении угла наклона усиливается эффект глубины, а геометрия поверхности приобретает выраженную вертикальную составляющую.


Перспектива и матрицы преобразования

Камера в Mapbox GL JS использует матрицы вида и проекции. Математически состояние камеры можно представить как композицию:

  • матрицы вращения (bearing)
  • матрицы наклона (pitch)
  • матрицы масштаба (zoom)
  • трансформации центра (center)

В 3D-режиме применяется перспективная матрица, которая трансформирует координаты из географического пространства в экранное с учётом глубины.


Управление инерцией и ограничениями

Камера поддерживает параметры ограничения движения:

map.setMinZoom(5);
map.setMaxZoom(18);

map.setMinPitch(0);
map.setMaxPitch(70);

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


Синхронизация состояния камеры

Состояние камеры может отслеживаться через событие move, которое вызывается при любом изменении параметров:

map.on('move', () => {
  const center = map.getCenter();
  const zoom = map.getZoom();
  const bearing = map.getBearing();
  const pitch = map.getPitch();
});

Эта модель позволяет строить внешние контроллеры интерфейса, синхронизированные с текущим положением камеры.


Интерактивное управление и жесты

В 3D-режиме камера управляется жестами:

  • drag — изменение центра
  • scroll — изменение zoom
  • right-drag — изменение bearing
  • vertical drag (с модификатором) — изменение pitch

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


Камера и анимационные кривые

Анимации камеры используют кривые Безье и экспоненциальные функции сглаживания. Это обеспечивает естественное ускорение и замедление движения.

В flyTo применяются нелинейные функции интерполяции, которые предотвращают резкие скачки перспективы при изменении высоты и масштаба.


Композиция 3D-сцен и многослойная перспектива

В 3D-режиме камера взаимодействует с несколькими типами слоёв:

  • fill-extrusion (экструзия зданий)
  • raster-dem (рельеф)
  • sky layer (небо и атмосфера)
  • symbol layers (аннотации)

Каждый слой реагирует на изменение pitch и bearing, создавая эффект параллакса.


Привязка камеры к данным

Камера может быть связана с географическими объектами через вычисление bounding box:

map.fitBounds([
  [68.9, 41.2],
  [69.5, 41.4]
]);

Этот метод автоматически рассчитывает оптимальные параметры center и zoom, обеспечивая полное отображение области.


Производственные аспекты рендеринга

Изменение камеры инициирует перерасчёт сцены на уровне GPU. При каждом движении выполняются следующие операции:

  • пересчёт матриц трансформации
  • обновление видимых тайлов
  • перерасчёт глубины (depth buffer)
  • перерисовка слоёв

Оптимизация достигается за счёт частичной перерисовки и кеширования тайловых данных.


Камера как центральный элемент архитектуры сцены

Камера в Mapbox GL JS выступает связующим звеном между геоданными, визуализацией и пользовательской интеракцией. Её параметры определяют не только положение наблюдателя, но и характер восприятия пространственной информации, включая глубину, масштаб и динамику сцены.