You need to enable JavaScript to run this app. 如何在Cesium JS中创建独立时钟并通过自定义控件控制
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cesium JS中创建独立时钟并通过自定义控件控制

Cesium自定义Clock控制实体路径动画不生效问题解决方案

问题根源

你当前的实现存在三个核心问题,导致动画没有触发:

  • 自定义Clock仅完成了实例化,没有和Cesium的帧渲染循环绑定,独立Clock的时间不会自动步进更新
  • Cesium实体的路径插值默认以viewer.clock.currentTime作为时间基准,你没有把自定义Clock的时间同步给viewer,实体位置不会随自定义时钟更新
  • 按钮控制逻辑错误,Start和Stop都调用同一个暂停切换命令,无法正确控制播放状态

修正方案

1. 绑定自定义时钟到帧渲染循环

在初始化自定义Clock后,添加帧监听事件,每帧手动更新自定义时钟时间,并同步到viewer,驱动实体插值计算:

// 先禁用viewer自带时钟的自动动画,避免时间冲突
viewer.clock.shouldAnimate = false;

var start = Cesium.JulianDate.fromDate(new Date(2015, 2, 25, 16));
var stop = Cesium.JulianDate.addSeconds(
  start,
  360,
  new Cesium.JulianDate()
);

var clock = new Cesium.Clock();
clock.startTime = start.clone();
clock.stopTime = stop.clone();
clock.currentTime = start.clone();
clock.clockRange = Cesium.ClockRange.LOOP_STOP;
clock.multiplier = 10;
clock.shouldAnimate = true;
var clockViewModel = new Cesium.ClockViewModel(clock);
var viewModel = new Cesium.AnimationViewModel(clockViewModel);

// 关键:绑定渲染事件,每帧更新自定义时钟并同步到viewer
viewer.scene.postRender.addEventListener(() => {
  if (!clock.shouldAnimate) return;
  // 手动更新自定义时钟时间
  const currentTime = clock.tick();
  // 同步时间到viewer,驱动实体位置插值
  viewer.clock.currentTime = currentTime;
});

2. 修正按钮控制逻辑

分别对应播放、暂停状态设置时钟属性:

Sandcastle.addDefaultToolbarButton("Start", function () {
  clock.shouldAnimate = true;
});

Sandcastle.addDefaultToolbarButton("Stop", function () {
  clock.shouldAnimate = false;
});

内容的提问来源于stack exchange,提问作者Jacky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 09:54:05