В CesiumJS камера является центральным объектом управления сценой и
определяет положение наблюдателя в трёхмерном пространстве. Она
интегрирована в объект Viewer через
viewer.camera, а также доступна напрямую как экземпляр
класса Camera.
Камера работает в контексте сцены Scene, взаимодействует
с системой координат Earth-fixed (ECEF) и поддерживает геодезическое
представление через широту, долготу и высоту. Любое изменение положения
камеры мгновенно отражается на рендеринге глобуса, тайлов и
3D-объектов.
Камера описывается набором ключевых характеристик:
Положение
position — вектор в ECEF (Cartesian3)positionCartographic — географические координаты
(долгота, широта, высота)Ориентация
heading — поворот вокруг оси Z (курс)pitch — наклон вверх/внизroll — вращение вокруг направления взглядаЭти параметры формируют полное описание ориентации камеры в пространстве.
viewer.camera.position = Cesium.Cartesian3.fromDegrees(71.4304, 51.1284, 10000);
viewer.camera.heading = Cesium.Math.toRadians(0.0);
viewer.camera.pitch = Cesium.Math.toRadians(-45.0);
viewer.camera.roll = 0.0;
Базовый способ управления — работа с ECEF координатами:
const camera = viewer.camera;
camera.position = new Cesium.Cartesian3(
1335000.0,
-4650000.0,
4130000.0
);
camera.direction = Cesium.Cartesian3.normalize(
new Cesium.Cartesian3(-1.0, 0.0, -0.5),
new Cesium.Cartesian3()
);
camera.up = Cesium.Cartesian3.UNIT_Z;
Этот способ используется для точного позиционирования в инженерных задачах и при работе с локальными системами координат.
Часто используется преобразование из географических координат:
camera.position = Cesium.Cartesian3.fromDegrees(
71.4304,
51.1284,
1500
);
Для стабильной работы важно учитывать эллипсоид Земли, используемый в сцене.
Метод setView мгновенно устанавливает положение без
анимации:
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(71.4304, 51.1284, 20000),
orientation: {
heading: Cesium.Math.toRadians(20.0),
pitch: Cesium.Math.toRadians(-30.0),
roll: 0.0
}
});
Характерные особенности:
Метод flyTo обеспечивает плавную анимацию перемещения
камеры:
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(71.4304, 51.1284, 20000),
orientation: {
heading: Cesium.Math.toRadians(0),
pitch: Cesium.Math.toRadians(-45),
roll: 0
},
duration: 3.0
});
Анимация включает:
Используется для автоматического кадрирования объектов:
viewer.camera.flyToBoundingSphere(boundingSphere, {
duration: 2.5,
offset: new Cesium.HeadingPitchRange(
Cesium.Math.toRadians(0),
Cesium.Math.toRadians(-30),
5000
)
});
Этот подход применяется при работе с 3D-моделями и группами сущностей.
Ориентация камеры задаётся через три угла:
camera.setView({
orientation: {
heading: Cesium.Math.toRadians(90),
pitch: Cesium.Math.toRadians(-20),
roll: Cesium.Math.toRadians(0)
}
});
Эти параметры активно используются при создании режимов:
Метод lookAt фиксирует камеру на заданной точке:
const target = Cesium.Cartesian3.fromDegrees(71.4304, 51.1284, 0);
camera.lookAt(
target,
new Cesium.HeadingPitchRange(
Cesium.Math.toRadians(0),
Cesium.Math.toRadians(-30),
10000
)
);
Особенность метода:
lookAtTransform(Cesium.Matrix4.IDENTITY)Cesium использует несколько пространств:
Пример преобразования:
const cartographic = Cesium.Cartographic.fromDegrees(71.4304, 51.1284);
const cartesian = Cesium.Ellipsoid.WGS84.cartographicToCartesian(cartographic);
Камера всегда оперирует Cartesian3, но интерфейс часто требует географические координаты.
Контроллер пользовательского ввода:
viewer.scene.screenSpaceCameraController.enableRotate = true;
viewer.scene.screenSpaceCameraController.enableZoom = true;
viewer.scene.screenSpaceCameraController.enableTilt = true;
viewer.scene.screenSpaceCameraController.enableTranslate = true;
Параметры управления:
viewer.scene.screenSpaceCameraController.minimumZoomDistance = 100;
viewer.scene.screenSpaceCameraController.maximumZoomDistance = 20000000;
Ограничения применяются для:
viewer.clock.onTick.addEventListener(function () {
viewer.camera.rotate(Cesium.Cartesian3.UNIT_Z, 0.001);
});
Используется для:
viewer.camera.lookAt(
Cesium.Cartesian3.fromDegrees(71.4304, 51.1284),
new Cesium.HeadingPitchRange(
Cesium.Math.toRadians(0),
Cesium.Math.toRadians(-45),
5000
)
);
viewer.clock.onTick.addEventListener(function () {
viewer.camera.rotateRight(0.002);
});
Cesium использует внутренние интерполяторы для плавного перехода камеры.
Основные характеристики:
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(71.4304, 51.1284, 10000),
complete: function () {
viewer.camera.zoomOut(5000);
}
});
Камера может быть полностью определена через базис:
camera.position = Cesium.Cartesian3.fromDegrees(71.4304, 51.1284, 10000);
camera.direction = Cesium.Cartesian3.normalize(directionVector, new Cesium.Cartesian3());
camera.up = Cesium.Cartesian3.UNIT_Z;
Такой подход используется в:
viewer.clock.onTick.addEventListener(function () {
const position = entity.position.getValue(viewer.clock.currentTime);
viewer.camera.lookAt(position, new Cesium.Cartesian3(0, -1000, 500));
});
viewer.clock.onTick.addEventListener(function () {
viewer.camera.rotate(Cesium.Cartesian3.UNIT_Z, 0.002);
});
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(0, 0, 20000000),
orientation: {
pitch: Cesium.Math.toRadians(-90),
heading: 0,
roll: 0
}
});