Cartesian3 координаты

В CesiumJS вся геометрия сцены опирается на фундаментальный тип данных — Cartesian3, который представляет собой трёхмерный вектор в декартовой системе координат. Этот тип используется повсеместно: для задания положения объектов, направления камер, вычисления расстояний, работы с матрицами преобразований и описания движения в пространстве.

Cartesian3 — это структура, содержащая три числовых компонента:

  • x — координата по оси X
  • y — координата по оси Y
  • z — координата по оси Z

В CesiumJS используется правосторонняя система координат, где:

  • ось X направлена на восток,
  • ось Y направлена на север,
  • ось Z направлена вверх относительно поверхности эллипсоида.

Такое представление связано с геоцентрической моделью, где Земля рассматривается как центр системы координат, а не как плоская карта.

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

В отличие от экранных координат или привычных систем 2D-графики, Cartesian3 работает в глобальном масштабе. Начало координат (0, 0, 0) соответствует центру Земли. Это означает, что все точки в сцене задаются относительно центра планеты, а не локального пространства сцены.

Единицей измерения в Cartesian3 являются метры. Это делает систему физически согласованной: расстояния, скорости и размеры объектов имеют реальный масштаб.

Создание объектов 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 как базовую позицию.

Камера и 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 активно использует преобразования между:

  • географическими координатами (широта/долгота),
  • инерциальной системой,
  • локальными системами (ENU — East, North, Up).

Cartesian3 выступает универсальным промежуточным форматом.

Пример преобразования через матрицы:

const transform = Cesium.Transforms.eastNorthUpToFixedFrame(
    Cesium.Cartesian3.fromDegrees(30, 50, 0)
);

Результат — матрица, в которой Cartesian3 используется как базовая точка привязки.

Производительность и паттерн reuse

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

Типичный оптимизационный подход:

const temp = new Cesium.Cartesian3();

Cesium.Cartesian3.add(a, b, temp);

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

Связь с эллипсоидом Земли

Хотя Cartesian3 выглядит как обычный 3D-вектор, его значение привязано к модели эллипсоида:

  • координаты интерпретируются в ECEF (Earth-Centered, Earth-Fixed),
  • оси вращаются вместе с Землёй,
  • позиция изменяется относительно вращения планеты.

Это делает систему динамической: одна и та же точка в Cartesian3 может соответствовать разным локальным условиям в зависимости от времени и преобразований сцены.

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

Cartesian3 можно рассматривать как:

  • точку в пространстве (позиция),
  • вектор направления (скорость, нормаль),
  • смещение между объектами.

Контекст определяет смысл структуры, но математически она остаётся единым типом.

Частые ошибки при работе

  • использование Cartesian3 как 2D координат (игнорирование Z),
  • смешивание географических и декартовых значений,
  • создание новых объектов в циклах рендеринга без переиспользования,
  • неправильная нормализация перед использованием в направлении камеры.

Роль в архитектуре движка

Cartesian3 является базовым строительным блоком, на котором строятся:

  • матрицы трансформаций (Matrix3, Matrix4),
  • ориентации (Quaternion),
  • геометрия (PolygonGeometry, PolylineGeometry),
  • физические вычисления (скорости, направления движения объектов).

Любая высокоуровневая сущность в конечном итоге распадается до операций над трёхмерными векторами этого типа.