Ellipsoid и геодезия

В основе всей пространственной математики в CesiumJS лежит модель вращающегося эллипсоида, приближающего форму Земли. В отличие от сферы, эллипсоид учитывает сплюснутость планеты у полюсов, что критически важно для корректных вычислений координат, расстояний и направлений на глобальных сценах.

Наиболее распространённой моделью является WGS84, задающая параметры полуосей:

  • экваториальный радиус (a)
  • полярный радиус (b)
  • степень сжатия (f)

CesiumJS использует эту модель как стандартную через класс Ellipsoid, предоставляющий методы преобразований и геодезических вычислений.


Математическое представление эллипсоида

Эллипсоид вращения задаётся уравнением:

[ + + = 1]

где:

    1. — радиус экватора,
    1. — полярный радиус.

В CesiumJS это соответствует объекту:

const ellipsoid = Cesium.Ellipsoid.WGS84;

Стандартные параметры WGS84:

  • (a = 6378137.0) метров
  • (f = 1 / 298.257223563)
  • (b = a (1 - f))

Эта модель используется во всех геодезических преобразованиях библиотеки.


Cartesian3 и Cartographic: две системы координат

CesiumJS оперирует двумя основными представлениями координат:

Cartesian3 (ECEF)

Прямоугольная система координат в пространстве Земли:

  • ось X проходит через экватор (Гринвич)
  • ось Y — экватор на 90° восточнее
  • ось Z — северный полюс
const cartesian = new Cesium.Cartesian3(1000, 2000, 3000);

Эта система называется Earth-Centered Earth-Fixed (ECEF).


Cartographic (геодезические координаты)

Представление в виде:

  • долгота (longitude)
  • широта (latitude)
  • высота (height)
const cartographic = new Cesium.Cartographic(
    Cesium.Math.toRadians(45.0),
    Cesium.Math.toRadians(55.0),
    1000.0
);

Перевод между системами выполняется через эллипсоид:

const cartesian = Cesium.Cartesian3.fromRadians(
    longitude,
    latitude,
    height,
    Cesium.Ellipsoid.WGS84
);

и обратно:

const cartographic = Cesium.Cartographic.fromCartesian(
    cartesian,
    Cesium.Ellipsoid.WGS84
);

Геодезическая широта и геоцентрическая широта

В эллипсоидальной модели различаются два типа широты:

Геодезическая широта

Угол между нормалью к поверхности эллипсоида и экваториальной плоскостью. Именно она используется в GIS и CesiumJS.

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

Угол между радиус-вектором от центра Земли и экваториальной плоскостью.

Различие становится заметным ближе к полюсам из-за сплюснутости Земли.

CesiumJS работает преимущественно с геодезической широтой, так как она соответствует реальным навигационным и картографическим данным.


Нормали к поверхности эллипсоида

Нормаль к эллипсоиду в заданной точке — ключевой элемент при освещении, ориентации объектов и построении локальных систем координат.

const normal = ellipsoid.geodeticSurfaceNormal(cartesian, new Cesium.Cartesian3());

Эта нормаль используется для:

  • ориентации камер
  • расчёта освещения
  • построения локальных базисов East-North-Up

Локальные системы координат: East-North-Up

Для работы в локальных областях используется система ENU (East-North-Up), где:

  • East — касательная к параллели
  • North — касательная к меридиану
  • Up — нормаль к эллипсоиду

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

const transform = Cesium.Transforms.eastNorthUpToFixedFrame(cartesian);

Эта матрица позволяет переводить локальные координаты в глобальные ECEF.


Геодезические расстояния на эллипсоиде

Расстояние между двумя точками на поверхности эллипсоида не является прямой линией в 3D-пространстве. Оно вычисляется вдоль геодезической линии — кратчайшего пути по поверхности.

CesiumJS предоставляет инструменты для работы с геодезическими линиями:

const geodesic = new Cesium.EllipsoidGeodesic(
    Cesium.Cartographic.fromDegrees(lon1, lat1),
    Cesium.Cartographic.fromDegrees(lon2, lat2)
);

const distance = geodesic.surfaceDistance;

Также доступна интерполяция точки вдоль геодезии:

const midpoint = geodesic.interpolateUsingFraction(0.5);

Поверхностная геометрия и радиус кривизны

Эллипсоид обладает переменной кривизной, зависящей от широты. Радиус кривизны в меридиональном и нормальном направлениях различается, что влияет на:

  • точность навигации
  • интерполяцию траекторий
  • построение тайловых проекций

CesiumJS скрывает эти вычисления внутри геодезических алгоритмов, но они критичны при работе с высокоточной геометрией.


Проекции на эллипсоид и обратные преобразования

Любая 3D-точка в CesiumJS может быть спроецирована на поверхность эллипсоида:

const surfacePoint = ellipsoid.scaleToGeodeticSurface(cartesian);

Обратная операция — поднятие точки на заданную высоту:

const raised = ellipsoid.cartographicToCartesian(
    new Cesium.Cartographic(longitude, latitude, height)
);

Эти операции используются при:

  • построении террейна
  • привязке объектов к поверхности
  • вычислении высот над уровнем моря

Лучи и пересечение с эллипсоидом

При работе с камерой и picking-операциями часто требуется вычислить пересечение луча с поверхностью Земли:

const ray = new Cesium.Ray(origin, direction);
const intersection = Cesium.IntersectionTests.rayEllipsoid(ray, ellipsoid);

Это основа:

  • кликов по карте
  • определения точки под курсором
  • анализа видимости объектов

Тангенциальные плоскости и локальная аппроксимация

В малых областях эллипсоид аппроксимируется плоскостью, касательной в заданной точке. Это используется для:

  • упрощённых вычислений
  • локальных измерений
  • построения сцен с высокой производительностью

Плоскость определяется нормалью:

const plane = Cesium.Plane.fromPointNormal(cartesian, normal);

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

При построении маршрутов между двумя точками используется интерполяция по эллипсоиду, а не линейная интерполяция в 3D:

const positions = [];
for (let i = 0; i <= 100; i++) {
    const t = i / 100;
    const carto = geodesic.interpolateUsingFraction(t);
    positions.push(
        Cesium.Cartesian3.fromRadians(carto.longitude, carto.latitude)
    );
}

Такая траектория соответствует реальному кратчайшему пути по поверхности Земли.


Масштабирование и анизотропия эллипсоида

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

  • искажения расстояний в разных широтах
  • изменение масштаба при визуализации
  • поведение локальных систем координат

CesiumJS компенсирует эти эффекты через точные геодезические преобразования и матрицы перехода.


Использование эллипсоида в рендеринге сцены

Эллипсоид является фундаментом для:

  • расчёта глубины террейна
  • определения горизонта
  • отсечения невидимых областей
  • освещения поверхности

Камера в CesiumJS всегда ориентирована относительно центра эллипсоида, а не произвольной сцены, что обеспечивает глобальную согласованность координат.


Связь эллипсоида с временем и динамическими системами

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

  • эллипсоид как система отсчёта
  • инерциальные координаты для орбит
  • преобразования между фиксированными и динамическими системами

Это позволяет корректно отображать движение объектов относительно вращающейся Земли.


Геодезические ограничения и численная стабильность

При вычислениях на эллипсоиде возникают особенности:

  • потеря точности при больших расстояниях
  • вырожденные случаи на полюсах
  • необходимость нормализации векторов

CesiumJS использует устойчивые численные методы для предотвращения ошибок при глобальных вычислениях.