Clock и временная шкала

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

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


Clock как центральный механизм управления временем

Clock представляет собой ядро временной системы CesiumJS и отвечает за:

  • текущее значение симулируемого времени
  • скорость его изменения
  • направление воспроизведения
  • границы временного интервала
  • режим поведения при достижении границ

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

Основные параметры Clock

currentTime

Текущее симулируемое время сцены.

  • Тип: JulianDate
  • Используется во всех временных вычислениях
  • Обновляется автоматически при анимации

startTime и stopTime

Определяют временной диапазон симуляции:

  • startTime — начало интервала
  • stopTime — конец интервала

Эти значения формируют «рамку», внутри которой движется время сцены.

clockRange

Определяет поведение при достижении границ:

  • UNBOUNDED — время может выходить за пределы
  • CLAMPED — остановка на границе
  • LOOP_STOP — зацикливание диапазона

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

clockStep

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

  • SYSTEM_CLOCK_MULTIPLIER — ускорение относительно реального времени
  • TICK_DEPENDENT — шаг зависит от частоты кадров
  • SYSTEM_CLOCK — синхронизация с системным временем

Скорость времени и multiplier

multiplier

Параметр multiplier задаёт коэффициент ускорения симуляции:

  • 1.0 — нормальная скорость
  • 10.0 — ускорение в 10 раз
  • 0.1 — замедление
  • отрицательные значения — обратное движение времени

Механизм работы основан на вычислении дельты между кадрами:

  • берётся разница системного времени между кадрами
  • умножается на multiplier
  • добавляется к текущему симулируемому времени

Таким образом достигается независимость от FPS и аппаратной производительности.


Роль shouldAnimate

Флаг shouldAnimate управляет активностью временного потока:

  • true — время автоматически обновляется
  • false — симуляция «замораживается»

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


JulianDate как базовый тип времени

CesiumJS не использует стандартный Date для вычислений.

Вместо него применяется JulianDate, обеспечивающий:

  • высокую точность (вплоть до наносекундных вычислений)
  • корректную работу с астрономическими моделями
  • отсутствие проблем с временными зонами и переходами DST

Структура JulianDate

JulianDate хранит время в виде:

  • dayNumber
  • secondsOfDay

Такая схема позволяет выполнять арифметику времени без накопления ошибок, характерных для стандартных JavaScript-дат.


ClockViewModel и связь с UI

Clock сам по себе не содержит логики интерфейса. Для этого используется ClockViewModel, который связывает модель времени с UI-компонентами:

  • кнопки play/pause
  • ускорение/замедление
  • поле текущего времени
  • управление интервалом

ClockViewModel синхронизирует:

  • Clock
  • Timeline widget
  • пользовательские элементы управления

Timeline: визуализация временной шкалы

Timeline представляет собой интерактивную шкалу времени, отображающую текущий интервал симуляции.

Основные функции Timeline:

  • визуальное отображение startTime и stopTime
  • перемещение текущего времени
  • масштабирование временного интервала
  • синхронизация с Clock

Timeline работает как интерфейс над Clock, не изменяя логику времени напрямую, а лишь передавая команды в ClockViewModel.


Связь Clock и Timeline

Архитектурно связь строится следующим образом:

  • Clock хранит состояние времени
  • ClockViewModel управляет логикой
  • Timeline отображает и изменяет состояние

Любое изменение через Timeline приводит к:

  1. обновлению currentTime в Clock
  2. перерасчёту сцены
  3. перерисовке объектов с временными свойствами

Временные свойства объектов сцены

Clock напрямую влияет на все time-dynamic сущности:

  • SampledPositionProperty
  • VelocityVectorProperty
  • TimeIntervalCollection
  • CZML-данные

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

Пример поведения:

  • объект имеет траекторию с точками времени
  • Clock задаёт текущий момент
  • система интерполирует положение между ближайшими значениями

Интерполяция и временные выборки

CesiumJS использует интерполяцию для непрерывного движения объектов.

Основные принципы:

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

Clock является триггером пересчёта, но не выполняет интерполяцию напрямую.


Режимы воспроизведения времени

Нормальное воспроизведение

  • multiplier > 0
  • время движется вперёд
  • используется в большинстве симуляций

Обратное воспроизведение

  • multiplier < 0
  • применяется для анализа траекторий и событий

Циклическое воспроизведение

  • clockRange = LOOP_STOP
  • время возвращается к startTime после stopTime

Синхронизация с реальным временем

Clock может быть связан с системным временем:

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

Это позволяет создавать:

  • live-симуляции спутников
  • отображение текущих погодных моделей
  • потоковые геоданные

Ограничения и особенности модели

Временная система CesiumJS имеет несколько характерных особенностей:

  • полная независимость от JavaScript Date в вычислениях
  • обязательная дискретизация по кадрам рендеринга
  • отсутствие глобального времени внутри сцены
  • управление временем только через Clock

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


Использование временных интервалов

Clock тесно связан с понятием интервалов времени:

  • интервалы определяют активность объектов
  • позволяют включать/выключать сущности по времени
  • используются в CZML и динамических слоях

Каждый интервал сравнивается с currentTime, определяя видимость и поведение объектов.


Обновление сцены при изменении времени

При каждом тике Clock выполняется цепочка:

  1. вычисление нового currentTime
  2. обновление всех time-dependent свойств
  3. пересчёт позиций объектов
  4. обновление камеры при необходимости
  5. рендеринг кадра

Таким образом время является центральной осью всей системы обновления сцены.