Controller-классы в Deck.gl отвечают за преобразование
пользовательских действий (мышь, клавиатура, жесты) в изменения
viewState. Они формируют слой взаимодействия между
низкоуровневыми событиями браузера и системой камер, используемой
библиотекой визуализации.
Основная задача Controller — управление состоянием камеры без прямого вмешательства в рендеринг слоёв. Каждый Controller инкапсулирует набор правил интерпретации ввода и обновления параметров вида.
Ключевые обязанности:
viewStateDeckВсе контроллеры наследуются от абстрактного базового класса
Controller. Он определяет единый контракт взаимодействия с
системой камер.
Типовая структура:
onViewStateChangeonStateChangehandleEventgetViewportPropsupdateViewportController не хранит визуальных данных; он работает только с состоянием взаимодействия.
Основные параметры конфигурации:
dragPan — разрешение перемещения сценыdragRotate — вращение сценыscrollZoom — масштабирование колесом мышиdoubleClickZoom — зум по двойному кликуtouchRotate — поддержка вращения жестамиkeyboard — управление с клавиатурыController получает события в унифицированной форме и преобразует их в изменения параметров камеры:
longitude, latitudezoompitchbearingСобытия проходят через внутренний pipeline:
viewStateОсобое значение имеет накопление дельт (delta) при
drag-событиях, что позволяет реализовать плавное перемещение без
рывков.
MapController используется для 2D-картографических сцен
и имитирует поведение классических веб-карт.
Основные особенности:
Типичная конфигурация:
const controller = {
dragPan: true,
scrollZoom: true,
dragRotate: true,
minZoom: 0,
maxZoom: 20,
minPitch: 0,
maxPitch: 60
};
MapController активно использует проекцию Web Mercator и учитывает нелинейность масштабирования при высоких zoom-уровнях.
OrbitController предназначен для вращения вокруг фиксированной точки в 3D-пространстве.
Основные параметры:
target — центр вращенияrotationOrbit — вращение вокруг вертикальной осиrotationX — наклон камерыzoom — приближение к объектуМодель поведения:
OrbitController часто применяется в инженерной визуализации, 3D-моделировании и анализе данных с фиксированной точкой интереса.
Особенность реализации — отделение трансформации орбиты от мировых координат, что позволяет сохранять стабильный центр вращения даже при изменении масштаба.
FirstPersonController моделирует поведение камеры от первого лица, аналогично 3D-играм.
Основные характеристики:
Ключевые параметры:
moveSpeedlookSpeedinvertYmaxPitchАлгоритм обновления состояния:
Каждый Controller поддерживает interactionState,
фиксирующий текущие активные жесты:
isDraggingisZoomingisRotatingЭта модель позволяет отделить мгновенные события от длительных жестов, таких как drag или pinch.
InteractionState обеспечивает:
Controller-классы используют унифицированную модель жестов:
При мультисенсорном вводе вычисляется:
Это позволяет реализовать непрерывное управление камерой без скачков.
Для предотвращения некорректных состояний применяются ограничения:
minZoom, maxZoom)minPitch,
maxPitch)Clamp выполняется после каждого обновления viewState,
что гарантирует стабильность состояния камеры.
Controller не работает изолированно; он интегрирован в жизненный цикл Deck.gl через props:
controller: true | objectviewStateonViewStateChangeСхема взаимодействия:
viewStateВажно, что Controller не вызывает рендер напрямую — только инициирует обновление состояния.
Controller можно расширять через наследование базового класса:
handleEventcalculateNewViewStateПример расширения:
import {MapController} from '@deck.gl/core';
class CustomController extends MapController {
handleEvent(event) {
if (event.type === 'wheel') {
event.scale *= 0.5;
}
return super.handleEvent(event);
}
}
Такая модель позволяет внедрять доменную логику взаимодействия без изменения ядра библиотеки.
При одновременной активности нескольких жестов Controller применяет систему приоритетов:
Это предотвращает неоднозначность интерпретации ввода, особенно на touch-устройствах.
Controller оптимизирован для высокочастотных событий:
viewStateЭти механизмы позволяют поддерживать стабильную частоту обновления даже при сложных 3D-сценах.
Controller тесно связан с системой View-проекций (например,
MapView, OrbitView). Каждый View определяет,
как viewState интерпретируется в камеру.
Controller формирует абстрактное состояние, а View отвечает за его геометрическое представление.
Такая декомпозиция обеспечивает: