原文链接及内容

示例介绍:通过时间间隔集合(TimeIntervalCollection),代码在特定时间段内加载不同的点云文件,并与 Cesium 的时钟和时间轴同步,实现动态播放效果。效果如下图所示:

注:TimeDynamicPointCloud是Cesium的高级功能,支持时间动态的点云渲染。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
const viewer = new Cesium.Viewer("cesiumContainer", {
geocoder: false,
homeButton: false,
navigationHelpButton: false,
navigationInstructionsInitiallyVisible: false,
animation: false,
timeline: false,
fullscreenButton: false,
skyBox: false,
sceneModePicker: false,
baseLayerPicker: false,
selectionIndicator: false,

shouldAnimate: true,
});
viewer.cesiumWidget.creditContainer.style.display = "none";

/**
* 定义 6 个时间点(ISO 8601 格式).
* 从 2018-07-19 15:18:00 到 15:18:02.5,每 0.5 秒一个间隔。
*/
const dates = [
"2018-07-19T15:18:00Z",
"2018-07-19T15:18:00.5Z",
"2018-07-19T15:18:01Z",
"2018-07-19T15:18:01.5Z",
"2018-07-19T15:18:02Z",
"2018-07-19T15:18:02.5Z",
];

/**
* 定义 5 个点云文件(.pnts 格式),路径指向示例数据目录,
* .pnts 是 Cesium 的点云格式
*/
const uris = [
"../SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/0.pnts",
"../SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/1.pnts",
"../SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/2.pnts",
"../SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/3.pnts",
"../SampleData/Cesium3DTiles/PointCloud/PointCloudTimeDynamic/4.pnts",
];

// 为每个时间间隔返回对应的点云文件 URI
function dataCallback(interval, index) {
return {
uri: uris[index],
};
}

/**
* 通过 TimeDynamicPointCloud 和 TimeIntervalCollection,
* 实现点云随时间切换(每 0.5 秒加载一个 .pnts 文件)
*/
const timeIntervalCollection = Cesium.TimeIntervalCollection.fromIso8601DateArray(
{
iso8601Dates: dates,
dataCallback: dataCallback,
},
);

const pointCloud = new Cesium.TimeDynamicPointCloud({
intervals: timeIntervalCollection,//时间间隔集合,控制点云文件随时间切换
clock: viewer.clock,//绑定场景时钟,同步时间变化。
style: new Cesium.Cesium3DTileStyle({
pointSize: 5,
}),
});
viewer.scene.primitives.add(pointCloud);

// 配置时间轴和时钟,控制点云的播放范围和行为
const start = Cesium.JulianDate.fromIso8601(dates[0]);
const stop = Cesium.JulianDate.fromIso8601(dates[dates.length - 1]);

viewer.timeline.zoomTo(start, stop);

const clock = viewer.clock;
clock.startTime = start;
clock.currentTime = start;
clock.stopTime = stop;
clock.clockRange = Cesium.ClockRange.LOOP_STOP;

viewer.zoomTo(pointCloud, new Cesium.HeadingPitchRange(0.0, -0.5, 50.0));