В CesiumJS вся геометрия сцены опирается на фундаментальный тип
данных — Cartesian3, который представляет собой трёхмерный
вектор в декартовой системе координат. Этот тип используется
повсеместно: для задания положения объектов, направления камер,
вычисления расстояний, работы с матрицами преобразований и описания
движения в пространстве.
Cartesian3 — это структура, содержащая три числовых
компонента:
В CesiumJS используется правосторонняя система координат, где:
Такое представление связано с геоцентрической моделью, где Земля рассматривается как центр системы координат, а не как плоская карта.
В отличие от экранных координат или привычных систем 2D-графики,
Cartesian3 работает в глобальном масштабе. Начало координат
(0, 0, 0) соответствует центру Земли. Это означает, что все точки в
сцене задаются относительно центра планеты, а не локального пространства
сцены.
Единицей измерения в Cartesian3 являются
метры. Это делает систему физически согласованной:
расстояния, скорости и размеры объектов имеют реальный масштаб.
Базовый способ создания:
const position = new Cesium.Cartesian3(1000.0, 2000.0, 3000.0);
Такой способ используется, когда координаты уже находятся в глобальной декартовой системе.
const position = Cesium.Cartesian3.fromArray([1000.0, 2000.0, 3000.0]);
Этот вариант удобен при работе с данными, полученными из API или хранилищ, где координаты представлены списками.
Одной из ключевых особенностей является преобразование из широты и долготы:
const position = Cesium.Cartesian3.fromDegrees(37.6173, 55.7558, 100.0);
Этот метод выполняет преобразование из геодезической системы (WGS84) в геоцентрическую декартову систему.
Также существует вариант с радианами:
const position = Cesium.Cartesian3.fromRadians(longitude, latitude, height);
Для работы с независимыми экземплярами используются методы копирования:
const a = new Cesium.Cartesian3(1, 2, 3);
const b = Cesium.Cartesian3.clone(a);
Или:
Cesium.Cartesian3.clone(a, result);
Второй вариант позволяет переиспользовать заранее созданный объект, уменьшая нагрузку на сборщик мусора.
Cartesian3 поддерживает базовые векторные операции.
const result = Cesium.Cartesian3.add(a, b, new Cesium.Cartesian3());
Используется для комбинирования смещений или объединения направлений.
const result = Cesium.Cartesian3.subtract(a, b, new Cesium.Cartesian3());
Применяется для вычисления вектора между двумя точками.
const scaled = Cesium.Cartesian3.multiplyByScalar(a, 2.0, new Cesium.Cartesian3());
Позволяет масштабировать вектор без изменения направления.
const length = Cesium.Cartesian3.magnitude(a);
Возвращает евклидову длину:
√(x² + y² + z²)
const normalized = Cesium.Cartesian3.normalize(a, new Cesium.Cartesian3());
Результатом является единичный вектор, сохраняющий направление исходного.
Нормализация широко используется в расчётах освещения, направления камер и построении лучей.
const dot = Cesium.Cartesian3.dot(a, b);
Скалярное произведение определяет:
Если результат равен 0 — векторы перпендикулярны.
const cross = Cesium.Cartesian3.cross(a, b, new Cesium.Cartesian3());
Результат перпендикулярен обоим исходным векторам. Это ключевая операция для:
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(30, 50, 1000),
point: {
pixelSize: 10
}
});
Любая сущность в сцене в конечном итоге получает
Cartesian3 как базовую позицию.
Камера также оперирует векторами:
viewer.camera.position = new Cesium.Cartesian3(0, 0, 1000000);
Направление камеры задаётся через вектор:
viewer.camera.direction = Cesium.Cartesian3.normalize(
new Cesium.Cartesian3(1, 0, -1),
new Cesium.Cartesian3()
);
Параметры up и direction формируют
ориентацию камеры в пространстве.
CesiumJS активно использует преобразования между:
Cartesian3 выступает универсальным промежуточным
форматом.
Пример преобразования через матрицы:
const transform = Cesium.Transforms.eastNorthUpToFixedFrame(
Cesium.Cartesian3.fromDegrees(30, 50, 0)
);
Результат — матрица, в которой Cartesian3 используется
как базовая точка привязки.
В CesiumJS важно избегать избыточного создания объектов
Cartesian3, поскольку сцена может содержать тысячи
вычислений в каждом кадре.
Типичный оптимизационный подход:
const temp = new Cesium.Cartesian3();
Cesium.Cartesian3.add(a, b, temp);
Повторное использование объектов снижает нагрузку на память и сборщик мусора.
Хотя Cartesian3 выглядит как обычный 3D-вектор, его
значение привязано к модели эллипсоида:
Это делает систему динамической: одна и та же точка в
Cartesian3 может соответствовать разным локальным условиям
в зависимости от времени и преобразований сцены.
Cartesian3 можно рассматривать как:
Контекст определяет смысл структуры, но математически она остаётся единым типом.
Cartesian3 как 2D координат
(игнорирование Z),Cartesian3 является базовым строительным блоком, на
котором строятся:
Matrix3,
Matrix4),Quaternion),PolygonGeometry,
PolylineGeometry),Любая высокоуровневая сущность в конечном итоге распадается до операций над трёхмерными векторами этого типа.