Cesium 添加多个实体并让其运动
开发工具与关键技术:
作者:熊琪
撰写时间:2020年9月28日
首先要搞明白怎么同时添加多个实体,并让其运动起来,有以下几个步骤:
1、把需要运动的轨迹经过的坐标点用数组存储,如果有两个或者两个以上就数组的长度也随之增加,代码如下:
```csharp
var data = [];
data[0] = [
{longitude:108.95847801120208,dimension:34.21765422118126, height: -3.948,
time: 0},
{longitude:108.95849254781227,dimension:34.21800309998983, height: -3.839,
time: 100},
{longitude:108.9594164044393,dimension:34.21802855891169, height: -2.579,
time: 200},
];
data[1] = [
{longitude:108.95950701639765,dimension:34.217844331494476, height: 60,
time: 0},
{longitude:108.9595823050117,dimension:34.21968058035922, height: 60, time:
90},
{longitude:108.95962187417913,dimension:34.2203211325976, height: 60, time:
110},
{longitude:108.95893458332738,dimension:34.22035583250216, height: 60,
time: 150},
{longitude:108.95890809899528,dimension:34.21925021094963, height: 60,
time: 200},
];
2、需要实体动起来那么,就得规定它在哪个时间类运动,那么
就要规定
其实起始时间和结束时间。代码如下:
// 起始时间
var start = Cesium.JulianDate.fromIso8601
('2020-09-11T08:08:00Z');
从 ISO 8601 日期开始创建新实例。此方法优于 Date.parse ,因为它将处理ISO 8601定义的所有有效格式规范,包括leap秒和毫秒级,大多数JavaScript实现都放弃了。
// 结束时间
// var stop1 = Cesium.JulianDate.addSeconds (start, 200, new
Cesium.JulianDate ());
/
提供的秒
数添加到提供的日期实例中。
julianDate 日期。seconds 添加或减去的秒数。 result 用于结果的现有实例。
// 设置始时钟始时间
viewer.clock.startTime = start.clone ();
new Cesium.Clock ( options ) 用于跟踪模拟时间的简单时钟。 start.clone ()要复制的日期。
// 设置时钟当前时间ewer.clock.currentTime =
start.clone (); //当前时间。
// 设置时钟停止时间
viewer.clock.stopTime =stop1.clone ();
// 时间速率,数字越大时间过的越快
viewer.clock.multiplier =20; //前进的秒数
// 时间轴
ewer.timeline.zoomTo(start,stop1);
//把时间添加时间轴上
// 循环执行,即为2,到达终止时间,重新从起点时间开始
viewer.clock.clockRange =Cesium.ClockRange.LOOP_STOP;
3、根据之前添加的实体的坐标数组的长度的来循环添加实体,代码如下:
for (var j = 0; j < data.length; j++) {
var property = computeFlight
(data[j]);
//console.log(property)
// 添加模型
if(j==0){
entity1 = viewer.entities.add ({
id:"entities"+j,
// 和时间轴关联 availability与此对象相关联的可用性(如果有)。
availability: new
Cesium.TimeIntervalCollection ([ //要添加到集合中的间隔数组
new Cesium.TimeInterval ({ //由开始和停止时间定义的时间间隔;
start: start,
stop: stop1,
}),]),
position: property,
path: {
resolution: 1, leadTime:
0, trailTime: 200,
material: new
Cesium.PolylineGlowMaterialProperty({
glowPower: 0.1,
color: Cesium.Color.ORANGE
}),
width: 10
},
// 根据所提供的速度计算模型的朝向
orientation: new Cesium.VelocityOrientationProperty
(property),
//一个 属性 ,其计算结果为 四元数 旋转基于提供的 PositionProperty 的速度。用于计算方向的position属性
// 模型数据
model: {
uri:'./Cesium-1.67/Apps/SampleData/models/CesiumMilkTruck/CesiumMilkTruck.glb',
minimumPixelSize: 2,
},
});
}else if(j==1){
entity2 =
viewer.entities.add ({
id:"entities"+j,
// 和时间轴关联 availability与此对象相关联的可用性(如果有)。
availability: new Cesium.TimeIntervalCollection
([ //要添加到集合中的间隔数组
new Cesium.TimeInterval ({ //由开始和停止时间定义的时间间隔;
start: start,
stop: stop1,
}),
]),
position: property,
// 根据所提供的速度计算模型的朝向
orientation: new
Cesium.VelocityOrientationProperty (property),//一个 属性 ,其计算结果为 四元数 旋转基于提供的
PositionProperty 的速度。用于计算方向的position属性
// 模型数据
model: {
uri:
'./Cesium-1.67/Apps/SampleData/models/CesiumAir/Cesium_Air.glb',
minimumPixelSize: 2,
},});
}
}
4、根据位置对应的时间来计算实体的加速度代码如下:
function computeFlight (source) {
// 取样位置 相当于一个集合 速度,加速度等
ar property = new Cesium.SampledPositionProperty ();
for (var i = 0; i < source.length;i++) {
var time = Cesium.JulianDate.addSeconds (
start,
source[i].time,
new Cesium.JulianDate ());
var position =Cesium.Cartesian3.fromDegrees (
source[i].longitude,
source[i].dimension,
source[i].height
);
// 添加一个新样本。添加位置,和时间对应
property.addSample (time,position);
}
return property;
}
最后上效果图: