В основе всей пространственной математики в CesiumJS лежит модель вращающегося эллипсоида, приближающего форму Земли. В отличие от сферы, эллипсоид учитывает сплюснутость планеты у полюсов, что критически важно для корректных вычислений координат, расстояний и направлений на глобальных сценах.
Наиболее распространённой моделью является WGS84, задающая параметры полуосей:
CesiumJS использует эту модель как стандартную через класс
Ellipsoid, предоставляющий методы преобразований и
геодезических вычислений.
Эллипсоид вращения задаётся уравнением:
[ + + = 1]
где:
В CesiumJS это соответствует объекту:
const ellipsoid = Cesium.Ellipsoid.WGS84;
Стандартные параметры WGS84:
Эта модель используется во всех геодезических преобразованиях библиотеки.
CesiumJS оперирует двумя основными представлениями координат:
Прямоугольная система координат в пространстве Земли:
const cartesian = new Cesium.Cartesian3(1000, 2000, 3000);
Эта система называется Earth-Centered Earth-Fixed (ECEF).
Представление в виде:
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());
Эта нормаль используется для:
Для работы в локальных областях используется система ENU (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 использует устойчивые численные методы для предотвращения ошибок при глобальных вычислениях.