Интерполяция значений

Интерполяция в 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, интерполяция и обратное преобразование.

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

Производительность интерполяции

Интерполяция выполняется в реальном времени и может стать узким местом при большом количестве объектов. Оптимизация включает:

  • уменьшение числа сэмплов
  • использование более простых алгоритмов (Linear вместо Hermite)
  • предварительную фильтрацию данных
  • кэширование вычисленных значений

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

Интерполяция пользовательских свойств

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

const customProperty = new Cesium.Property();

customProperty.getValue = function(time) {
  return interpolateCustom(time);
};

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

Влияние интерполяции на визуальную стабильность

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

Баланс достигается выбором:

  • типа алгоритма
  • степени полинома
  • частоты сэмплов
  • наличия производных

Интерполяция в 3D ориентациях

Работа с вращениями требует особого подхода из-за нелинейной природы пространства кватернионов. CesiumJS использует сферическую интерполяцию:

(q_0, q_1, t) = q_0 + q_1

Это обеспечивает равномерное вращение без ускорений и скачков угловой скорости.


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