В основе временной модели CesiumJS лежит единая система управления временем, построенная вокруг объекта Clock. Этот механизм определяет, как сцена интерпретирует поток времени, как изменяется состояние анимации и с какой скоростью происходит перемещение динамических объектов.
Визуализация в CesiumJS часто опирается не на статичное изображение
сцены, а на непрерывную симуляцию. Центральным элементом этой системы
является Viewer.clock, представляющий собой экземпляр
Clock.
Clock управляет тремя ключевыми сущностями:
currentTime)clockStep)multiplier)Именно параметр multiplier является основным
инструментом управления скоростью воспроизведения.
Скорость воспроизведения задаётся через свойство:
viewer.clock.multiplier = 1.0;
Значение интерпретируется как коэффициент отношения к реальному времени:
1.0 — нормальная скорость (1 секунда симуляции = 1
секунда реального времени)2.0 — ускорение в 2 раза10.0 — ускоренная симуляция0.5 — замедлениеИзменение этого параметра мгновенно влияет на поведение всех тайм-динамических сущностей сцены, включая анимации CZML, перемещения камер и интерполяции позиций.
Использование отрицательных значений multiplier
переводит систему в режим обратного движения времени:
viewer.clock.multiplier = -5.0;
При этом необходимо учитывать состояние clockStep:
viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER;
или
viewer.clock.clockStep = Cesium.ClockStep.TICK_DEPENDENT;
Режим обратного воспроизведения требует корректной настройки
диапазона времени (clockRange), иначе симуляция может
остановиться на границах интервала.
Скорость воспроизведения тесно связана с режимом шага времени:
SYSTEM_CLOCK_MULTIPLIER — скорость зависит от реального
времени и multiplierTICK_DEPENDENT — скорость определяется количеством
тиков обновления сценыПри TICK_DEPENDENT значение multiplier
фактически масштабирует количество виртуального времени за один кадр,
что позволяет создавать более стабильные симуляции при нестабильном
FPS.
Контроль скорости невозможен без учета границ времени:
UNBOUNDED — бесконечное воспроизведениеCLAMPED — остановка на границах диапазонаLOOP_STOP — циклическое повторениеviewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
При высоких значениях multiplier режим
LOOP_STOP часто используется для непрерывных симуляций,
например движения спутников или авиационных траекторий.
Скорость воспроизведения может быть обнулена остановкой Clock:
viewer.clock.shouldAnimate = false;
и возобновлена:
viewer.clock.shouldAnimate = true;
Этот флаг не изменяет значение multiplier, но полностью
блокирует обновление симуляции.
Типичная конфигурация управления скоростью включает синхронизацию нескольких параметров:
viewer.clock.startTime = Cesium.JulianDate.fromIso8601("2024-01-01T00:00:00Z");
viewer.clock.currentTime = Cesium.JulianDate.fromIso8601("2024-01-01T00:00:00Z");
viewer.clock.stopTime = Cesium.JulianDate.fromIso8601("2024-01-02T00:00:00Z");
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
viewer.clock.multiplier = 60;
viewer.clock.shouldAnimate = true;
В данном случае одна секунда реального времени соответствует одной минуте симуляции.
Изменение скорости может происходить в реальном времени без перезапуска сцены:
function setSpeed(level) {
switch (level) {
case "slow":
viewer.clock.multiplier = 0.2;
break;
case "normal":
viewer.clock.multiplier = 1.0;
break;
case "fast":
viewer.clock.multiplier = 20.0;
break;
case "reverse":
viewer.clock.multiplier = -5.0;
break;
}
}
Такая схема применяется при создании интерфейсов управления симуляцией, где скорость должна изменяться мгновенно.
При увеличении multiplier возрастает нагрузка на систему
интерполяции временных рядов. CesiumJS автоматически адаптирует
вычисление позиций объектов, но при экстремальных значениях
возможны:
Особенно это проявляется при визуализации CZML-пакетов с редкими ключевыми кадрами.
Каждый тик Clock инициирует пересчет сцены через
Scene.render. При высоких значениях multiplier:
Поэтому управление скоростью часто сопровождается оптимизацией уровня детализации (LOD) и фильтрацией сущностей.
Практически применяемая стратегия заключается в ограничении
multiplier для предотвращения деградации
производительности:
viewer.clock.multiplier = Math.min(requestedSpeed, 100);
При этом верхняя граница зависит от:
В интерфейсах управления часто используется привязка к ползунку:
speedSlider.onin put = function () {
const value = parseFloat(this.value);
viewer.clock.multiplier = value;
};
Диапазон обычно строится логарифмически, чтобы обеспечить удобное управление как малыми, так и большими значениями.
При необходимости синхронизации с системным временем используется:
viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK;
viewer.clock.multiplier = 1.0;
В таком режиме управление скоростью становится ограниченным, так как Clock следует реальному времени, а не симуляционному шагу.
В сложных приложениях скорость может автоматически изменяться в зависимости от нагрузки:
Такая стратегия позволяет поддерживать стабильную визуализацию без ручного вмешательства.
Изменение скорости напрямую влияет на:
При резком изменении multiplier возможны скачки камеры, если анимация не привязана к фиксированному времени выполнения, а зависит от clock tick.