FirstPersonView

FirstPersonView реализует модель камеры, в которой сцена воспринимается как трёхмерное пространство от первого лица. В отличие от географических представлений карты, здесь отсутствует привязка к проекции плоскости Земли как основной абстракции — управление осуществляется через позицию наблюдателя и ориентацию в пространстве.

Ключевая особенность заключается в том, что камера ведёт себя как виртуальный «персонаж» в 3D-среде, перемещающийся по координатам X/Y/Z и изменяющий направление взгляда через углы поворота.


Архитектура FirstPersonView

FirstPersonView в Deck.gl работает в связке с системой представлений (View) и состоянием камеры (viewState). Основные компоненты:

  • position — трёхмерная позиция камеры [x, y, z]
  • bearing — поворот по горизонтальной оси (yaw)
  • pitch — наклон камеры вверх/вниз
  • controller — включение управления пользователем (мышь/клавиатура)

В отличие от MapView, где используются географические координаты (longitude/latitude), здесь используется декартова система координат.


Базовая конфигурация FirstPersonView

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-логику управления:

  • перемещение вперёд/назад вдоль направления взгляда
  • смещение влево/вправо относительно локальной оси
  • изменение направления через движение мыши
  • вертикальный обзор через изменение pitch

Внутренне система преобразует действия пользователя в обновления viewState.


Пространственная система координат

В FirstPersonView координатная система не привязана к географическим данным. Обычно применяется следующая интерпретация:

  • X — движение вправо/влево
  • Y — движение вперёд/назад
  • Z — высота камеры

Это позволяет использовать View для:

  • 3D-игровых сцен
  • архитектурных визуализаций
  • симуляций движения
  • навигации внутри моделей зданий

Управление через controller

Включение controller: true активирует обработку пользовательского ввода.

const view = new FirstPersonView({
  id: 'fpv',
  controller: true
});

Поведение контроллера:

  • WASD — линейное перемещение
  • движение мыши — изменение yaw/pitch
  • колесо мыши — дополнительное управление (в зависимости от реализации)

Контроллер работает через обновление viewState, который синхронизируется с рендерингом Deck.gl.


Обновление состояния камеры

Камера управляется через изменение viewState. Это ключевой механизм реактивной архитектуры Deck.gl.

deckgl.setProps({
  viewState: {
    position: [10, 5, 2],
    bearing: 45,
    pitch: -10
  }
});

Изменение состояния мгновенно влияет на рендеринг сцены без необходимости перезапуска приложения.


Связь с слоями (Layers)

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 использует перспективную проекцию, где:

  • объекты уменьшаются с удалением
  • параллельные линии сходятся
  • глубина влияет на масштабирование и видимость

Это создаёт эффект естественного восприятия пространства, близкий к реальному зрению.


Интеграция с 3D-рендерингом

FirstPersonView часто используется совместно с WebGL-слоями и 3D-моделями:

  • OBJ/GLTF модели через mesh-слои
  • процедурная генерация окружения
  • визуализация внутренних пространств зданий

Пример интеграции с 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.


Сравнение с другими View

MapView

  • географические координаты
  • поддержка тайлов и карт
  • глобальная проекция

OrbitView

  • вращение вокруг центра
  • фиксированная точка интереса
  • подходит для моделей и объектов

FirstPersonView

  • свободное перемещение в пространстве
  • ориентация от первого лица
  • максимальная гибкость для 3D-сцен

Обновление через анимацию камеры

Плавные переходы состояния камеры реализуются через интерполяцию 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

Оптимизация сцены зависит от:

  • количества отрисовываемых объектов
  • сложности геометрии
  • использования instancing
  • эффективности шейдеров

FirstPersonView сам по себе не накладывает дополнительных затрат, но характер сцены часто требует высокой GPU-вычислительной мощности из-за плотных 3D-нагрузок.


Типовые сценарии применения

  • симуляция движения внутри помещений
  • визуализация игровых миров
  • тренажёры навигации
  • интерактивные 3D-карты помещений
  • исследование архитектурных моделей