Интерполяция в CesiumJS используется для вычисления промежуточных значений между дискретно заданными точками во времени или пространстве. Основная область применения — динамические сцены, где объекты перемещаются, изменяют ориентацию, масштаб или любые другие свойства в зависимости от времени. Вместо хранения полного набора состояний для каждого момента времени используются выборки (samples), между которыми значения восстанавливаются алгоритмически.
В CesiumJS большинство динамических параметров описывается через
привязку к времени с использованием типа JulianDate. Такой
подход позволяет точно задавать изменения состояния объекта в
непрерывной временной шкале.
Ключевым механизмом выступает SampledProperty, который
хранит набор значений, привязанных к временным меткам, и предоставляет
интерфейс для интерполяции между ними.
const property = new Cesium.SampledProperty(Cesium.Cartesian3);
property.addSample(
Cesium.JulianDate.fromIso8601("2026-01-01T00:00:00Z"),
Cesium.Cartesian3.fromDegrees(30.5, 50.4, 1000)
);
property.addSample(
Cesium.JulianDate.fromIso8601("2026-01-01T01:00:00Z"),
Cesium.Cartesian3.fromDegrees(31.0, 50.6, 1500)
);
Между двумя заданными точками Cesium автоматически вычисляет промежуточное положение в зависимости от текущего времени сцены.
CesiumJS предоставляет несколько алгоритмов интерполяции, применяемых к временным рядам. Выбор алгоритма влияет на характер движения: линейность, гладкость, наличие производных.
Линейная интерполяция является базовым вариантом. Она вычисляет значение как взвешенную сумму двух соседних точек.
y = (1 - t) y_0 + t y_1
В CesiumJS она используется по умолчанию для большинства типов,
включая Cartesian3.
property.setInterpolationOptions({
interpolationAlgorithm: Cesium.LinearApproximation
});
Линейный метод обеспечивает предсказуемое поведение, но может создавать визуально «ломаные» траектории при резких изменениях направления.
Метод Лагранжа строит гладкую кривую, проходящую через несколько контрольных точек. В CesiumJS он применяется для повышения плавности движения.
property.setInterpolationOptions({
interpolationDegree: 5,
interpolationAlgorithm: Cesium.LagrangePolynomialApproximation
});
Полиномиальная интерполяция особенно полезна при моделировании траекторий, где требуется непрерывность высокой степени. Однако увеличение степени полинома может приводить к эффекту осцилляций (эффект Рунге).
Эрмитова интерполяция учитывает не только значения, но и производные (скорости). В CesiumJS это особенно важно для объектов с физически корректным движением.
H(t) = (2t^3 - 3t^2 + 1)y_0 + (t^3 - 2t^2 + t)m_0 + (-2t^3 + 3t^2)y_1 + (t^3 - t^2)m_1
Где ( y_0, y_1 ) — значения функции, а ( m_0, m_1 ) — производные в точках.
property.setInterpolationOptions({
interpolationAlgorithm: Cesium.HermitePolynomialApproximation
});
Эрмитова модель часто используется для интерполяции ориентаций
(Quaternion) и скоростей движения объектов.
CesiumJS поддерживает интерполяцию различных типов данных, включая:
Cartesian3 — позиции в 3D пространствеQuaternion — ориентацияCartographic — географические координатыNumber)Для ориентаций используется сферическая интерполяция (SLERP), которая сохраняет нормализацию кватернионов и обеспечивает равномерное вращение.
const orientation = new Cesium.SampledProperty(Cesium.Quaternion);
orientation.addSample(time1, quat1);
orientation.addSample(time2, quat2);
При вычислении промежуточных значений Cesium автоматически применяет SLERP вместо линейной интерполяции в евклидовом пространстве.
Точность интерполяции напрямую зависит от плотности временных выборок. При редких сэмплах даже сложные алгоритмы дают упрощённую траекторию.
CesiumJS позволяет регулировать:
property.addSample(time, value);
property.addSample(time.addMinutes(5), value2);
property.addSample(time.addMinutes(6), value3);
Сгущение точек часто применяется при резких манёврах объектов, чтобы избежать визуальных артефактов.
Некоторые алгоритмы CesiumJS используют не только значения, но и производные, такие как скорость и ускорение. Это позволяет строить более физически реалистичные траектории.
Для SampledPositionProperty возможно автоматическое
вычисление скорости:
const position = new Cesium.SampledPositionProperty();
position.setInterpolationOptions({
interpolationAlgorithm: Cesium.HermitePolynomialApproximation,
interpolationDegree: 2
});
Если производные не заданы явно, Cesium может их аппроксимировать численно на основе соседних значений.
Интерполяция в CesiumJS применяется только внутри интервала между известными точками. За его пределами используется экстраполяция.
Типы поведения:
NONE — значение не вычисляетсяHOLD — удержание последнего значенияEXTRAPOLATE — продолжение трендаproperty.setExtrapolationOptions({
extrapolationType: Cesium.ExtrapolationType.HOLD,
forwardExtrapolationType: Cesium.ExtrapolationType.EXTRAPOLATE
});
Экстраполяция особенно важна для потоковых данных, где новые сэмплы поступают с задержкой.
CesiumJS синхронизирует интерполяцию с глобальным временем сцены
(Clock). Каждый тик обновляет текущее значение свойств,
зависящих от времени.
viewer.clock.currentTime = Cesium.JulianDate.now();
viewer.clock.multiplier = 10;
viewer.clock.shouldAnimate = true;
При каждом обновлении сцены происходит пересчёт интерполированных
значений всех активных Property.
В реальных сценариях свойства часто комбинируются: позиция, ориентация и масштаб изменяются одновременно. CesiumJS обеспечивает согласованную интерполяцию между различными типами данных через entity system.
entity.position = positionProperty;
entity.orientation = orientationProperty;
Согласованность временной шкалы гарантирует, что все свойства вычисляются для одного и того же момента времени.
При работе с Cartographic (широта, долгота, высота)
линейная интерполяция может приводить к искажению траектории на
поверхности эллипсоида. Для корректного поведения часто используется
перевод в Cartesian3, интерполяция и обратное
преобразование.
Такой подход позволяет учитывать кривизну Земли и избегать артефактов при пересечении меридианов и полюсов.
Интерполяция выполняется в реальном времени и может стать узким местом при большом количестве объектов. Оптимизация включает:
CesiumJS использует внутренние оптимизации, включая переиспользование буферов и минимизацию аллокаций при вычислении промежуточных значений.
CesiumJS позволяет создавать собственные типы интерполируемых свойств. Для этого необходимо определить метод интерполяции вручную.
const customProperty = new Cesium.Property();
customProperty.getValue = function(time) {
return interpolateCustom(time);
};
При необходимости можно встроить собственную математическую модель, включая сплайны, фильтры или физические симуляции.
Качество интерполяции напрямую влияет на восприятие движения. Недостаточная гладкость приводит к дрожанию объектов, особенно при высоких скоростях камеры. Избыточная сглаженность может скрывать важные динамические изменения.
Баланс достигается выбором:
Работа с вращениями требует особого подхода из-за нелинейной природы пространства кватернионов. CesiumJS использует сферическую интерполяцию:
(q_0, q_1, t) = q_0 + q_1
Это обеспечивает равномерное вращение без ускорений и скачков угловой скорости.
Интерполяция в CesiumJS представляет собой связующий механизм между дискретными данными и непрерывной визуальной моделью времени и пространства, обеспечивая согласованное поведение геометрии, анимации и физических параметров сцены.