В системе динамической визуализации времени в CesiumJS ключевую роль
играет механизм временных свойств (time-dynamic properties), позволяющий
описывать изменение значений во времени без ручного пересчёта состояния
сцены на каждом кадре. Одним из базовых строительных блоков этой системы
является SampledProperty, предназначенный для хранения
дискретных временных выборок и интерполяции значений между ними.
SampledProperty реализует концепцию «набор значений во
времени + правило интерполяции». В отличие от статических свойств, где
значение фиксировано, данный тип описывает функцию:
Формально поведение можно представить как функцию:
[ f(t) = interpolate((t_i, v_i))]
где (t_i) — моменты времени, (v_i) — значения.
SampledProperty используется внутри системы
Property и совместим с объектами:
EntityОсновная задача — обеспечить плавное изменение параметров:
Базовая инициализация создаёт контейнер для временных значений:
const property = new Cesium.SampledProperty(Number);
Параметр конструктора определяет тип значений:
Number — скалярные величиныCartesian3 — 3D-векторыQuaternion — вращенияColor — цветовые значенияТип строго влияет на выбор интерполятора и поведение при вычислениях.
Основной метод заполнения — addSample:
property.addSample(
Cesium.JulianDate.fromIso8601("2024-01-01T00:00:00Z"),
10
);
property.addSample(
Cesium.JulianDate.fromIso8601("2024-01-01T01:00:00Z"),
20
);
Каждая выборка состоит из:
JulianDateВнутренне данные сохраняются в отсортированной структуре по времени, что обеспечивает быстрый поиск интервала.
При запросе значения в произвольный момент времени:
const value = property.getValue(time);
выполняются следующие шаги:
Для числовых типов по умолчанию используется линейная интерполяция:
[ v(t) = v_0 + (v_1 - v_0)]
SampledProperty поддерживает настройку поведения
интерполяции:
property.setInterpolationOptions({
interpolationDegree: 2,
interpolationAlgorithm: Cesium.LagrangePolynomialApproximation
});
Основные алгоритмы:
Для Cartesian3 интерполяция применяется
покомпонентно:
const position = new Cesium.SampledProperty(Cesium.Cartesian3);
position.addSample(time1, new Cesium.Cartesian3(0, 0, 0));
position.addSample(time2, new Cesium.Cartesian3(100, 0, 0));
Результат:
Для более сложных случаев (например, ориентация) используется
специализированная логика через Quaternion.
При работе с вращением:
const orientation = new Cesium.SampledProperty(Cesium.Quaternion);
данные интерполируются через сферическую интерполяцию (SLERP), а не линейную:
SampledProperty часто используется внутри
Entity:
entity.position = new Cesium.SampledProperty(Cesium.Cartesian3);
В этом случае движок Cesium:
Clock.currentTimeТаким образом формируется непрерывная анимация без ручного управления циклом рендеринга.
Временная модель зависит от:
JulianDate — универсального представления времениClock — источника текущего времени сценыviewer.clock.currentTime
При изменении времени:
SampledPropertyПри работе с большим количеством выборок возникают важные аспекты:
Избыточное количество точек ухудшает производительность без заметного улучшения качества.
Cesium кеширует вычисленные значения при повторных запросах одного времени.
Для движения объектов часто применяется редукция точек:
Типичный сценарий — описание траектории объекта:
const position = new Cesium.SampledProperty(Cesium.Cartesian3);
position.addSample(t0, Cesium.Cartesian3.fromDegrees(0, 0));
position.addSample(t1, Cesium.Cartesian3.fromDegrees(10, 0));
position.addSample(t2, Cesium.Cartesian3.fromDegrees(20, 10));
entity.position = position;
Результат:
SampledProperty часто используется совместно с:
ConstantProperty — фиксированные значенияCompositeProperty — композиция нескольких
источниковTimeIntervalCollectionProperty — интервальные
моделиТак формируется гибкая система описания поведения объектов во времени.
Если запрашиваемое время:
Это предотвращает разрыв анимации и обеспечивает стабильность сцены.
При интерполяции учитываются:
JulianDateПри слишком плотных интервалах возможны:
SampledProperty используется в моделях:
В каждом случае данные представляют собой временной ряд, где ключевым является не только значение, но и его динамика.
SampledProperty является связующим звеном между:
JulianDate)Entity)Он обеспечивает абстракцию:
«время → значение → визуальное состояние»
без необходимости ручного управления кадрами и обновлениями.