Камера в CesiumJS представляет собой математическую модель наблюдателя в трёхмерном пространстве, определяющую положение, ориентацию и параметры проекции. Она тесно связана с глобусом и сценой, формируя единый контекст визуализации геопространственных данных.
Основные компоненты камеры:
Ключевая особенность камеры CesiumJS заключается в том, что она оперирует не только локальными координатами сцены, но и геодезическими системами, обеспечивая корректную работу с глобусом WGS84.
Полёт камеры — это интерполяция состояния камеры во времени между начальной и конечной позицией с заданной траекторией движения. В CesiumJS этот процесс реализован через методы камеры Viewer и Camera.
Основные свойства полёта:
Ключевой метод:
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(37.6173, 55.7558, 10000),
duration: 3.0
});
destination определяет конечную точку камеры:
fromDegreesОпределяет длительность анимации в секундах:
Позволяет задать направление камеры:
orientation: {
heading: Cesium.Math.toRadians(90),
pitch: Cesium.Math.toRadians(-30),
roll: 0.0
}
Метод используется для автоматического охвата объекта в сцене.
viewer.camera.flyToBoundingSphere(boundingSphere, {
duration: 2.5
});
BoundingSphere вычисляется на основе геометрии:
Алгоритм работы:
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(10, 10, 5000),
complete: function () {
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(20, 20, 5000)
});
}
});
Цепочки полётов строятся через callback-и, позволяя формировать сценарии навигации.
CesiumJS поддерживает кастомизацию ускорения движения камеры через easingFunction.
Пример:
easingFunction: Cesium.EasingFunction.CUBIC_IN_OUT
Основные типы:
Поведение траектории определяется функцией времени t ∈ [0, 1], влияющей на интерполяцию позиции.
Метод flyToOffset позволяет выполнять полёт относительно текущей ориентации объекта:
viewer.camera.flyToBoundingSphere(boundingSphere, {
offset: new Cesium.HeadingPitchRange(
Cesium.Math.toRadians(0),
Cesium.Math.toRadians(-45),
2000
)
});
Этот механизм часто используется для орбитального обзора объектов.
Для сложных сцен используется комбинированный подход:
Пример:
const boundingSphere = tileset.boundingSphere;
viewer.camera.flyToBoundingSphere(boundingSphere, {
duration: 4.0,
offset: new Cesium.HeadingPitchRange(0, -0.5, boundingSphere.radius * 2)
});
Помимо flyTo, существует мгновенное позиционирование:
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(30, 50, 10000),
orientation: {
heading: 0,
pitch: -0.5,
roll: 0
}
});
Отличие:
Траектория движения камеры строится на интерполяции:
[ P(t) = (1 - t)P_0 + tP_1]
Используется сферическая интерполяция кватернионов (SLERP):
[ Q(t) = Q_0 + Q_1]
Где θ — угол между кватернионами.
CesiumJS работает в системе Earth-Centered Earth-Fixed (ECEF):
При полётах происходит трансформация:
Поведение камеры зависит от:
При малых высотах:
Любая анимация камеры может быть остановлена:
viewer.camera.cancelFlight();
Особенности:
Сложные сценарии формируются через последовательные анимации:
При этом каждый следующий этап может зависеть от текущей позиции камеры, вычисляемой через viewer.camera.positionWC и orientation.