You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cesium时钟动画结束后模型显示问题及实时车辆轨迹回放需求

Cesium轨迹回放:解决模型消失、播放不连续问题

一、动画结束模型消失的原因及解决

你代码里用SampledPositionProperty存储轨迹点,但如果车辆实体绑定这个属性作为位置,时钟走到最后一个采样点后,SampledPositionProperty默认不会返回位置,导致实体消失。当前代码只添加了固定位置的蓝色轨迹点,这些点不会消失,推测你实际有绑定3D模型的实体但没贴出来。

修复步骤:

  1. 给位置属性设置外推规则
    让SampledPositionProperty在超出采样时间后保持最后一个位置:
const positionProperty = new Cesium.SampledPositionProperty();
// 线性插值让轨迹移动更平滑
positionProperty.setInterpolationOptions({
  interpolationDegree: 1,
  interpolationAlgorithm: Cesium.LinearApproximation
});
// 开启向前外推,永久保持最后位置
positionProperty.forwardExtrapolationType = Cesium.ExtrapolationType.HOLD;
positionProperty.forwardExtrapolationDuration = Number.POSITIVE_INFINITY;
  1. 给车辆实体设置足够长的可用时间
    如果创建了车辆模型实体,确保它的availability覆盖回放和等待数据的时段:
const vehicle = viewer.entities.add({
  position: positionProperty,
  model: { uri: '你的车辆模型路径.glb' },
  availability: new Cesium.TimeIntervalCollection([
    new Cesium.TimeInterval({
      start: start,
      // 设一个足够长的结束时间,或后续动态更新
      stop: Cesium.JulianDate.addHours(start, 24, new Cesium.JulianDate())
    })
  ])
});

二、实现实时回放+等待数据时模型持续显示

1. 动态添加实时数据

如果是实时获取轨迹数据,新数据到来时动态添加到positionProperty,同时更新时钟结束时间:

// 实时数据回调示例
function addNewTrackPoint(newData) {
  const time = Cesium.JulianDate.fromIso8601(newData.time);
  const position = Cesium.Cartesian3.fromDegrees(
    newData.longitude,
    newData.latitude,
    newData.height
  );
  positionProperty.addSample(time, position);
  // 更新时钟结束时间,让动画能继续播放到新数据时间
  viewer.clock.stopTime = time.clone();
  viewer.timeline.zoomTo(start, viewer.clock.stopTime);
}

2. 优化播放连续性

  • 用线性插值(LinearApproximation)减少轨迹跳变,避免播放卡顿;
  • 确保flightData的时间戳是连续递增的,避免时间顺序混乱导致跳帧;
  • 如果数据间隔过大,可适当降低viewer.clock.multiplier,或补全中间位置数据。

三、修正现有代码的细节问题

你当前手动设置的start和stop可能和实际数据时间不匹配,建议用数据本身的时间计算:

const start = Cesium.JulianDate.fromIso8601(flightData[0].time);
const totalSeconds = timeStepInSeconds * (flightData.length - 1);
const stop = Cesium.JulianDate.addSeconds(start, totalSeconds, new Cesium.JulianDate());

viewer.clock.startTime = start.clone();
viewer.clock.stopTime = stop.clone();
viewer.timeline.zoomTo(start, stop);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:41:09