Расчёты на эллипсоиде

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

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


Эллипсоид WGS84 как основа вычислений

Эллипсоид в CesiumJS задаётся полуосями:

  • экваториальная полуось (a)
  • полярная полуось (b)

Модель WGS84:

  • a ≈ 6378137.0 м
  • b ≈ 6356752.314245 м

В коде CesiumJS используется объект Ellipsoid, чаще всего Ellipsoid.WGS84.

const ellipsoid = Cesium.Ellipsoid.WGS84;

Эллипсоид определяет геометрию преобразований:

  • Cartesian3 ↔︎ Cartographic
  • нормали поверхности
  • проекции на поверхность
  • геодезические маршруты

Пространственные системы координат

Декартова система (Cartesian3)

Используется для внутренней математики WebGL и сцены:

const cartesian = new Cesium.Cartesian3(1.0, 2.0, 3.0);

Географическая система (Cartographic)

Определяется долготой, широтой и высотой:

const cartographic = new Cesium.Cartographic(
    Cesium.Math.toRadians(37.6173),
    Cesium.Math.toRadians(55.7558),
    0
);

Преобразования:

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

const cartographic = Cesium.Cartographic.fromCartesian(cartesian);

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

На эллипсоиде расстояние между двумя точками не является прямой линией в пространстве. Используется геодезическая линия — кратчайший путь по поверхности.

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

const start = Cesium.Cartographic.fromDegrees(0.0, 0.0);
const end = Cesium.Cartographic.fromDegrees(30.0, 40.0);

const geodesic = new Cesium.EllipsoidGeodesic(start, end);
const distance = geodesic.surfaceDistance;

EllipsoidGeodesic и параметры дуги

Объект EllipsoidGeodesic оперирует нормализованной параметризацией пути.

Основные свойства:

  • surfaceDistance — длина дуги по поверхности
  • startHeading — начальный азимут
  • endHeading — конечный азимут
console.log(geodesic.surfaceDistance);
console.log(geodesic.startHeading);
console.log(geodesic.endHeading);

Азимут определяется относительно северного направления по локальной касательной плоскости эллипсоида.


Интерполяция точек вдоль геодезической линии

CesiumJS позволяет получать промежуточные точки на геодезической линии через параметр t ∈ [0, 1].

const result = new Cesium.Cartographic();

for (let i = 0; i <= 10; i++) {
    const t = i / 10;
    geodesic.interpolateUsingFraction(t, result);

    const lon = Cesium.Math.toDegrees(result.longitude);
    const lat = Cesium.Math.toDegrees(result.latitude);
}

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

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

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

Линейная интерполяция в Cartesian3:

const lerp = Cesium.Cartesian3.lerp(a, b, t, new Cesium.Cartesian3());

Проблема подхода:

  • линия проходит через тело Земли
  • искажает расстояния на поверхности
  • не соответствует маршрутам на сфере или эллипсоиде

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

  • следует поверхности эллипсоида
  • сохраняет реальную длину пути
  • корректна для навигации

Проекция точки на поверхность эллипсоида

Для приведения произвольной точки к поверхности используется:

const onSurf ace = ellipsoid.scaleToGeodeticSurface(cartesian);

Функция:

  • нормализует радиус-вектор
  • учитывает форму эллипсоида
  • возвращает ближайшую точку на поверхности

Пример нормали:

const normal = ellipsoid.geocentricSurfaceNormal(cartesian);

Нормаль важна для:

  • освещения
  • ориентации объектов
  • построения локальных систем координат

Геодезические направления и азимуты

Азимут на эллипсоиде отличается от плоской геометрии. В CesiumJS направление вычисляется через геодезическую задачу между двумя точками.

const geodesic = new Cesium.EllipsoidGeodesic(start, end);

const initialBearing = geodesic.startHeading;
const finalBearing = geodesic.endHeading;

Поведение:

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

Разбиение геодезической линии на сегменты

Для визуализации длинных маршрутов используется дискретизация:

const positions = [];

for (let i = 0; i <= 50; i++) {
    const t = i / 50;
    const p = new Cesium.Cartographic();
    geodesic.interpolateUsingFraction(t, p);

    positions.push(
        Cesium.Cartesian3.fromRadians(p.longitude, p.latitude)
    );
}

Эти сегменты затем используются в:

  • PolylineGeometry
  • Entity polyline
  • GPU-тесселяции

Численная устойчивость вычислений

При работе с эллипсоидом возникают особенности:

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

CesiumJS компенсирует это через:

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

Работа с большими расстояниями

На глобальных масштабах эллипсоидальная геометрия демонстрирует значительные отличия от плоской:

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

Пример вычисления маршрута между континентами:

const a = Cesium.Cartographic.fromDegrees(-74.0, 40.7);
const b = Cesium.Cartographic.fromDegrees(139.7, 35.6);

const geo = new Cesium.EllipsoidGeodesic(a, b);
console.log(geo.surfaceDistance);

Использование эллипсоида в локальных преобразованиях

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

  • tangent space (касательная плоскость)
  • east-north-up (ENU)
  • преобразование нормалей поверхности

Пример базового преобразования:

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

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


Геометрия касательных плоскостей

Касательная плоскость определяется в точке на эллипсоиде и служит локальной аппроксимацией поверхности.

Компоненты:

  • нормаль (Up)
  • касательная (East)
  • ортогональная касательная (North)

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

  • размещения 3D-моделей
  • навигационных визуализаций
  • локальных измерений углов

Взаимосвязь геометрии и рендеринга

Геодезические вычисления напрямую влияют на визуализацию:

  • полилинии разбиваются по дугам эллипсоида
  • высота интерполируется отдельно от поверхности
  • нормали влияют на освещение terrain и tileset

При рендеринге глобуса используется комбинация:

  • геодезической математики
  • WebGL трансформаций
  • плиточной модели поверхности

Вычислительная модель поверхности

Поверхность эллипсоида в CesiumJS является математической абстракцией, поверх которой накладываются:

  • terrain tiles
  • imagery layers
  • 3D Tiles

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

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