1. 程式人生 > >Cesium學習筆記(八):Demo學習(差值器)

Cesium學習筆記(八):Demo學習(差值器)

這個Demo是官方Demo中的Interpolation(差值器),不過我更喜歡叫它轉圈的飛機o( ̄ε ̄*)

這個Demo看上去就是一個飛機在繞著一個圈在飛,你可以通過切換差值器看效果

話說這個Demo困擾了我好久,我一直以為這個飛機飛行是自己畫出來的,因為上一個就是嘛,然後一直找啊找,就是找不到

最後才發現其實它只是在幾個時間段填了幾個sample,其他的都是靠差值器自動生成的。。。

一起來看一下程式碼吧

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset
="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> <title>Hello World!</title> <script src="../Build/Cesium/Cesium.js"
>
</script> <link rel="stylesheet" href="Sandcastle/templates/bucket.css"> <style> @import url(../Build/Cesium/Widgets/widgets.css); </style> </head> <body> <div id="cesiumContainer" class="fullSize"></div> <div id="toolbar"> <div
id="interpolationMenu">
</div> </div> <script src="你的js路徑"></script> </body> </html>

js

var viewer = new Cesium.Viewer('cesiumContainer', {
    terrainProviderViewModels: [], //禁用地形變化
    infoBox: false,
    selectionIndicator: false
});

// 開啟自然光照
viewer.scene.globe.enableLighting = true;

// 開啟地形變化
viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
    url: 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles',
    requestWaterMask: true,
    requestVertexNormals: true
});

//啟用深度測試,所以地形後面的東西會消失
viewer.scene.globe.depthTestAgainstTerrain = true;

//生成一個隨機數
Cesium.Math.setRandomNumberSeed(3);

//設定了模擬時間的邊界
var start = Cesium.JulianDate.fromDate(new Date(2015, 2, 25, 16));
var stop = Cesium.JulianDate.addSeconds(start, 360, new Cesium.JulianDate());

//確保檢視器處於預期的時間
viewer.clock.startTime = start.clone();
viewer.clock.stopTime = stop.clone();
viewer.clock.currentTime = start.clone();
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; //迴圈結束時
//時間變化來控制速度
viewer.clock.multiplier = 10;

//給時間線設定邊界
viewer.timeline.zoomTo(start, stop);

//多邊形和點(高度隨機)
function computeCirclularFlight(lon, lat, radius) {
    var property = new Cesium.SampledPositionProperty();
    //i為角度(多邊形的偏離角度)
    for (var i = 0; i <= 360; i += 45) {
        var radians = Cesium.Math.toRadians(i);
        var time = Cesium.JulianDate.addSeconds(start, i, new Cesium.JulianDate());

        //計算位置
        var position = Cesium.Cartesian3.fromDegrees(
            lon + (radius * 1.5 * Math.cos(radians)), lat + (radius * Math.sin(radians)), Cesium.Math.nextRandomNumber() * 500 + 1750);

        //添加了8個sample
        property.addSample(time, position);

        //那幾個黃圈圈
        viewer.entities.add({
            position: position,
            point: {
                pixelSize: 8,
                color: Cesium.Color.TRANSPARENT,
                outlineColor: Cesium.Color.YELLOW,
                outlineWidth: 3
            }
        });
    }
    return property;
}

//計算實體位置屬性
var position = computeCirclularFlight(0, 180, 0.03);

//建立實體
var entity = viewer.entities.add({

    // 將實體availability設定為與模擬時間相同的時間間隔。
    availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
        start: start,
        stop: stop
    })]),

    //這是一個4x4的矩陣,包含了方位方向等屬性
    position: position,

    //基於位置移動自動計算方向.
    orientation: new Cesium.VelocityOrientationProperty(position),

    //載入飛機模型
    model: {
        uri: '../Apps/SampleData/models/CesiumAir/Cesium_Air.gltf',
        minimumPixelSize: 64
    },

    //路徑
    path: {
        resolution: 1,
        material: new Cesium.PolylineGlowMaterialProperty({
            glowPower: 0.1,
            color: Cesium.Color.PINK
        }),
        width: 10
    }
});

//頭頂視角
Sandcastle.addDefaultToolbarButton('View Top Down', function () {
    viewer.trackedEntity = undefined;
    viewer.zoomTo(viewer.entities, new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90)));
});

//側面視角
Sandcastle.addToolbarButton('View Side', function () {
    viewer.trackedEntity = undefined;
    viewer.zoomTo(viewer.entities, new Cesium.HeadingPitchRange(Cesium.Math.toRadians(-90), Cesium.Math.toRadians(-15), 7500));
});

//追隨視角
Sandcastle.addToolbarButton('View Aircraft', function () {
    viewer.trackedEntity = entity;
});

//切換差值器
Sandcastle.addToolbarMenu([{
    text: 'Interpolation: Linear Approximation',
    onselect: function () {
        entity.position.setInterpolationOptions({
            interpolationDegree: 1,
            interpolationAlgorithm: Cesium.LinearApproximation
        });
    }
}, {
    text: 'Interpolation: Lagrange Polynomial Approximation',
    onselect: function () {
        entity.position.setInterpolationOptions({
            interpolationDegree: 5,
            interpolationAlgorithm: Cesium.LagrangePolynomialApproximation
        });
    }
}, {
    text: 'Interpolation: Hermite Polynomial Approximation',
    onselect: function () {
        entity.position.setInterpolationOptions({
            interpolationDegree: 2,
            interpolationAlgorithm: Cesium.HermitePolynomialApproximation
        });
    }
}], 'interpolationMenu');

看完了這個例子,讓我們來趁熱打鐵,寫個小例子玩玩

一個環赤道的衛星,然而沒有衛星就拿飛機吧。。。

var viewer = new Cesium.Viewer("cesiumContainer");

//設定了模擬時間的邊界
var start = Cesium.JulianDate.fromDate(new Date(2015, 2, 25, 16));
var stop = Cesium.JulianDate.addSeconds(start, 360, new Cesium.JulianDate());

//確保檢視器處於預期的時間
viewer.clock.startTime = start.clone();
viewer.clock.stopTime = stop.clone();
viewer.clock.currentTime = start.clone();
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; //迴圈結束時
//時間變化來控制速度
viewer.clock.multiplier = 10;

//給時間線設定邊界
viewer.timeline.zoomTo(start, stop);

function computeCirclularFlight(lon, lat) {
    var property = new Cesium.SampledPositionProperty();

    //i的增量不能太大,不然差值器無法把圖形如願畫出來
    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+i, lat, 9999999);

        //新增sample
        property.addSample(time, position);

    }
    return property;
}

//計算實體位置屬性
var satellitePosition = computeCirclularFlight(0, 0);

//建立實體
var entity = viewer.entities.add({

    // 將實體availability設定為與模擬時間相同的時間間隔。
    availability : new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
        start : start,
        stop : stop
    })]),

    position : satellitePosition,

    //基於位置移動自動計算方向.
    orientation : new Cesium.VelocityOrientationProperty(satellitePosition),

    //載入飛機模型
    model : {
        uri : '../Apps/SampleData/models/CesiumAir/Cesium_Air.gltf',
        minimumPixelSize : 64
    },

    //路徑
    path : {
        resolution : 1,
        material : new Cesium.PolylineGlowMaterialProperty({
            glowPower : 0.1,
            color : Cesium.Color.PINK
        }),
        width : 10
    }
});

//差值器
entity.position.setInterpolationOptions({
    interpolationDegree : 5,
    interpolationAlgorithm : Cesium.LagrangePolynomialApproximation
});

這裡寫圖片描述