FirstPersonView реализует модель камеры, в которой сцена воспринимается как трёхмерное пространство от первого лица. В отличие от географических представлений карты, здесь отсутствует привязка к проекции плоскости Земли как основной абстракции — управление осуществляется через позицию наблюдателя и ориентацию в пространстве.
Ключевая особенность заключается в том, что камера ведёт себя как виртуальный «персонаж» в 3D-среде, перемещающийся по координатам X/Y/Z и изменяющий направление взгляда через углы поворота.
FirstPersonView в Deck.gl работает в связке с системой представлений
(View) и состоянием камеры (viewState).
Основные компоненты:
[x, y, z]В отличие от MapView, где используются географические координаты (longitude/latitude), здесь используется декартова система координат.
import {Deck} from '@deck.gl/core';
import {FirstPersonView} from '@deck.gl/core';
const view = new FirstPersonView({
id: 'first-person-view',
controller: true
});
const INITIAL_VIEW_STATE = {
position: [0, 0, 1.6],
bearing: 0,
pitch: 0
};
const deckgl = new Deck({
views: view,
initialViewState: INITIAL_VIEW_STATE,
controller: true,
layers: []
});
FirstPersonView опирается на классическую FPS-логику управления:
Внутренне система преобразует действия пользователя в обновления
viewState.
В FirstPersonView координатная система не привязана к географическим данным. Обычно применяется следующая интерпретация:
Это позволяет использовать View для:
Включение controller: true активирует обработку
пользовательского ввода.
const view = new FirstPersonView({
id: 'fpv',
controller: true
});
Поведение контроллера:
Контроллер работает через обновление viewState, который
синхронизируется с рендерингом Deck.gl.
Камера управляется через изменение viewState. Это
ключевой механизм реактивной архитектуры Deck.gl.
deckgl.setProps({
viewState: {
position: [10, 5, 2],
bearing: 45,
pitch: -10
}
});
Изменение состояния мгновенно влияет на рендеринг сцены без необходимости перезапуска приложения.
FirstPersonView не ограничивает типы слоёв, но их поведение зависит от системы координат.
Часто используются:
ScatterplotLayer — точки в 3D пространствеLineLayer — маршруты и траекторииSimpleMeshLayer — объёмные объектыПример слоя:
import {ScatterplotLayer} from '@deck.gl/layers';
const layer = new ScatterplotLayer({
id: 'points',
data: [
{position: [0, 0, 0]},
{position: [5, 5, 1]}
],
getPosition: d => d.position,
getRadius: 0.2,
getFillColor: [255, 0, 0]
});
FirstPersonView использует перспективную проекцию, где:
Это создаёт эффект естественного восприятия пространства, близкий к реальному зрению.
FirstPersonView часто используется совместно с WebGL-слоями и 3D-моделями:
Пример интеграции с 3D сценой:
const buildingLayer = new SimpleMeshLayer({
id: 'building',
data: buildingData,
mesh: buildingMesh,
getPosition: d => d.position,
getColor: [200, 200, 200],
sizeScale: 1
});
Ось Z в FirstPersonView играет ключевую роль:
Типичная стартовая высота:
position: [0, 0, 1.6]
Значение 1.6 часто используется как условная высота человеческого взгляда.
FirstPersonView имеет ряд характерных особенностей:
Контроль коллизий и физики реализуется на уровне приложения, а не View.
MapView
OrbitView
FirstPersonView
Плавные переходы состояния камеры реализуются через интерполяцию
viewState.
function moveForward(state) {
return {
...state,
position: [
state.position[0],
state.position[1] + 1,
state.position[2]
]
};
}
deckgl.setProps({
viewState: moveForward(deckgl.props.viewState)
});
Оптимизация сцены зависит от:
FirstPersonView сам по себе не накладывает дополнительных затрат, но характер сцены часто требует высокой GPU-вычислительной мощности из-за плотных 3D-нагрузок.