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; } } }); },