SampledProperty

В системе динамической визуализации времени в CesiumJS ключевую роль играет механизм временных свойств (time-dynamic properties), позволяющий описывать изменение значений во времени без ручного пересчёта состояния сцены на каждом кадре. Одним из базовых строительных блоков этой системы является SampledProperty, предназначенный для хранения дискретных временных выборок и интерполяции значений между ними.


SampledProperty реализует концепцию «набор значений во времени + правило интерполяции». В отличие от статических свойств, где значение фиксировано, данный тип описывает функцию:

  • дискретные точки времени (samples)
  • значения в этих точках
  • алгоритм восстановления промежуточных значений

Формально поведение можно представить как функцию:

[ f(t) = interpolate((t_i, v_i))]

где (t_i) — моменты времени, (v_i) — значения.


Структура и назначение

SampledProperty используется внутри системы Property и совместим с объектами:

  • Entity
  • визуальными примитивами
  • анимационными источниками данных (траектории, модели, ориентация)

Основная задача — обеспечить плавное изменение параметров:

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

Конструктор SampledProperty

Базовая инициализация создаёт контейнер для временных значений:

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);

выполняются следующие шаги:

  1. Поиск ближайших временных точек (t_i t t_{i+1})
  2. Выбор интерполятора
  3. Вычисление промежуточного значения

Для числовых типов по умолчанию используется линейная интерполяция:

[ v(t) = v_0 + (v_1 - v_0)]


Интерполяционные режимы

SampledProperty поддерживает настройку поведения интерполяции:

property.setInterpolationOptions({
  interpolationDegree: 2,
  interpolationAlgorithm: Cesium.LagrangePolynomialApproximation
});

Основные алгоритмы:

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

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

Лагранжева интерполяция

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

Hermite-интерполяция

  • учитывает производные (скорость изменения)
  • применяется в анимации движения объектов

Работа с векторными значениями

Для 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));

Результат:

  • плавное движение вдоль оси X
  • независимая интерполяция каждой координаты

Для более сложных случаев (например, ориентация) используется специализированная логика через Quaternion.


SampledProperty и ориентация объектов

При работе с вращением:

const orientation = new Cesium.SampledProperty(Cesium.Quaternion);

данные интерполируются через сферическую интерполяцию (SLERP), а не линейную:

  • предотвращается искажение вращения
  • сохраняется постоянная угловая скорость
  • обеспечивается корректная 3D-анимация

Взаимодействие с Entity системой

SampledProperty часто используется внутри Entity:

entity.position = new Cesium.SampledProperty(Cesium.Cartesian3);

В этом случае движок Cesium:

  • запрашивает значение на каждом кадре
  • использует текущее время Clock.currentTime
  • обновляет визуализацию автоматически

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


Роль времени и Clock

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

  • JulianDate — универсального представления времени
  • Clock — источника текущего времени сцены
viewer.clock.currentTime

При изменении времени:

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

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

При работе с большим количеством выборок возникают важные аспекты:

1. Частота сэмплирования

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

2. Кэширование интерполяции

Cesium кеширует вычисленные значения при повторных запросах одного времени.

3. Упрощение траекторий

Для движения объектов часто применяется редукция точек:

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

Использование для моделирования движения

Типичный сценарий — описание траектории объекта:

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;

Результат:

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

Комбинация с другими Property

SampledProperty часто используется совместно с:

  • ConstantProperty — фиксированные значения
  • CompositeProperty — композиция нескольких источников
  • TimeIntervalCollectionProperty — интервальные модели

Так формируется гибкая система описания поведения объектов во времени.


Поведение при выходе за диапазон

Если запрашиваемое время:

  • меньше первого сэмпла — возвращается первое значение
  • больше последнего — возвращается последнее значение

Это предотвращает разрыв анимации и обеспечивает стабильность сцены.


Особенности численных расчётов

При интерполяции учитываются:

  • точность JulianDate
  • масштаб временных интервалов
  • тип данных

При слишком плотных интервалах возможны:

  • накопление погрешностей
  • снижение производительности из-за частых вычислений

Применение в симуляциях

SampledProperty используется в моделях:

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

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


Архитектурная роль в Cesium

SampledProperty является связующим звеном между:

  • временной моделью (JulianDate)
  • системой сущностей (Entity)
  • рендерингом сцены (WebGL pipeline)

Он обеспечивает абстракцию:

«время → значение → визуальное состояние»

без необходимости ручного управления кадрами и обновлениями.