Динамические сущности

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

В основе динамического поведения лежит концепция Entity API, где каждый объект сцены описывается набором свойств, часть из которых может зависеть от времени. Центральным механизмом синхронизации выступает Clock, определяющий текущее время, скорость его изменения и диапазон симуляции.

Ключевые элементы временной модели:

  • currentTime — текущее виртуальное время сцены
  • startTime / stopTime — границы интервала симуляции
  • multiplier — коэффициент скорости воспроизведения
  • shouldAnimate — флаг обновления сцены

Каждое изменение времени автоматически инициирует пересчёт всех динамических свойств сущностей, что обеспечивает согласованное обновление всей сцены.

Entity как контейнер динамических свойств

Сущность (Entity) в CesiumJS представляет собой контейнер, объединяющий визуальные и пространственные свойства. В отличие от низкоуровневых примитивов, Entity ориентирован на декларативное описание поведения объекта.

Структура сущности включает:

  • геометрические компоненты (точки, линии, полигоны)
  • 3D модели
  • маркеры и billboards
  • описание траектории
  • свойства, зависящие от времени

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

Динамические свойства и интерполяция

Основой анимации объектов выступают специализированные классы свойств, реализующие временную зависимость.

SampledPositionProperty

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

f(t) = (p_i, p_{i+1}, )

Где интерполяционный коэффициент определяется положением времени между двумя соседними ключевыми кадрами.

Особенности:

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

VelocityOrientationProperty

Позволяет вычислять ориентацию объекта на основе его скорости. Используется для корректного разворота 3D моделей вдоль траектории движения.

Ключевая идея заключается в вычислении касательного вектора к траектории движения и преобразовании его в кватернион ориентации.

Привязка к времени и Availability

Каждая динамическая сущность может иметь ограниченную область существования во времени. Это реализуется через свойство availability, которое определяет интервал активности объекта.

Поведение системы при выходе за пределы доступности:

  • объект не рендерится
  • вычисления свойств не выполняются
  • память под ключевые кадры может переиспользоваться

Это критично для потоковых данных, где объекты появляются и исчезают в зависимости от внешнего источника информации.

DataSource как уровень абстракции

Для управления множеством динамических объектов используется слой DataSource. Он инкапсулирует загрузку, обновление и синхронизацию сущностей.

Основные реализации:

  • GeoJsonDataSource — загрузка геопространственных данных
  • CZMLDataSource — потоковое описание сцен
  • Custom DataSource — пользовательские источники

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

CZML и потоковая динамика

CZML представляет собой JSON-формат, ориентированный на временные данные. Он описывает не только геометрию объекта, но и её эволюцию.

Пример логики CZML:

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

Это позволяет реализовывать сценарии:

  • движение транспорта в реальном времени
  • симуляцию спутников
  • визуализацию треков полётов

CallbackProperty и вычисляемая динамика

Для сценариев, где данные не дискретны, используется CallbackProperty. Это функция, которая вычисляет значение свойства на каждом кадре.

Основной принцип:

  • вход: текущее время
  • выход: значение свойства (позиция, цвет, геометрия)

Такой подход позволяет реализовать полностью процедурную анимацию, зависящую от внешних факторов.

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

Координация времени и сцены

Динамические сущности тесно связаны с механизмом рендеринга CesiumJS. Обновление происходит в следующем порядке:

  1. Обновление Clock
  2. Пересчёт временных свойств Entity
  3. Интерполяция значений
  4. Обновление графа сцены
  5. Рендеринг кадра

Синхронизация критична при работе с множеством объектов, особенно при потоковой передаче данных.

Траектории и путь движения

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

  • PathGraphics
  • SampledPositionProperty
  • временных ключевых кадров

Path позволяет визуализировать историю движения объекта, формируя след в пространстве. При этом длина и детализация пути могут зависеть от времени или скорости объекта.

Производительность динамических сцен

Работа с большим количеством динамических сущностей требует оптимизации:

  • уменьшение частоты семплирования координат
  • использование упрощённых моделей на дальних расстояниях
  • ограничение количества активных CallbackProperty
  • использование пакетных источников данных (CZML)

Критическим фактором является стоимость интерполяции и обновления свойств на каждом кадре.

Связь с 3D моделями

Динамические сущности могут управлять полноценными 3D моделями через ModelGraphics. В этом случае изменяются:

  • позиция
  • ориентация
  • масштаб
  • анимационные состояния модели

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

Временные стили и визуальные состояния

Помимо геометрии, динамике подвержены визуальные параметры:

  • цвет (ColorProperty)
  • прозрачность (ColorMaterialProperty)
  • видимость (ShowProperty)
  • толщина линий (ConstantProperty с временной логикой)

Это позволяет кодировать дополнительную информацию прямо в визуальном представлении сцены, например интенсивность события или уровень сигнала.

Потоковое обновление данных

CesiumJS поддерживает сценарии, в которых данные поступают непрерывно. В таких случаях сущности:

  • создаются и удаляются динамически
  • обновляют координаты без пересоздания
  • синхронизируются с внешними API

Такой подход используется при визуализации:

  • GPS-треков
  • телеметрии
  • движения авиации и судов
  • IoT-данных в геопространстве