Cesium 添加多个实体并让其运动

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;

                   }   

最后上效果图:
在这里插入图片描述

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值