Cesium 三维漫游

1、简介:

Cesium 三维漫游,按路径漫游。

支持飞行控制,包括视角跟随和俯视,速度和高度控制等;

支持绘制线路,线路保存到列表中;

支持选择线路列表中的线路进行漫游;

 

二、代码

复制代码

function doFly() {
            if(pathsData && pathsData.geometry){
                var positionA = pathsData.geometry.coordinates;
                var position = [];
                if(positionA.length>0){
                    for (var i = 0; i < positionA.length; i++) {
                        var x = positionA[i][0];
                        var y = positionA[i][1];
                        position.push({ x: x, y: y });
                    }
                }else{
                    return;
                }
                function computeCirclularFlight() {
                    var property = new Cesium.SampledPositionProperty();
                    for (var i = 0; i < position.length; i++) {
                        if (i === 0) {
                            var time = Cesium.JulianDate.addSeconds(start, i, new Cesium.JulianDate());
                            var _position = Cesium.Cartesian3.fromDegrees(position[i].x, position[i].y, 0);
                            property.addSample(time, _position);
                        }
                        if (i < 10000 && i > 0) {
                            var position_a = new Cesium.Cartesian3(property._property._values[i * 3 - 3], property._property._values[i * 3 - 2], property._property._values[i * 3 - 1]);
                           
                            var positions = [Cesium.Ellipsoid.WGS84.cartesianToCartographic(position_a), Cesium.Ellipsoid.WGS84.cartesianToCartographic(_position)];
                            var a = new Cesium.EllipsoidGeodesic(positions[0], positions[1]);
                            var long = a.surfaceDistance;
                            var _time = long/50;
                            var time = Cesium.JulianDate.addSeconds(property._property._times[i - 1], _time, new Cesium.JulianDate());

                            property.addSample(time, _position);
                        }
                    }
                    return property;
                }
                var start = Cesium.JulianDate.fromDate(new Date());
                var stop = Cesium.JulianDate.addSeconds(start, 30000, new Cesium.JulianDate());
                T.cesiumViewer.clock.startTime = start.clone();
                T.cesiumViewer.clock.stopTime = stop.clone();
                T.cesiumViewer.clock.currentTime = start.clone();
                T.cesiumViewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
                T.cesiumViewer.clock.multiplier = 30
                T.cesiumViewer.clock.canAnimate = false;
                T.cesiumViewer.clock.shouldAnimate = true;

                var _position = computeCirclularFlight();

                T.entityFly = T.cesiumViewer.entities.add({
                    availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
                        start: start,
                        stop: stop
                    })]),
                    position: _position,
                    orientation: new Cesium.VelocityOrientationProperty(_position),
                    point:{
                        color:Cesium.Color.RED,
                        outlineColor:Cesium.Color.WHITE,
                        outlineWidth:2,
                        pixelSize:15,
                    },
                    path: {
                        resolution: 1,
                        material: new Cesium.PolylineGlowMaterialProperty({
                            glowPower: 0.1,
                            color: Cesium.Color.YELLOW
                        }),
                        width: 10,
                        clampToGround:true
                    }
                });
                T.cesiumViewer.trackedEntity = T.entityFly;

                var heading=0;
                if (position.length>1){
                    heading = T.bearing(position[0].y, position[0].x, position[1].y, position[1].x);
                    heading = Cesium.Math.toRadians(heading);
                }
                setTimeout(function () {
                    T.cesiumViewer.camera.setView({
                        destination : Cesium.Cartesian3.fromRadians(T.cesiumViewer.camera.positionCartographic.longitude, T.cesiumViewer.camera.positionCartographic.latitude, 5000),
                        orientation:{
                            heading:heading,
                            patch:viewer.camera.patch
                        }
                    });
                }, 200);
            }else{
                return;
            }
        }
    },
    pauseFly3DPaths: function () {
        var clockViewModel = this.cesiumViewer.clockViewModel;
        if (clockViewModel.shouldAnimate) {
            clockViewModel.shouldAnimate = false;
        } else if (this.cesiumViewer.clockViewModel.canAnimate) {
            clockViewModel.shouldAnimate = true;
        }
    },
    playForwardFly3DPaths: function () {
        var clockViewModel = this.cesiumViewer.clockViewModel;
        var multiplier = clockViewModel.multiplier;
        if (multiplier < 0) {
            clockViewModel.multiplier = -multiplier;
        }
        clockViewModel.shouldAnimate = true;
    },
    playReverseFly3DPaths: function () {
        var clockViewModel = this.cesiumViewer.clockViewModel;
        var multiplier = clockViewModel.multiplier;
        if (multiplier > 0) {
            clockViewModel.multiplier = -multiplier;
        }
        clockViewModel.shouldAnimate = true;
    },
    DrawFly3DPaths: function (drawHelper) {
        var T = this;
        this.clearFly3DPaths();
        drawHelper.startDrawingPolyline({
            callback: function (positions) {
                T.drawPolyline = new DrawHelper.PolylinePrimitive({
                    positions: positions,
                    width: 5,
                    type: "plot",
                    geodesic: true
                });
                T.cesiumViewer.scene.primitives.add(T.drawPolyline);
                T.drawPolyline.setEditable();
                var coordinates = [];
                var position = null;
                var heading = null;
                var pitch = null;
                var roll = null;
                for (var i = 0; i < positions.length; i++) {
                    var cartographic = Cesium.Cartographic.fromCartesian(positions[i]);
                    var point = [cartographic.longitude / Math.PI * 180, cartographic.latitude / Math.PI * 180];
                    coordinates.push(point);
                }
                position = drawHelper._cameraPosition;
                heading = drawHelper._cameraHeading;
                pitch = drawHelper._cameraPitch;
                roll = drawHelper._cameraRoll;
                var pathsData = { "orientation": { "heading": heading, "pitch": pitch, "roll": roll }, "position": position, "geometry": { "type": "LineString", "coordinates": coordinates } };
                if (bxmap.FlyCesium) {
                    bxmap.FlyCesium.draw3DObj = T.draw3DObj = pathsData;
                    bxmap.FlyCesium.isDrawFly = true;
                }
            }
        });
    },

复制代码

猜你喜欢

转载自blog.csdn.net/u014556081/article/details/113185624
今日推荐