В CesiumJS камера является центральным объектом системы визуализации, определяющим точку обзора, направление взгляда, перспективу и параметры проекции. Она тесно связана с виртуальной 3D-сценой и управляет тем, какая часть глобуса или трёхмерной модели будет отображена в текущий момент.
Камера оперирует в пространстве декартовых координат и использует
математические конструкции линейной алгебры: векторы, матрицы
преобразований и кватернионы. Основной объект управления — экземпляр
Camera, доступный через viewer.camera.
Камера в CesiumJS не существует как изолированный объект — она является частью сцены и напрямую связана с рендерингом кадра.
Ключевые компоненты:
Камера использует глобальную систему координат Earth-Centered, Earth-Fixed (ECEF), где:
Все позиционные параметры камеры представлены в формате
Cartesian3.
Объект камеры содержит набор ключевых свойств, определяющих текущее состояние:
camera.position = Cesium.Cartesian3.fromDegrees(37.6173, 55.7558, 1000);
Определяет точку размещения камеры в мировых координатах.
Особенность: при изменении position без обновления ориентации камера может смотреть в произвольном направлении.
Эти векторы формируют локальную систему координат камеры:
direction — направление взглядаup — вертикаль камерыright — ортогональный векторcamera.direction = new Cesium.Cartesian3(1, 0, 0);
camera.up = new Cesium.Cartesian3(0, 0, 1);
Эти векторы должны быть нормализованы и взаимно ортогональны, иначе возможны искажения ориентации.
Позволяет задать матрицу преобразования для перехода между локальными и мировыми координатами.
camera.transform = Cesium.Matrix4.IDENTITY;
Используется при работе с локальными сценами или вложенными системами координат.
CesiumJS предоставляет несколько методов для изменения положения камеры, каждый из которых соответствует различным сценариям навигации.
Метод мгновенно устанавливает положение и ориентацию камеры без анимации.
camera.setView({
destination: Cesium.Cartesian3.fromDegrees(30.5, 50.4, 15000),
orientation: {
heading: Cesium.Math.toRadians(0),
pitch: Cesium.Math.toRadians(-45),
roll: 0
}
});
Особенности:
Метод анимированного перемещения камеры к цели.
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
}
});
Позволяет привязать камеру к конкретной точке или объекту сцены.
const center = Cesium.Cartesian3.fromDegrees(10.0, 45.0);
camera.lookAt(center, new Cesium.Cartesian3(0, -1000, 500));
Метод изменяет систему координат камеры, создавая локальную привязку.
Особенность: после использования требуется сброс:
camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
Ориентация задаётся через углы Эйлера:
camera.setView({
orientation: {
heading: Cesium.Math.toRadians(180),
pitch: Cesium.Math.toRadians(-90),
roll: 0
}
});
Heading задаёт направление по горизонту, Pitch управляет углом взгляда относительно поверхности Земли, Roll используется редко, чаще всего в авиационных симуляциях.
CesiumJS предоставляет низкоуровневые методы для интерактивного управления.
camera.moveForward(1000);
camera.moveBackward(500);
Перемещают камеру вдоль вектора направления.
camera.moveUp(200);
camera.moveDown(200);
Работают относительно локальной системы координат камеры.
camera.moveRight(300);
camera.moveLeft(300);
Перемещение по горизонтали относительно текущего направления.
Для изменения ориентации без изменения позиции используются методы вращения.
camera.lookRight(Cesium.Math.toRadians(5));
camera.lookLeft(Cesium.Math.toRadians(5));
camera.lookUp(Cesium.Math.toRadians(2));
camera.lookDown(Cesium.Math.toRadians(2));
camera.twistRight(Cesium.Math.toRadians(10));
Используется для управления roll-компонентой.
Камера в CesiumJS работает в глобальном масштабе, поэтому высота играет критическую роль в восприятии сцены.
const position = Cesium.Cartesian3.fromDegrees(20.0, 40.0, 100000);
camera.position = position;
Высота влияет на:
CesiumJS позволяет ограничивать движение камеры для предотвращения выхода за допустимые границы.
camera.constrainedAxis = Cesium.Cartesian3.UNIT_Z;
Также можно ограничивать наклон:
camera.minimumPitch = Cesium.Math.toRadians(-80);
camera.maximumPitch = Cesium.Math.toRadians(-10);
Камера использует усечённую пирамиду видимости (view frustum).
Основные параметры:
camera.frustum.near = 1.0;
camera.frustum.far = 10000000.0;
camera.frustum.fov = Cesium.Math.toRadians(60);
Изменение FOV влияет на перспективные искажения и ощущение масштаба сцены.
Camera API тесно взаимодействует с системой координат Cesium.
const camCoords = camera.worldToCameraCoordinates(position);
const projected = camera.worldToCameraCoordinatesPoint(
Cesium.Cartesian3.fromDegrees(30, 60, 0)
);
Используется для проецирования точек в экранное пространство.
Камера хранит ключевые матрицы:
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");
});
Используется для:
В реальных сценариях Camera API применяется через комбинации методов:
Такая комбинация формирует основу навигационной логики в 3D-геовизуализации CesiumJS.