View в deck.gl определяют способ отображения сцены, задавая правила проекции координат, тип камеры, систему координат и соответствие между состоянием представления и визуальными параметрами WebGL-контекста. Каждый View инкапсулирует логику построения viewport и преобразования данных слоя в пиксельное пространство, формируя независимый «канал рендеринга» внутри одной сцены.
View в deck.gl — это абстракция уровня камеры и проекции. Она связывает три ключевых компонента:
Каждый View отвечает за преобразование географических или мировых координат в экранные. В отличие от классического WebGL-пайплайна, где камера одна, deck.gl позволяет использовать несколько View одновременно.
Ключевой момент: один слой может рендериться в нескольких View или быть ограничен конкретным набором представлений.
ViewState описывает параметры камеры в терминах конкретного типа представления. Он не является универсальным: разные View интерпретируют его по-разному.
Типичный набор параметров:
View не хранит состояние напрямую, он лишь интерпретирует переданный viewState и преобразует его в viewport.
Viewport — вычисляемая сущность, которая создаётся на основе View и viewState. Он содержит:
Каждый кадр deck.gl пересчитывает viewport для каждого активного View, обеспечивая независимую систему координат.
MapView используется для работы с географическими данными в стиле картографических приложений. Он опирается на Web Mercator проекцию и тесно интегрирован с tile-системами.
Основные особенности:
Пример использования:
import {Deck} from '@deck.gl/core';
import {MapView} from '@deck.gl/core';
const deck = new Deck({
views: new MapView({repeat: true}),
viewState: {
longitude: 37.6173,
latitude: 55.7558,
zoom: 10,
pitch: 30,
bearing: 0
},
layers: []
});
Параметр repeat: true позволяет бесшовное повторение
карты по горизонтали, что важно для глобальных визуализаций.
OrthographicView реализует параллельную проекцию без перспективного искажения. Все линии остаются параллельными, а масштаб не зависит от глубины.
Применяется для:
Особенность заключается в том, что глубина (z) не влияет на размер объектов.
Пример:
import {OrthographicView} from '@deck.gl/core';
const view = new OrthographicView({
id: 'ortho',
controller: true
});
ViewState в этом случае обычно содержит:
FirstPersonView имитирует камеру от первого лица, аналогичную игровым движкам. Камера перемещается в пространстве без привязки к поверхности карты.
Характеристики:
Используется в:
Пример:
import {FirstPersonView} from '@deck.gl/core';
const view = new FirstPersonView({
id: 'first-person',
controller: true
});
ViewState обычно включает:
OrbitView обеспечивает вращение камеры вокруг фиксированного объекта или центра сцены. Это промежуточный вариант между ортографической и перспективной моделью.
Применяется для:
Особенности:
GlobeView отображает данные на 3D-сфере, используя географические координаты без проекции Web Mercator.
Характеристики:
ViewState:
Особенность GlobeView — необходимость учитывать геодезические расстояния вместо плоских координат.
Deck.gl поддерживает композицию нескольких View одновременно. Это позволяет строить интерфейсы с несколькими синхронизированными камерами.
Типичные сценарии:
Пример:
import {Deck} from '@deck.gl/core';
import {MapView, OrthographicView} from '@deck.gl/core';
const deck = new Deck({
views: [
new MapView({id: 'map'}),
new OrthographicView({id: 'overlay'})
],
viewState: {
map: {
longitude: 0,
latitude: 0,
zoom: 2
},
overlay: {
target: [0, 0, 0],
zoom: 1
}
},
layers: []
});
Каждый View получает свой namespace в viewState.
Слои могут быть ограничены конкретными View через параметр
viewIds. Это позволяет контролировать, где именно будет
отображаться слой.
import {ScatterplotLayer} from '@deck.gl/layers';
const layer = new ScatterplotLayer({
id: 'points',
data: [],
viewIds: ['map']
});
Если viewIds не указан, слой рендерится во всех активных
View.
Каждый View определяет собственную систему координат:
Это влияет на:
View может включать controller, который обрабатывает пользовательский ввод:
Контроллер преобразует события мыши и клавиатуры в изменения viewState.
new MapView({
controller: true
});
Контроллеры различаются по типу View и используют разные модели управления камерой.
При использовании нескольких View важно учитывать:
Оптимизации:
View можно расширять для создания специализированных проекций. Для этого переопределяются методы:
getViewportprojectunprojectПрименение:
Пример структуры:
import {View} from '@deck.gl/core';
class CustomView extends View {
getViewport({width, height, viewState}) {
return super.getViewport({
width,
height,
viewState
});
}
}
Кастомные View требуют точного понимания матричной алгебры и pipeline deck.gl.
View влияет на жизненный цикл слоя через:
Каждое изменение viewState инициирует перерасчёт всех активных viewport, что напрямую влияет на render loop.