cesium 路径漫游

之前写过相似的轨迹回放,按路径飞行demo的理解,但与实际数据结合起来的时候还是花了一些时间。

且之前的数据是已经处理成满足cesium要求的格式的了,实际上很多时候并不是,因此重新来梳理如何实现这个效果

先看数据格式

拿到这样的json之后,我们需要将时间与postion成对的存入property中

然后赋值给模型的position属性即可。

那么拿到这样的数据,首先对时间进行处理

设置漫游的起始时间与终止时间

 

时间与位置成对存储

加载模型

最后效果

 

代码

  var viewer = initCesium.initViewer('cesiumContainer',{
        animation: true,
        timeline: true,
        infoBox: false, //Disable InfoBox widget
        selectionIndicator: false, //Disable selection indicator
        shouldAnimate: true, // Enable animations
        // terrainProvider: Cesium.createWorldTerrain()
    });

    var url = "./onet.json"/*json文件url,本地的就写本地的位置,如果是服务器的就写服务器的路径*/
    var request = new XMLHttpRequest();
    request.open("get", url);/*设置请求方法与路径*/
    request.send(null);/*不发送数据到服务器*/
    request.onload = function () {/*XHR对象获取到返回信息后执行*/
        if (request.status == 200) {/*返回状态为200,即为数据获取成功*/
            var json = JSON.parse(request.responseText);
            let arr=json.RECORDS
            console.log(arr)
            let time=arr[0].f1
            let startTime=new Date(time.substring(0,4),time.substring(4,6),time.substring(6,8),time.substring(8,10),
                time.substring(10,12),time.substring(12,14))
            var start = Cesium.JulianDate.fromDate(startTime);
            time=arr[9].f1
            let endTime=new Date(time.substring(0,4),time.substring(4,6),time.substring(6,8),time.substring(8,10),
                time.substring(10,12),time.substring(12,14))
            var stop = Cesium.JulianDate.fromDate(endTime);

            viewer.clock.startTime = start.clone();
            viewer.clock.stopTime = stop.clone();
            viewer.clock.currentTime = start.clone();
            viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; //Loop at the end
            viewer.clock.multiplier = 1;
            //arr=arr.slice(0,9)


            var position = computeCirclularFlight(arr);
            var entity = viewer.entities.add({
                //Set the entity availability to the same interval as the simulation time.
                availability : new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
                    start : start,
                    stop : stop
                })]),
                position : position,
                orientation : new Cesium.VelocityOrientationProperty(position),

                model : {
                    uri : '../data/models/CesiumAir/Cesium_Air.gltf',
                    minimumPixelSize : 64
                },
                path : {
                    resolution : 1,
                    material : new Cesium.PolylineGlowMaterialProperty({
                        glowPower : 0.1,
                        color : Cesium.Color.YELLOW
                    }),
                    width : 10
                }
            });
            viewer.trackedEntity=entity
            var params={
                h:90,
                p:-90,
                r:0
            }
            // Object.defineProperty(params,"h", {
            //     set: function(newval){  // 通过set方法可以拿到新的值
            //          console.log(newval)
            //         this.h= newval
            //     }
            // })
            viewer.camera.setView({
                orientation: {
                    heading : Cesium.Math.toRadians(180), // east, default value is 0.0 (north)
                    pitch : Cesium.Math.toRadians(params.p),    // default value (looking down)
                    roll : 0.0                             // default value
                }
            });

            //viewer.zoomTo(viewer.entities, new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90)));

            return






        }
    }

 

Cesium中,你可以使用Camera类来实现相机的漫游路径漫游路径可以定义为一系列的相机位置和朝向,在不同的时间点上进行插值,从而创建出平滑的相机运动效果。 下面是一个使用Cesium创建漫游路径的简单示例代码: ```javascript // 创建漫游路径所需的位置和朝向数组 var positions = [ Cesium.Cartesian3.fromDegrees(lon1, lat1, height1), Cesium.Cartesian3.fromDegrees(lon2, lat2, height2), // 添加更多的位置... ]; var orientations = [ Cesium.Quaternion.IDENTITY, // 添加更多的朝向... ]; // 创建漫游路径的时间数组 var times = [ Cesium.JulianDate.fromIso8601("2022-01-01T00:00:00Z"), Cesium.JulianDate.fromIso8601("2022-01-01T00:00:10Z"), // 添加更多的时间... ]; // 创建漫游路径插值器 var positionInterpolation = new Cesium.SampledPositionProperty(); positionInterpolation.addSamples(times, positions); var orientationInterpolation = new Cesium.SampledProperty(Cesium.Quaternion); orientationInterpolation.addSamples(times, orientations); // 创建漫游路径的动画效果 viewer.scene.postUpdate.addEventListener(function () { var time = viewer.clock.currentTime; var position = positionInterpolation.getValue(time); var orientation = orientationInterpolation.getValue(time); if (Cesium.defined(position) && Cesium.defined(orientation)) { viewer.camera.setView({ destination: position, orientation: orientation }); } }); ``` 在这个示例中,我们首先定义了一系列的相机位置和朝向,以及对应的时间点。然后,我们使用Cesium的插值器类(SampledPositionProperty和SampledProperty)来创建位置和朝向的插值器,并将样本数据添加到插值器中。 最后,我们通过viewer.scene.postUpdate事件来监听场景的更新,在每一帧中根据当前时间从插值器中获取相机的位置和朝向,并使用viewer.camera.setView()方法来设置相机的位置和朝向,从而实现漫游路径的动画效果。 你可以根据自己的需求修改示例代码中的位置、朝向和时间点,以及添加更多的位置和朝向来创建更复杂的漫游路径。同时,你也可以使用其他的插值器类和动画效果来实现更多样化的漫游路径效果。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值