deck.gl предоставляет несколько моделей представления сцены, среди которых ортографическая проекция используется для отображения данных без перспективного искажения. В отличие от перспективной камеры, где удалённые объекты визуально уменьшаются, ортографическая модель сохраняет одинаковый масштаб объектов независимо от глубины.
Ключевая особенность заключается в том, что сцена проецируется параллельными лучами. Это делает ортографическое представление особенно полезным в задачах, где важна метрическая точность и равномерное восприятие расстояний.
OrthographicView представляет собой специализированный
класс представления, предназначенный для работы с двумерными или
псевдо-трёхмерными сценами без перспективы.
Базовая структура использования:
import {Deck} from '@deck.gl/core';
import {OrthographicView} from '@deck.gl/core';
const deckgl = new Deck({
views: new OrthographicView({
id: 'ortho'
}),
initialViewState: {
target: [0, 0, 0],
zoom: 0
},
controller: true,
layers: []
});
views определяет тип камеры, а
initialViewState задаёт положение наблюдателя и
масштаб.
В ортографическом представлении координатная система остаётся линейной:
Параметр target определяет центр сцены:
initialViewState: {
target: [100, 200, 0],
zoom: 2
}
Изменение target приводит к панорамированию сцены без
искажения масштаба.
В ортографической проекции масштабирование реализуется через параметр
zoom. В отличие от перспективных камер, увеличение масштаба
не изменяет визуальную перспективу:
zoom приближает сцену равномерноzoom отдаляет сцену без изменения
пропорцийПример:
initialViewState: {
target: [0, 0, 0],
zoom: 3,
minZoom: -5,
maxZoom: 10
}
Диапазон minZoom и maxZoom ограничивает
допустимые уровни приближения, предотвращая потерю детализации или выход
за пределы сцены.
При включённом контроллере (controller: true)
взаимодействие с ортографической камерой включает:
targetПанорамирование изменяет только позицию наблюдения, не затрагивая геометрию объектов.
В архитектуре deck.gl существуют несколько типов представлений, отличающихся моделью камеры:
OrthographicView занимает промежуточное положение между двумерной визуализацией и 3D-сценой, обеспечивая точность без визуальных искажений глубины.
Ортографическая камера совместима со всеми стандартными слоями deck.gl:
ScatterplotLayerPathLayerPolygonLayerTextLayerПример интеграции:
import {ScatterplotLayer} from '@deck.gl/layers';
const layer = new ScatterplotLayer({
id: 'points',
data: [
{position: [0, 0], size: 10},
{position: [100, 50], size: 20}
],
getPosition: d => d.position,
getRadius: d => d.size,
getFillColor: [255, 0, 0]
});
В ортографическом режиме размеры и координаты интерпретируются линейно, что делает поведение слоёв предсказуемым при масштабировании.
Так как перспективное уменьшение отсутствует, порядок отрисовки становится критическим фактором. Глубина может использоваться только для сортировки слоёв, но не влияет на визуальный размер объектов.
Основные стратегии:
zIndexgetPolygonOffset (в случае
3D-слоёв)OrthographicView создаёт ортографическую матрицу
проекции, которая заменяет перспективную матрицу камеры. Это влияет
на:
Программное изменение параметров:
deckgl.setProps({
viewState: {
target: [200, 150, 0],
zoom: 1.5
}
});
Изменение viewState приводит к пересчёту матрицы
проекции и перерисовке сцены.
Внутренний pipeline deck.gl выполняет несколько этапов трансформации:
В ортографической модели этап перспективного деления отсутствует, что упрощает вычисления и снижает визуальные артефакты при работе с сетками и картами данных.
OrthographicView используется в задачах, где требуется:
Особенно эффективен при необходимости точного измерения расстояний и сохранения пропорций объектов.
deck.gl поддерживает мультивидовые сцены, где
OrthographicView может использоваться вместе с другими
камерами:
views: [
new OrthographicView({id: 'ortho'}),
new MapView({id: 'map'})
]
Каждое представление может иметь собственный viewState,
что позволяет разделять аналитические и географические слои в одном
приложении.
Отсутствие перспективных вычислений снижает нагрузку на GPU, однако основным фактором производительности остаются:
viewStateОптимизация достигается через: