zoukankan      html  css  js  c++  java
  • cesium 飞机根据自定义的位置数据自动调整姿态飞行

    代码:

    <!DOCTYPE html>
    <html>
        <head>
            <title> hello word </title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
            <script src = "../Build/Cesium/Cesium.js"></script>
            <link href="../Build/Cesium/Widgets/widgets.css" rel="stylesheet">
        </head>
    
        <body>
            <div id="cesiumContainer"></div>
            <div id = "latlng_show" style="120px;height:500px;position:absolute;top:10px;left:20px;z-index:1;font-size:15px;">
                <div style="100px;height:30px;float:right;">
                    <font size="1" color="white">经    度: <span id="longitude_show"></span></font>
                </div>
                <div style="100px;height:30px;float:right;">
                    <font size="1" color="white">维    度: <span id="latitude_show"></span></font>
                </div>
                <div style="120px;height:30px;float:right;">
                    <font size="1" color="white">视角高: <span id="altitude_show"></span>km</font>
                </div>
            </div>
            
        </body>
    </html>
        <script>
        
    
    
    //两端点
    var czml = [{
        "id" : "document",
        "name" : "CZML Position Definitions",
        "version" : "1.0"
    }, {
        "id" : "point1",
        "name": "point in cartographic degrees",
        "position" : {
            "cartographicDegrees" : [-119,35.1219512195122,0]
        },
        "point": {
            "color": {
                "rgba": [100, 0, 200, 255]
            },
            "outlineColor": {
                "rgba": [200, 0, 200, 255]
            },
            "pixelSize": {
                "number": 10
            }
        }
    }, {
        "id" : "point2",
        "name": "point in cartesian coordinates",
        "position" : {
            "cartographicDegrees" : [-79,40,0]
        },
        "point": {
            "color": {
                "rgba": [0, 100, 200, 255]
            },
            "outlineColor": {
                "rgba": [200, 0, 200, 255]
            },
            "pixelSize": {
                "number": 10
            }
        }
    }];
    
    //飞行轨迹
    var czmlLine = [{
        "id" : "document",
        "name" : "CZML Geometries: Polyline",
        "version" : "1.0"
    }, {
        "id" : "dashedLine",
        "name" : "Blue dashed line",
        "polyline" : {
            "positions" : {
                "cartographicDegrees" : [
    -119,35.1219512195122,0,
    -118,35.2439024390244,48750,
    -117,35.3658536585366,95000,
    -116,35.4878048780488,138750,
    -115,35.609756097561,180000,
    -114,35.7317073170732,218750,
    -113,35.8536585365854,255000,
    -112,35.9756097560976,288750,
    -111,36.0975609756098,320000,
    -110,36.219512195122,348750,
    -109,36.3414634146341,375000,
    -108,36.4634146341463,398750,
    -107,36.5853658536585,420000,
    -106,36.7073170731707,438750,
    -105,36.8292682926829,455000,
    -104,36.9512195121951,468750,
    -103,37.0731707317073,480000,
    -102,37.1951219512195,488750,
    -101,37.3170731707317,495000,
    -100,37.4390243902439,498750,
    -99,37.5609756097561,500000,
    -98,37.6829268292683,498750,
    -97,37.8048780487805,495000,
    -96,37.9268292682927,488750,
    -95,38.0487804878049,480000,
    -94,38.1707317073171,468750,
    -93,38.2926829268293,455000,
    -92,38.4146341463415,438750,
    -91,38.5365853658537,420000,
    -90,38.6585365853659,398750,
    -89,38.780487804878,375000,
    -88,38.9024390243902,348750,
    -87,39.0243902439024,320000,
    -86,39.1463414634146,288750,
    -85,39.2682926829268,255000,
    -84,39.390243902439,218750,
    -83,39.5121951219512,180000,
    -82,39.6341463414634,138750,
    -81,39.7560975609756,95000,
    -80,39.8780487804878,48750,
    -79,40,0
    
                ]
            },
            "material" : {
                "polylineDash" : {
                    "color" : {
                        "rgba" : [255, 0, 0, 255]
                    }
                }
            },
            "width" : 2
        }
    }];
    
    
    //移动的点
    var czmlMP = [{
        "id" : "document",
        "name" : "CZML Point - Time Dynamic",
        "version" : "1.0"
    }, {
        "id" : "point",
        "availability" :"2012-08-04T16:00:00Z/2012-08-04T17:06:66Z",
        "position" : {
            "epoch" : "2012-08-04T16:00:00Z",
            "cartographicDegrees" : [
    100,-119,35.1219512195122,0,
    200,-118,35.2439024390244,48750,
    300,-117,35.3658536585366,95000,
    400,-116,35.4878048780488,138750,
    500,-115,35.609756097561,180000,
    600,-114,35.7317073170732,218750,
    700,-113,35.8536585365854,255000,
    800,-112,35.9756097560976,288750,
    900,-111,36.0975609756098,320000,
    1000,-110,36.219512195122,348750,
    1100,-109,36.3414634146341,375000,
    1200,-108,36.4634146341463,398750,
    1300,-107,36.5853658536585,420000,
    1400,-106,36.7073170731707,438750,
    1500,-105,36.8292682926829,455000,
    1600,-104,36.9512195121951,468750,
    1700,-103,37.0731707317073,480000,
    1800,-102,37.1951219512195,488750,
    1900,-101,37.3170731707317,495000,
    2000,-100,37.4390243902439,498750,
    2100,-99,37.5609756097561,500000,
    2200,-98,37.6829268292683,498750,
    2300,-97,37.8048780487805,495000,
    2400,-96,37.9268292682927,488750,
    2500,-95,38.0487804878049,480000,
    2600,-94,38.1707317073171,468750,
    2700,-93,38.2926829268293,455000,
    2800,-92,38.4146341463415,438750,
    2900,-91,38.5365853658537,420000,
    3000,-90,38.6585365853659,398750,
    3100,-89,38.780487804878,375000,
    3200,-88,38.9024390243902,348750,
    3300,-87,39.0243902439024,320000,
    3400,-86,39.1463414634146,288750,
    3500,-85,39.2682926829268,255000,
    3600,-84,39.390243902439,218750,
    3700,-83,39.5121951219512,180000,
    3800,-82,39.6341463414634,138750,
    3900,-81,39.7560975609756,95000,
    4000,-80,39.8780487804878,48750,
    4100,-79,40,0
    
            ]
        },
        "point" : {
            "color" : {
                "rgba" : [255, 255, 255, 128]
            },
            "outlineColor" : {
                "rgba" : [255, 0, 0, 128]
            },
            "outlineWidth" : 3,
            "pixelSize" : 15
        }
    }];
    
    
    var viewer = new Cesium.Viewer('cesiumContainer', {
        imageryProvider : Cesium.createTileMapServiceImageryProvider({
                url : Cesium.buildModuleUrl('Assets/Textures/NaturalEarthII') //离线地图
            }),
        shouldAnimate : true,
        geocoder:false,
        homeButton:false,
        sceneModePicker:false,
        baseLayerPicker : false,
        //baseLayerPicker:false,
        //animation:false,
        //creditContainer:"credit"
        timeline:true,
        vrButton:false
    });
    
        var longitude_show = document.getElementById("longitude_show");
        var latitude_show = document.getElementById("latitude_show");
        var altitude_show = document.getElementById("altitude_show");
        var canvas=viewer.scene.canvas;
        
        var ellipsoid = viewer.scene.globe.ellipsoid;
        var handler = new Cesium.ScreenSpaceEventHandler(canvas);
        
        handler.setInputAction(function(movement){
            var cartesian = viewer.camera.pickEllipsoid(movement.endPosition,ellipsoid);
            if(cartesian){
                var cartographic=viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
                
                var lat_String = Cesium.Math.toDegrees(cartographic.latitude).toFixed(4);
                var log_String = Cesium.Math.toDegrees(cartographic.longitude).toFixed(4);
                var alti_String = (viewer.camera.positionCartographic.height/1000).toFixed(2);
                longitude_show.innerHTML = log_String;
                latitude_show.innerHTML = lat_String;
                altitude_show.innerHTML = alti_String;
            }
        },Cesium.ScreenSpaceEventType.MOUSE_MOVE);
    
    /*
    //添加一个球体
    var redSphere = viewer.entities.add({
        name : 'Red sphere with black outline',
        position: Cesium.Cartesian3.fromDegrees(-79,40,-100000),
        ellipsoid : {
            radii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),
            //material : Cesium.Color.RED.withAlpha(0.5),
            //outline : true,
            //outlineColor : Cesium.Color.BLACK
            
            fill : false,
            outline : true,
            outlineColor : Cesium.Color.RED,
            slicePartitions : 12,
            stackPartitions : 13
        }
    });
    
    */
    
    //--------------------------热气球----------------------------------------------
    /*
    function createModel(url, height) {
        viewer.entities.removeAll();
    
        var position = Cesium.Cartesian3.fromDegrees(-79,40, height);
        var heading = Cesium.Math.toRadians(135);
        var pitch = 0;
        var roll = 0;
        var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
        var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpr);
    
        var entity = viewer.entities.add({
            name : url,
            position : position,
            orientation : orientation,
            model : {
                uri : url,
                minimumPixelSize : 128,
                maximumScale : 20000
            }
        });
        viewer.trackedEntity = entity;
    }
    
    createModel('../Apps/SampleData/models/CesiumBalloon/CesiumBalloon.glb', 0.0);
    
    */
    //--------------------------热气球----------------------------------------------
    //createModel('../Apps/SampleData/models/CesiumMan/Cesium_Man.glb', 0.0);
    
    
    //-------------------------------------------------------------爆炸效果
    /*
    var scene = viewer.scene;
    scene.debugShowFramesPerSecond = true;
    
    Cesium.Math.setRandomNumberSeed(315);
    
    var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883));
    var emitterInitialLocation = new Cesium.Cartesian3(0.0, 0.0, 100.0);
    
    var particleCanvas;
    
    function getImage() {
        if (!Cesium.defined(particleCanvas)) {
            particleCanvas = document.createElement('canvas');
            particleCanvas.width = 20;
            particleCanvas.height = 20;
            var context2D = particleCanvas.getContext('2d');
            context2D.beginPath();
            context2D.arc(8, 8, 8, 0, Cesium.Math.TWO_PI, true);
            context2D.closePath();
            context2D.fillStyle = 'rgb(255, 255, 255)';
            context2D.fill();
        }
        return particleCanvas;
    }
    
    var minimumExplosionSize = 3000.0;
    var maximumExplosionSize = 10000.0;
    var particlePixelSize = new Cesium.Cartesian2(7.0, 7.0);
    var burstSize = 400.0;
    var lifetime = 10.0;
    var numberOfFireworks = 1.0;
    
    var emitterModelMatrixScratch = new Cesium.Matrix4();
    
    function createFirework(offset, color, bursts) {
        var position = Cesium.Cartesian3.add(emitterInitialLocation, offset, new Cesium.Cartesian3());
        var emitterModelMatrix = Cesium.Matrix4.fromTranslation(position, emitterModelMatrixScratch);
        var particleToWorld = Cesium.Matrix4.multiply(modelMatrix, emitterModelMatrix, new Cesium.Matrix4());
        var worldToParticle = Cesium.Matrix4.inverseTransformation(particleToWorld, particleToWorld);
    
        var size = Cesium.Math.randomBetween(minimumExplosionSize, maximumExplosionSize);
        var particlePositionScratch = new Cesium.Cartesian3();
        var force = function(particle) {
            var position = Cesium.Matrix4.multiplyByPoint(worldToParticle, particle.position, particlePositionScratch);
            if (Cesium.Cartesian3.magnitudeSquared(position) >= size * size) {
                Cesium.Cartesian3.clone(Cesium.Cartesian3.ZERO, particle.velocity);
            }
        };
    
        var normalSize = (size - minimumExplosionSize) / (maximumExplosionSize - minimumExplosionSize);
        var minLife = 0.3;
        var maxLife = 1.0;
        var life = normalSize * (maxLife - minLife) + minLife;
    
        scene.primitives.add(new Cesium.ParticleSystem({
            image : getImage(),
            startColor : color,
            endColor : color.withAlpha(0.0),
            particleLife : life,
            speed : 100.0,
            imageSize : particlePixelSize,
            emissionRate : 0,
            emitter : new Cesium.SphereEmitter(0.1),
            bursts : bursts,
            lifetime : lifetime,
            updateCallback : force,
            modelMatrix : modelMatrix,
            emitterModelMatrix : emitterModelMatrix
        }));
    }
    
    var xMin = -10000.0;
    var xMax = 10000.0;
    var yMin = -8000.0;
    var yMax = 10000.0;
    var zMin = -5000.0;
    var zMax = 5000.0;
    
    var colorOptions = [{
        minimumRed : 0.75,
        green : 0.0,
        minimumBlue : 0.0,
        alpha : 1.0
    }];
    
    
        var x = Cesium.Math.randomBetween(xMin, xMax);
        var y = Cesium.Math.randomBetween(yMin, yMax);
        var z = Cesium.Math.randomBetween(zMin, zMax);
        var offset = new Cesium.Cartesian3(x, y, z);
        var color = Cesium.Color.fromRandom(colorOptions[0]);
    
        var bursts = [];
        for (var j = 0; j < 3; ++j) {
            bursts.push(new Cesium.ParticleBurst({
                time : Cesium.Math.nextRandomNumber() * lifetime,
                minimum : burstSize,
                maximum : burstSize
            }));
        }
    
        createFirework(offset, color, bursts);
    
    
    var camera = viewer.scene.camera;
    var cameraOffset = new Cesium.Cartesian3(-300.0, 0.0, 0.0);
    camera.lookAtTransform(modelMatrix, cameraOffset);
    camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
    
    var toFireworks = Cesium.Cartesian3.subtract(emitterInitialLocation, cameraOffset, new Cesium.Cartesian3());
    Cesium.Cartesian3.normalize(toFireworks, toFireworks);
    var angle = Cesium.Math.PI_OVER_TWO - Math.acos(Cesium.Cartesian3.dot(toFireworks, Cesium.Cartesian3.UNIT_Z));
    camera.lookUp(angle);
    */
    //-------------------------------------------------------------爆炸效果
    
    
    
    //--------------------------------------防护罩---------------------------------
    var angleJ = 0;
    var radius = 0;
    var step = 10;
    
    var circleNum = 20;
    var g = 800000;
    var totalSpoke = [];//辐条坐标
    
    for(;radius<circleNum;radius++){
        var circle = []; //同心圆坐标
        for(angleJ = 0;angleJ<=360;angleJ+=step){//每个圆上有多少个点8
            var radians = Cesium.Math.toRadians(angleJ);
            var j = radius*Math.cos(radians);
            var w = radius*Math.sin(radians);
    
            //防止出现负0
            if(Math.abs(j)==0){
                j=0;
            }
            if(Math.abs(w)==0){
                w=0;
            }
            //小数点保留两位。
            w = Math.floor(w*100)/100;
            j = Math.floor(j*100)/100;
            
            totalSpoke.push(j);
            totalSpoke.push(w);
            totalSpoke.push(g);
            
            circle.push(j);
            circle.push(w);
            circle.push(g);
            //console.log("j:"+j+"           w:"+w);
            g-=2000/30*step;
        
        }
        //console.log("------------------------------------------------------");
        viewer.entities.add({
            name : 'sun system protected umbrella!',
            polyline : {
                positions : Cesium.Cartesian3.fromDegreesArrayHeights(circle),
                width : 1,
                material : new Cesium.PolylineOutlineMaterialProperty({
                    color : Cesium.Color.ORANGE,
                    outlineWidth : 0,
                   // outlineColor : Cesium.Color.BLACK
                })
            }
        });
    }
    
    
    
    
    var i = 0;
    var count = 0;
    var linshi = [];
    for(;i<360/step*3;i+=3){ //共个辐条
        var spoke = [];
        var j = 0;
        for(;j<totalSpoke.length;j+=((360/step)+1)*3){ //找每个辐条上的点
            spoke.push(totalSpoke[j+i]);
            spoke.push(totalSpoke[j+i+1]);
            spoke.push(totalSpoke[j+i+2]);
            
            //console.log(totalSpoke[j+i]+"  ");
            //console.log(totalSpoke[j+i+1]+"  ");
            //console.log(totalSpoke[j+i+2]);
            //console.log("##");
    
            //console.log(totalSpoke[j+i]+"    j+i");
            //console.log(totalSpoke[j+i+1]+"   j+i+1");
            
        }
        
        //console.log("--------------" +count++ +"-------------");
        
        viewer.entities.add({
            name : 'Orange line with black outline at height and following the surface',
            polyline : {
                positions : Cesium.Cartesian3.fromDegreesArrayHeights(spoke),
                width : 1,
                material : new Cesium.PolylineOutlineMaterialProperty({
                    color : Cesium.Color.ORANGE,
                    outlineWidth : 0,
                   // outlineColor : Cesium.Color.BLACK
                })
            }
        });
        
    }
    
    
    
    
    /*
    Cesium.Math.setRandomNumberSeed(3);
    var lon =100, lat=30, radius = 10;
     for (var i = 0; i <= 360; i += 45) {
            var radians = Cesium.Math.toRadians(i);
             
            circle.push(lon + (radius * Math.cos(radians)));
         console.log(lon + (radius * Math.cos(radians)));
            circle.push(lat + (radius * Math.sin(radians)));
          console.log(lat + (radius * Math.sin(radians)));
            circle.push(Cesium.Math.nextRandomNumber() * 500 + 1750);
          console.log(Cesium.Math.nextRandomNumber() * 500 + 1750);
          console.log("----------------------");
           
        }
    */
    /*
    var dashedLine = viewer.entities.add({
        name : 'Blue dashed line',
        polyline : {
            positions : Cesium.Cartesian3.fromDegreesArrayHeights(circle),
            width : 1,
            material : new Cesium.PolylineDashMaterialProperty({
                color: Cesium.Color.RED
            })
        }
    });
    */
    
    
    var dashedLine2 = viewer.entities.add({
        name : 'Blue dashed line',
        polyline : {
            positions : Cesium.Cartesian3.fromDegreesArrayHeights([0, 0, 500000,
                                                                   179, 0, 500000]),
            width : 4,
            material : new Cesium.PolylineDashMaterialProperty({
                color: Cesium.Color.RED
            })
        }
    });
    
    var dashedLine3 = viewer.entities.add({
        name : 'Blue dashed line',
        polyline : {
            positions : Cesium.Cartesian3.fromDegreesArrayHeights([0, 0, 500000,
                                                                   0, 179, 500000]),
            width : 4,
            material : new Cesium.PolylineDashMaterialProperty({
                color: Cesium.Color.BLUE
            })
        }
    });
    
    
    //--------------------------------------防护罩---------------------------------
    
    //--------------------------------保护伞下面的锥形---------------------------------
    
    var gc = 1600000; //高程
    var jd = -90;    //经度
    var wd = 0;        //纬度
    var bottomRadius = 2000000; //半径
    
    
    //上盖
    var position = Cesium.Cartesian3.fromDegrees(jd, wd, gc);
    var redCone = viewer.entities.add({
        name : 'Red cone',
        position: position,
        cylinder : {
            length : 20000.0,
            topRadius : 0.0,
            bottomRadius : bottomRadius,
            material : Cesium.Color.ORANGE.withAlpha(0.1),
            fill:true,
            outline:true,
            outlineColor:Cesium.Color.ORANGE.withAlpha(0.2)
        }
    });
    var greenCircle = viewer.entities.add({
        position: Cesium.Cartesian3.fromDegrees(jd, wd, 0),
        name : 'Green circle at height with outline',
        ellipse : {
            semiMinorAxis : bottomRadius,
            semiMajorAxis : bottomRadius,
            height: gc+gc/4,
            material : Cesium.Color.ORANGE.withAlpha(0.2),
            fill:false,
            
            outline : true ,// height must be set for outline to display
            outlineColor: Cesium.Color.ORANGE.withAlpha(0.2)
        }
    });
    
    
    var position2 = Cesium.Cartesian3.fromDegrees(jd, wd, gc/2);
    var heading2 = 0;
    var pitch2 = Cesium.Math.toRadians(180);
    var roll2 = 0;
    var hpr2 = new Cesium.HeadingPitchRoll(heading2,pitch2,roll2);
    var orientation2 = Cesium.Transforms.headingPitchRollQuaternion(position2,hpr2);
    //下底
    var redCone = viewer.entities.add({
        name : 'Red cone',
        position: position2,
        orientation:orientation2,
        cylinder : {
            length : gc,
            topRadius : 0.0,
            bottomRadius : bottomRadius,
            material : Cesium.Color.YELLOW.withAlpha(0.1),
            fill:true,
            //outline:true,
            outlineColor:Cesium.Color.YELLOW.withAlpha(0.08)
        }
    });
    
    //锥点
    var czmlPoint = [{
        "id" : "document",
        "name" : "CZML Position Definitions",
        "version" : "1.0"
    }, {
        "id" : "point1",
        "name": "point in cartographic degrees",
        "position" : {
            "cartographicDegrees" : [jd, wd, 0.0]
        },
        "point": {
            "color": {
                "rgba": [255, 0, 0, 255]
            },
            "outlineColor": {
                "rgba": [255, 0, 0, 255]
            },
            "pixelSize": {
                "number": 6
            }
        }
    }];
    //--------------------------------保护伞下面的锥形---------------------------------
    
    
    //--------------------------------------粒子系统--------------------------------
    /*
    var planePosition = Cesium.Cartesian3.fromDegrees(0.0, 0.0, 500000.0);
    var particlesOffset = new Cesium.Cartesian3(-8.950115473940969, 34.852766731753945, -30.235411095432937);
    var cameraLocation = Cesium.Cartesian3.add(planePosition, particlesOffset, new Cesium.Cartesian3());
    var resetCamera = function() {
        viewer.camera.lookAt(cameraLocation, new Cesium.Cartesian3(-450, -300, 200));
    };
    resetCamera();
    
    // Draw particle image to a canvas
    var particleCanvas;
    function getImage() {
        if (!Cesium.defined(particleCanvas)) {
            particleCanvas = document.createElement('canvas');
            particleCanvas.width = 150;
            particleCanvas.height = 100;
            var context2D = particleCanvas.getContext('2d');
            context2D.beginPath();
            context2D.arc(8, 8, 8, 0, Cesium.Math.TWO_PI, true);
            context2D.closePath();
            context2D.fillStyle = 'rgb(255, 255, 255)';
            context2D.fill();
        }
        return particleCanvas;
    }
    
    // Add plane to scene
    var hpr = new Cesium.HeadingPitchRoll(0.0, Cesium.Math.PI_OVER_TWO, 0.0);
    var orientation = Cesium.Transforms.headingPitchRollQuaternion(planePosition, hpr);
    var entity = viewer.entities.add({
        model : {
            uri : '../Apps/SampleData/models/CesiumAir/Cesium_Air.gltf',
            scale : 10
        },
        position : planePosition,
        orientation : orientation
    });
    
    // creating particles model matrix
    var translationOffset = Cesium.Matrix4.fromTranslation(particlesOffset, new Cesium.Matrix4());
    var translationOfPlane = Cesium.Matrix4.fromTranslation(planePosition, new Cesium.Matrix4());
    var particlesModelMatrix = Cesium.Matrix4.multiplyTransformation(translationOfPlane, translationOffset, new Cesium.Matrix4());
    
    // creating the particle systems
    
    var cometOptions = {
        numberOfSystems : 100.0,
        iterationOffset : 0.003,
        cartographicStep : 0.0000001,
        baseRadius : 0.0005,
    
        colorOptions : [{
            red : 0.6,
            green : 0.6,
            blue : 0.6,
            alpha : 1.0
        }, {
            red : 0.6,
            green : 0.6,
            blue : 0.9,
            alpha : 0.9
        }, {
            red : 0.5,
            green : 0.5,
            blue : 0.7,
            alpha : 0.5
        }]
    };
    
    var scratchCartesian3 = new Cesium.Cartesian3();
    var scratchCartographic = new Cesium.Cartographic();
    var forceFunction = function(options, iteration) {
        return function(particle, dt) {
            dt = Cesium.Math.clamp(dt, 0.0, 5);
    
            scratchCartesian3 = Cesium.Cartesian3.normalize(particle.position, new Cesium.Cartesian3());
            scratchCartesian3 = Cesium.Cartesian3.multiplyByScalar(scratchCartesian3, -40.0 * dt, scratchCartesian3);
    
            scratchCartesian3 = Cesium.Cartesian3.add(particle.position, scratchCartesian3, scratchCartesian3);
    
            scratchCartographic = Cesium.Cartographic.fromCartesian(scratchCartesian3, Cesium.Ellipsoid.WGS84, scratchCartographic);
    
            var angle = Cesium.Math.PI * 2.0 * iteration / options.numberOfSystems;
            iteration += options.iterationOffset;
            scratchCartographic.longitude += Math.cos(angle) * options.cartographicStep * 30.0 * dt;
            scratchCartographic.latitude += Math.sin(angle) * options.cartographicStep * 30.0 * dt;
    
            particle.position = Cesium.Cartographic.toCartesian(scratchCartographic);
        };
    };
    
    var matrix4Scratch = new Cesium.Matrix4();
    var scratchAngleForOffset = 0.0;
    var scratchOffset = new Cesium.Cartesian3();
    var imageSize = new Cesium.Cartesian2(15.0, 15.0);
    function createParticleSystems(options, systemsArray) {
        var length = options.numberOfSystems;
        for (var i = 0; i < length; ++i) {
            scratchAngleForOffset = Math.PI * 2.0 * i / options.numberOfSystems;
            scratchOffset.x += options.baseRadius * Math.cos(scratchAngleForOffset);
            scratchOffset.y += options.baseRadius * Math.sin(scratchAngleForOffset);
    
            var emitterModelMatrix = Cesium.Matrix4.fromTranslation(scratchOffset, matrix4Scratch);
            var color = Cesium.Color.fromRandom(options.colorOptions[i % options.colorOptions.length]);
            var force = forceFunction(options, i);
    
            var item = viewer.scene.primitives.add(new Cesium.ParticleSystem({
                image : getImage(),
                startColor : color,
                endColor : color.withAlpha(0.0),
                particleLife : 3.5,
                speed : 0.00005,
                imageSize : imageSize,
                emissionRate : 30.0,
                emitter : new Cesium.CircleEmitter(0.1),
                lifetime : 1,
                updateCallback : force,
                modelMatrix : particlesModelMatrix,
                emitterModelMatrix : emitterModelMatrix
            }));
            systemsArray.push(item);
        }
    }
    
    var cometSystems = [];
    createParticleSystems(cometOptions, cometSystems);
    
    // toolbar elements
    function showAll(systemsArray, show) {
        var length = systemsArray.length;
        for (var i = 0; i < length; ++i) {
            systemsArray[i].show = show;
        }
    }
    
    
        showAll(cometSystems, true);
        resetCamera();
    */
    //--------------------------------------粒子系统--------------------------------
    
    //---------------------------------------------------------------------------
    //Enable lighting based on sun/moon positions
    //viewer.scene.globe.enableLighting = true;
    
    //Enable depth testing so things behind the terrain disappear.
    //viewer.scene.globe.depthTestAgainstTerrain = true;
    
    //Set the random number seed for consistent results.
    Cesium.Math.setRandomNumberSeed(3);
    
    //Set bounds of our simulation time
    var start = Cesium.JulianDate.fromDate(new Date(2015, 2, 25, 16));
    var stop = Cesium.JulianDate.addSeconds(start, 410, new Cesium.JulianDate());
    
    //Make sure viewer is at the desired time.
    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 = 10;
    
    //Set timeline to simulation bounds
    viewer.timeline.zoomTo(start, stop);
    
    //Generate a random circular pattern with varying heights.
    
    //让飞机绕圆圈飞行。
    /*
    function computeCirclularFlight(lon, lat, radius) {
        var property = new Cesium.SampledPositionProperty();
        for (var i = 0; i <= 360; i += 30) {
            var radians = Cesium.Math.toRadians(i);
            var time = Cesium.JulianDate.addSeconds(start, i, new Cesium.JulianDate());
            var position = Cesium.Cartesian3.fromDegrees(lon + (radius * 1000*1.5 * Math.cos(radians)), lat + (radius *1000* Math.sin(radians)), Cesium.Math.nextRandomNumber() * 500 + 175000);
            console.log(lon + (radius * 1000*1.5 * Math.cos(radians)));
            console.log(lat + (radius *1000* Math.sin(radians)));
            console.log(Cesium.Math.nextRandomNumber() * 500 + 175000);
            console.log("-----");
            property.addSample(time, position);
    
            //Also create a point for each sample we generate.
                viewer.entities.add({
                position : position,
                point : {
                    pixelSize : 2,
                    color : Cesium.Color.TRANSPARENT,
                    outlineColor : Cesium.Color.YELLOW,
                    outlineWidth : 1
                }
            });
        }
        return property;
    }
    */
    var arr = [
    [-119,35.1219512195122,0],
    [-118,35.2439024390244,48750],
    [-117,35.3658536585366,95000],
    [-116,35.4878048780488,138750],
    [-115,35.609756097561,180000],
    [-114,35.7317073170732,218750],
    [-113,35.8536585365854,255000],
    [-112,35.9756097560976,288750],
    [-111,36.0975609756098,320000],
    [-110,36.219512195122,348750],
    [-109,36.3414634146341,375000],
    [-108,36.4634146341463,398750],
    [-107,36.5853658536585,420000],
    [-106,36.7073170731707,438750],
    [-105,36.8292682926829,455000],
    [-104,36.9512195121951,468750],
    [-103,37.0731707317073,480000],
    [-102,37.1951219512195,488750],
    [-101,37.3170731707317,495000],
    [-100,37.4390243902439,498750],
    [-99,37.5609756097561,500000],
    [-98,37.6829268292683,498750],
    [-97,37.8048780487805,495000],
    [-96,37.9268292682927,488750],
    [-95,38.0487804878049,480000],
    [-94,38.1707317073171,468750],
    [-93,38.2926829268293,455000],
    [-92,38.4146341463415,438750],
    [-91,38.5365853658537,420000],
    [-90,38.6585365853659,398750],
    [-89,38.780487804878,375000],
    [-88,38.9024390243902,348750],
    [-87,39.0243902439024,320000],
    [-86,39.1463414634146,288750],
    [-85,39.2682926829268,255000],
    [-84,39.390243902439,218750],
    [-83,39.5121951219512,180000],
    [-82,39.6341463414634,138750],
    [-81,39.7560975609756,95000],
    [-80,39.8780487804878,48750],
    [-79,40,0]
    ];
    function computeCirclularFlight(lon, lat, radius) {
    
        var property = new Cesium.SampledPositionProperty();
        
        for(var i = 0;i<arr.length;i++){
        var time = Cesium.JulianDate.addSeconds(start, i*10, new Cesium.JulianDate());
                var position = Cesium.Cartesian3.fromDegrees(arr[i][0],arr[i][1],arr[i][2]);
                property.addSample(time, position);
                //Also create a point for each sample we generate.
                            /*viewer.entities.add({
                            position : position,
                            point : {
                                pixelSize : 2,
                                color : Cesium.Color.TRANSPARENT,
                                outlineColor : Cesium.Color.RED,
                                outlineWidth : 1
                            }
                        });*/
                        
                //console.log(arr[i][j]);
        
    }
        
        return property;
    }
    
    //Compute the entity position property.
    //var position = computeCirclularFlight();
    var position = computeCirclularFlight(-100, 30, 0.03);
    
    //Actually create the entity
    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
        })]),
    
        //Use our computed positions
        position : position,
    
        //Automatically compute orientation based on position movement.
        orientation : new Cesium.VelocityOrientationProperty(position),
    
        //Load the Cesium plane model to represent the entity
        model : {
            //uri : '../Apps/SampleData/models/CesiumMilkTruck/CesiumMilkTruck.gltf',
            uri : '../Apps/SampleData/models/CesiumAir/Cesium_Air.gltf',
            
            minimumPixelSize : 64
        },
    
        //Show the path as a pink line sampled in 1 second increments.
        /*path : {
            resolution : 1,
            material : new Cesium.PolylineGlowMaterialProperty({
                glowPower : 0.2,
                color : Cesium.Color.YELLOW
            }),
            width : 2
            
        }*/
    });
    
    //Add button to view the path from the top down
    //viewer.zoomTo(viewer.entities, new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90)));
    //viewer.trackedEntity = undefined;
    //viewer.zoomTo(viewer.entities, new Cesium.HeadingPitchRange(Cesium.Math.toRadians(-90), Cesium.Math.toRadians(-15), 7500));
    viewer.zoomTo(viewer.entities, new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90),7500000));
    //隐藏版权信息
     viewer._cesiumWidget._creditContainer.style.display = "none";
    
    
    //-------------------------------------------------------------------------------
    
    //var viewer = new Cesium.Viewer('cesiumContainer');
    //两端点
    viewer.dataSources.add(Cesium.CzmlDataSource.load(czml));
    viewer.dataSources.add(Cesium.CzmlDataSource.load(czmlPoint));
    
    
    
    //移动的点
    //viewer.dataSources.add(Cesium.CzmlDataSource.load(czmlMP ));
    
    //飞行轨迹
    viewer.dataSources.add(Cesium.CzmlDataSource.load(czmlLine ));
    
    //viewer.dataSources.add(Cesium.CzmlDataSource.load(czmlzhui));
    
    //viewer.zoomTo(dataSourcePromise);
    
        </script>
  • 相关阅读:
    HDU 2112 HDU Today
    HDU 1869 六度分离
    HDU 3790 最短路径问题
    HDU2066 一个人的旅行
    HDU1596 find the safest road(最短路)
    HDU 1254 推箱子(双重bfs)
    HDU 1429 胜利大逃亡(续) (bfs+状态压缩)
    HDU 1045 Fire Net
    数据结构之单链表头插法,尾插法
    Java--会移动、反弹的球
  • 原文地址:https://www.cnblogs.com/airduce/p/10417743.html
Copyright © 2011-2022 走看看