В основе всей системы анимации и воспроизведения данных лежит строгая модель времени, позволяющая отделить реальное системное время от симулируемого времени сцены. Это критично для работы с орбитами, треками движения, спутниковыми данными, историческими реконструкциями и прогнозами.
Ключевая идея заключается в том, что сцена не обязана жить в настоящем моменте: она может проигрывать прошлое, будущее или ускоренный/замедленный временной поток.
Clock представляет собой ядро временной системы CesiumJS и отвечает за:
Clock не зависит от реального времени напрямую. Он лишь обновляется в каждом кадре, используя системный таймер как источник тиков.
Текущее симулируемое время сцены.
JulianDateОпределяют временной диапазон симуляции:
startTime — начало интервалаstopTime — конец интервалаЭти значения формируют «рамку», внутри которой движется время сцены.
Определяет поведение при достижении границ:
UNBOUNDED — время может выходить за пределыCLAMPED — остановка на границеLOOP_STOP — зацикливание диапазонаПоведение LOOP_STOP часто используется для циклических анимаций орбит или повторяющихся процессов.
Определяет способ изменения времени:
SYSTEM_CLOCK_MULTIPLIER — ускорение относительно
реального времениTICK_DEPENDENT — шаг зависит от частоты кадровSYSTEM_CLOCK — синхронизация с системным временемПараметр multiplier задаёт коэффициент ускорения
симуляции:
1.0 — нормальная скорость10.0 — ускорение в 10 раз0.1 — замедлениеМеханизм работы основан на вычислении дельты между кадрами:
Таким образом достигается независимость от FPS и аппаратной производительности.
Флаг shouldAnimate управляет активностью временного
потока:
true — время автоматически обновляетсяfalse — симуляция «замораживается»Важно, что отключение анимации не останавливает рендеринг сцены. Остаётся возможность ручного управления временем через API.
CesiumJS не использует стандартный Date для
вычислений.
Вместо него применяется JulianDate, обеспечивающий:
JulianDate хранит время в виде:
dayNumbersecondsOfDayТакая схема позволяет выполнять арифметику времени без накопления ошибок, характерных для стандартных JavaScript-дат.
Clock сам по себе не содержит логики интерфейса. Для этого
используется ClockViewModel, который связывает модель
времени с UI-компонентами:
ClockViewModel синхронизирует:
Timeline представляет собой интерактивную шкалу времени, отображающую текущий интервал симуляции.
Основные функции Timeline:
Timeline работает как интерфейс над Clock, не изменяя логику времени напрямую, а лишь передавая команды в ClockViewModel.
Архитектурно связь строится следующим образом:
Любое изменение через Timeline приводит к:
Clock напрямую влияет на все time-dynamic сущности:
SampledPositionPropertyVelocityVectorPropertyTimeIntervalCollectionПри изменении currentTime происходит выбор актуального значения из временных рядов.
Пример поведения:
CesiumJS использует интерполяцию для непрерывного движения объектов.
Основные принципы:
Clock является триггером пересчёта, но не выполняет интерполяцию напрямую.
Clock может быть связан с системным временем:
Это позволяет создавать:
Временная система CesiumJS имеет несколько характерных особенностей:
Такая архитектура обеспечивает стабильность симуляций независимо от внешней среды.
Clock тесно связан с понятием интервалов времени:
Каждый интервал сравнивается с currentTime, определяя видимость и поведение объектов.
При каждом тике Clock выполняется цепочка:
Таким образом время является центральной осью всей системы обновления сцены.