OrbitView реализует орбитальную камеру, в которой сцена рассматривается как объект в центре координат, а камера движется по сферической траектории вокруг него. Такой подход характерен для 3D-визуализаций, где важна стабильная ориентация объекта и управляемый обзор без изменения внутренней логики сцены.
Ключевая особенность OrbitView — фиксированная точка наблюдения (target), вокруг которой вращается камера. В отличие от свободной 3D-навигации, здесь отсутствует произвольное перемещение камеры в пространстве: движение ограничено вращением, масштабированием и смещением цели.
Основные компоненты модели:
OrbitView подключается как один из типов view в системе Deck.gl и
используется через класс OrbitView.
import {Deck} from '@deck.gl/core';
import {OrbitView} from '@deck.gl/core';
const deckgl = new Deck({
views: new OrbitView({
id: 'orbit-view'
}),
initialViewState: {
target: [0, 0, 0],
rotationX: 30,
rotationOrbit: 45,
zoom: 1
},
controller: true
});
Ключевые параметры initialViewState:
target — центр сценыrotationX — наклон камеры по вертикалиrotationOrbit — вращение вокруг вертикальной осиzoom — масштаб сценыOrbitView использует сферические координаты для преобразования положения камеры:
Перевод в декартовы координаты выполняется через тригонометрические преобразования:
Эта модель обеспечивает:
target: [x, y, z]
Определяет точку, вокруг которой происходит орбитальное вращение.
Особенности:
Вертикальный угол камеры.
Горизонтальное вращение вокруг сцены.
Масштабирование сцены.
Важно: в OrbitView zoom часто нелинейный (логарифмическая шкала), что обеспечивает более естественное восприятие глубины.
OrbitView интегрируется с controller системы Deck.gl, который обрабатывает пользовательский ввод:
controller: true
Типичные взаимодействия:
События преобразуются в изменения viewState, что делает
OrbitView реактивным компонентом.
OrbitView может управляться полностью через состояние:
deckgl.setProps({
viewState: {
'orbit-view': {
target: [10, 20, 0],
rotationX: 45,
rotationOrbit: 90,
zoom: 2
}
}
});
Это позволяет:
OrbitView часто используется в сочетании с интерполяцией состояния камеры.
Пример линейного перехода:
function lerp(a, b, t) {
return a + (b - a) * t;
}
const start = {rotationX: 10, rotationOrbit: 0, zoom: 1};
const end = {rotationX: 60, rotationOrbit: 180, zoom: 2};
const t = 0.5;
const viewState = {
rotationX: lerp(start.rotationX, end.rotationX, t),
rotationOrbit: lerp(start.rotationOrbit, end.rotationOrbit, t),
zoom: lerp(start.zoom, end.zoom, t)
};
Используется для:
OrbitView не предназначен для свободной навигации в пространстве.
Ограничения:
Эти ограничения делают OrbitView особенно подходящим для:
OrbitView является частью системы многовидовой архитектуры Deck.gl.
Сравнение:
OrbitView часто используется как базовый инструмент для 3D-слоёв, когда географическая привязка не требуется.
OrbitView совместим со всеми 3D-слоями Deck.gl:
import {ScatterplotLayer} from '@deck.gl/layers';
const layer = new ScatterplotLayer({
id: 'points',
data: points,
getPosition: d => d.position,
getRadius: 10,
getFillColor: [255, 0, 0]
});
Особенности:
OrbitView использует перспективную камеру, где объекты уменьшаются с расстоянием.
Ключевые параметры:
При слишком маленьком near или слишком большом far могут возникать:
При использовании OrbitView в сложных сценах важны следующие аспекты:
1. Ограничение количества перерисовок
2. Кэширование геометрии
3. Использование instanced rendering
4. Контроль precision
Если target не задан или равен нулевому вектору без смысла сцены:
rotationX и rotationOrbit часто используются неправильно:
Ошибки приводят к «перевёрнутым» сценам.
Избыточный zoom вызывает:
import {Deck, OrbitView} from '@deck.gl/core';
import {CubeLayer} from '@deck.gl/mesh-layers';
const deckgl = new Deck({
views: new OrbitView(),
initialViewState: {
target: [0, 0, 0],
rotationX: 35,
rotationOrbit: 45,
zoom: 1.5
},
controller: true,
layers: [
new CubeLayer({
data: [[0, 0, 0]],
getPosition: d => d,
getColor: [0, 128, 255]
})
]
});
Deck.gl позволяет использовать несколько view одновременно:
views: [
new OrbitView({id: 'main'}),
new OrbitView({id: 'secondary', x: 0, y: 0, width: '30%', height: '30%'})
]
Такой подход применяется в:
OrbitView не изменяет шейдерную логику напрямую, но влияет на:
Все расчёты освещения и глубины зависят от положения камеры, заданного OrbitView, что делает его ключевым элементом 3D-пайплайна визуализации.