Camera API

В CesiumJS камера является центральным объектом системы визуализации, определяющим точку обзора, направление взгляда, перспективу и параметры проекции. Она тесно связана с виртуальной 3D-сценой и управляет тем, какая часть глобуса или трёхмерной модели будет отображена в текущий момент.

Камера оперирует в пространстве декартовых координат и использует математические конструкции линейной алгебры: векторы, матрицы преобразований и кватернионы. Основной объект управления — экземпляр Camera, доступный через viewer.camera.


Архитектура камеры и система координат

Камера в CesiumJS не существует как изолированный объект — она является частью сцены и напрямую связана с рендерингом кадра.

Ключевые компоненты:

  • положение камеры (position)
  • направление взгляда (direction)
  • вектор “вверх” (up)
  • правоориентированная система координат (right)
  • матрица вида (view matrix)
  • матрица проекции (projection matrix)

Камера использует глобальную систему координат Earth-Centered, Earth-Fixed (ECEF), где:

  • ось X направлена к пересечению экватора и нулевого меридиана
  • ось Y — к 90° восточной долготы
  • ось Z — к северному полюсу

Все позиционные параметры камеры представлены в формате Cartesian3.


Базовые свойства Camera

Объект камеры содержит набор ключевых свойств, определяющих текущее состояние:

position

camera.position = Cesium.Cartesian3.fromDegrees(37.6173, 55.7558, 1000);

Определяет точку размещения камеры в мировых координатах.

Особенность: при изменении position без обновления ориентации камера может смотреть в произвольном направлении.


direction, up, right

Эти векторы формируют локальную систему координат камеры:

  • direction — направление взгляда
  • up — вертикаль камеры
  • right — ортогональный вектор
camera.direction = new Cesium.Cartesian3(1, 0, 0);
camera.up = new Cesium.Cartesian3(0, 0, 1);

Эти векторы должны быть нормализованы и взаимно ортогональны, иначе возможны искажения ориентации.


transform

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

camera.transform = Cesium.Matrix4.IDENTITY;

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


Управление положением камеры

CesiumJS предоставляет несколько методов для изменения положения камеры, каждый из которых соответствует различным сценариям навигации.


setView

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

camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(30.5, 50.4, 15000),
    orientation: {
        heading: Cesium.Math.toRadians(0),
        pitch: Cesium.Math.toRadians(-45),
        roll: 0
    }
});

Особенности:

  • отсутствует интерполяция
  • используется для мгновенных переходов
  • применяется в инициализации сцены

flyTo

Метод анимированного перемещения камеры к цели.

viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(48.8566, 2.3522, 5000),
    duration: 3
});

Внутренняя логика:

  • интерполяция позиции
  • сглаживание кривой движения
  • автоматическое управление направлением

Дополнительно можно задать ориентацию:

viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(13.4050, 52.5200, 8000),
    orientation: {
        heading: Cesium.Math.toRadians(90),
        pitch: Cesium.Math.toRadians(-30),
        roll: 0
    }
});

lookAt

Позволяет привязать камеру к конкретной точке или объекту сцены.

const center = Cesium.Cartesian3.fromDegrees(10.0, 45.0);

camera.lookAt(center, new Cesium.Cartesian3(0, -1000, 500));

Метод изменяет систему координат камеры, создавая локальную привязку.

Особенность: после использования требуется сброс:

camera.lookAtTransform(Cesium.Matrix4.IDENTITY);

Ориентация камеры: Heading, Pitch, Roll

Ориентация задаётся через углы Эйлера:

  • Heading — поворот вокруг оси Z (азимут)
  • Pitch — наклон вверх/вниз
  • Roll — вращение вокруг оси взгляда
camera.setView({
    orientation: {
        heading: Cesium.Math.toRadians(180),
        pitch: Cesium.Math.toRadians(-90),
        roll: 0
    }
});

Геометрическая интерпретация

Heading задаёт направление по горизонту, Pitch управляет углом взгляда относительно поверхности Земли, Roll используется редко, чаще всего в авиационных симуляциях.


Движение камеры

CesiumJS предоставляет низкоуровневые методы для интерактивного управления.


moveForward / moveBackward

camera.moveForward(1000);
camera.moveBackward(500);

Перемещают камеру вдоль вектора направления.


moveUp / moveDown

camera.moveUp(200);
camera.moveDown(200);

Работают относительно локальной системы координат камеры.


moveRight / moveLeft

camera.moveRight(300);
camera.moveLeft(300);

Перемещение по горизонтали относительно текущего направления.


Вращение камеры

Для изменения ориентации без изменения позиции используются методы вращения.


lookRight / lookLeft

camera.lookRight(Cesium.Math.toRadians(5));
camera.lookLeft(Cesium.Math.toRadians(5));

lookUp / lookDown

camera.lookUp(Cesium.Math.toRadians(2));
camera.lookDown(Cesium.Math.toRadians(2));

twistRight / twistLeft

camera.twistRight(Cesium.Math.toRadians(10));

Используется для управления roll-компонентой.


Работа с высотой и масштабом

Камера в CesiumJS работает в глобальном масштабе, поэтому высота играет критическую роль в восприятии сцены.

const position = Cesium.Cartesian3.fromDegrees(20.0, 40.0, 100000);
camera.position = position;

Высота влияет на:

  • уровень детализации (LOD)
  • количество подгружаемых тайлов
  • перспективные искажения

Ограничения камеры (Camera Constraints)

CesiumJS позволяет ограничивать движение камеры для предотвращения выхода за допустимые границы.

camera.constrainedAxis = Cesium.Cartesian3.UNIT_Z;

Также можно ограничивать наклон:

camera.minimumPitch = Cesium.Math.toRadians(-80);
camera.maximumPitch = Cesium.Math.toRadians(-10);

Frustum и параметры проекции

Камера использует усечённую пирамиду видимости (view frustum).

Основные параметры:

  • field of view (FOV)
  • near plane
  • far plane
camera.frustum.near = 1.0;
camera.frustum.far = 10000000.0;

PerspectiveFrustum

camera.frustum.fov = Cesium.Math.toRadians(60);

Изменение FOV влияет на перспективные искажения и ощущение масштаба сцены.


Преобразования координат

Camera API тесно взаимодействует с системой координат Cesium.

worldToCameraCoordinates

const camCoords = camera.worldToCameraCoordinates(position);

worldToCameraCoordinatesPoint

const projected = camera.worldToCameraCoordinatesPoint(
    Cesium.Cartesian3.fromDegrees(30, 60, 0)
);

Используется для проецирования точек в экранное пространство.


Матрицы камеры

Камера хранит ключевые матрицы:

  • viewMatrix
  • inverseViewMatrix
  • projectionMatrix
const view = camera.viewMatrix;
const proj = camera.frustum.projectionMatrix;

Эти матрицы используются GPU для трансформации сцены.


Привязка камеры к объектам сцены

Часто камера привязывается к сущностям (Entity):

viewer.trackedEntity = entity;

В этом режиме камера автоматически следует за объектом, обновляя позицию и ориентацию.


Ограничение взаимодействия пользователя

Camera API позволяет блокировать пользовательское управление:

scene.screenSpaceCameraController.enableRotate = false;
scene.screenSpaceCameraController.enableZoom = true;
scene.screenSpaceCameraController.enableTilt = false;

Это полезно при создании статичных или ограниченных интерфейсов.


Интеграция с событиями сцены

Камера может быть связана с событиями рендеринга:

camera.changed.addEventListener(function () {
    console.log("Camera updated");
});

Используется для:

  • синхронизации UI
  • обновления слоёв данных
  • вычисления видимости объектов

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

В реальных сценариях Camera API применяется через комбинации методов:

  • setView для инициализации
  • flyTo для навигации
  • move/rotate для интерактивного управления
  • constraints для ограничения области

Такая комбинация формирует основу навигационной логики в 3D-геовизуализации CesiumJS.