Контроллеры навигации в Deck.gl отвечают за преобразование пользовательских действий (мышь, клавиатура, тач-устройства) в изменения состояния камеры. Это слой логики, который связывает визуализацию данных с интерактивным управлением сценой: панорамированием, вращением, масштабированием и изменением перспективы.
В основе Deck.gl лежит модель viewState — объект,
описывающий положение и ориентацию камеры. Контроллер не изменяет сцену
напрямую, а лишь модифицирует viewState, который затем
используется слоями и представлениями (View) для пересчёта
проекции.
Ключевая идея:
viewState;Такое разделение делает систему предсказуемой и легко расширяемой.
viewState — центральная точка управления навигацией. Его
структура зависит от типа представления, но чаще всего включает:
longitude,
latitude)zoom)pitch)bearing)Для 3D-вью может добавляться:
altitudeИзменение любого поля приводит к перерасчёту матрицы проекции.
Контроллер активируется через свойство controller в
компоненте DeckGL:
<DeckGL
initialViewState={{
longitude: 37.6173,
latitude: 55.7558,
zoom: 10,
pitch: 0,
bearing: 0
}}
controller={true}
/>
Булевое значение включает стандартный набор взаимодействий. Однако чаще используется объектная конфигурация, позволяющая тонко управлять поведением.
controller={{
dragPan: true,
scrollZoom: true,
doubleClickZoom: false,
touchRotate: true,
keyboard: true
}}
Каждый флаг управляет отдельным типом взаимодействия.
Deck.gl предоставляет несколько специализированных контроллеров, каждый из которых ориентирован на определённый тип сцены.
Используется для 2D-картографических представлений. Поддерживает:
Основная задача — имитация поведения классических картографических библиотек.
Особенности:
Предназначен для 3D-сцен с орбитальным вращением камеры вокруг центра.
Поддерживает:
Типичное применение — визуализация 3D-объектов, архитектурных моделей и геометрических сцен.
Поведение камеры:
bearing и
pitch.Используется для навигации в стиле «от первого лица».
Особенности:
Этот контроллер полезен для симуляций и 3D-исследований пространства.
Контроллеры позволяют ограничивать диапазоны движения камеры, что критично для географических карт и закрытых сцен.
Пример ограничений:
controller={{
minZoom: 3,
maxZoom: 15,
minPitch: 0,
maxPitch: 60
}}
Такие параметры предотвращают:
Для географических приложений также используются границы:
maxBounds (ограничение области карты)Навигация в Deck.gl может включать кинетическое поведение — продолжение движения после отпускания мыши.
Ключевые параметры:
inertia — коэффициент затуханияdragRotate — чувствительность вращенияscrollZoomSpeed — скорость масштабированияИнерция создаёт ощущение физического движения камеры, приближая взаимодействие к естественному.
Контроллеры генерируют события, которые могут быть перехвачены:
onViewStateChangeonInteractionStateChangeonHoveronClickОсновное событие:
onViewStateChange: ({viewState}) => {
setViewState(viewState);
}
Этот механизм делает viewState управляемым извне, что
позволяет синхронизировать его с состоянием приложения (React, Redux и
др.).
Внутри Deck.gl контроллер работает как конечный автомат состояний:
Каждое состояние определяет:
viewState.Такой подход позволяет избежать конфликтов между жестами (например, одновременного pan и rotate).
Контроллер можно переопределить или расширить, создавая собственные
классы на базе базового Controller.
Типичная схема:
MapController или
Controller;viewState.Пример логики обработки:
handlePanStarthandlePanMovehandlePanEndhandleZoomЭто позволяет реализовывать нестандартные типы навигации: от стратегических карт до научных визуализаций.
На сенсорных устройствах контроллеры используют жесты:
Каждый жест преобразуется в изменение параметров камеры.
Особенности обработки:
Контроллеры не существуют отдельно — они привязаны к
View.
Разные View могут использовать разные контроллеры:
MapView → MapControllerOrbitView → OrbitControllerFirstPersonView → FirstPersonControllerЭто позволяет одной сцене поддерживать несколько режимов навигации.
Пример переключения:
При смене View меняется и логика интерпретации
viewState.
Контроллеры могут взаимодействовать с системой переходов
(transitions), когда изменения viewState
происходят плавно.
Например:
Контроллер инициирует изменение состояния, а система анимации интерполирует значения:
В системе Deck.gl важно разделение источников управления:
setProps)При конфликте приоритет обычно у:
viewState.Это предотвращает «дёргание» камеры при одновременных обновлениях.
Контроллеры оптимизированы под высокую частоту событий:
viewState обновлений;Ключевая цель — удержание стабильного FPS при интенсивной навигации.
В реальных приложениях viewState часто хранится вне
DeckGL:
Это позволяет:
Контроллер при этом становится лишь источником событий, а не владельцем состояния.
Если controller=false, Deck.gl:
Это используется для: