当前位置:   article > 正文

cesium实现抛物流动飞线效果_cesium 飞线

cesium 飞线
  1. 1.实现效果
  2. 2.实现效果
  3. 2.1实现思路
  4. 1)构造抛物线
  5. 根据已知起始点和目的点,以及最大高度,根据二次函数公式生成抛物线的点坐标,这里设置轨迹点的坐标为50个。
  6. 2)设置线及材质
  7. 根据生成的抛物线坐标,使用polyline接口,构造线并设置飞线材质。为了使抛物线的效果更加明显,可以通过设置每条轨迹上飞线的数量来实现。
  8. 2.2具体代码
  9. 这里把主要调用函数封装成了parabolaFlowInit函数,代码如下。
  10. 关于飞线材质lineFlowMaterialProperty.js文件,可以参考上篇博客:竖直随机飞线效果:传送门。
  11. // 抛物飞线效果
  12. parabolaFlowInit(this.viewer, 3);
  13. /**
  14. * @description: 抛物飞线效果初始化
  15. * @param {*} _viewer
  16. * @param {*} _num :每条线上的飞线数量
  17. * @return {*}
  18. */
  19. function parabolaFlowInit(_viewer, _num) {
  20.    let _center = [113.9236839, 22.528061];
  21.    let _positions = [
  22.        [113.8236839, 22.528061],
  23.        [114.0236839, 22.528061],
  24.        [113.9236839, 22.428061],
  25.        [113.9236839, 22.628061],
  26.        [113.8236839, 22.428061],
  27.        [114.0236839, 22.628061],
  28.        [113.8236839, 22.628061],
  29.        [114.0236839, 22.428061]
  30.    ];
  31.    _positions.forEach(item => {
  32.        let _siglePositions = parabola(_center, item, 5000);
  33.        // 创建飞线
  34.        for (let i = 0; i < _num; i++) {
  35.            _viewer.entities.add({
  36.                polyline: {
  37.                    positions: _siglePositions,
  38.                    material: new Cesium.LineFlowMaterialProperty({
  39.                        color: new Cesium.Color(1.0, 1.0, 0.0, 0.8),
  40.                        speed: 15 * Math.random(),
  41.                        percent: 0.1,
  42.                        gradient: 0.01
  43.                    })
  44.                },
  45.            });
  46.        }
  47.        // 创建轨迹线
  48.        _viewer.entities.add({
  49.            polyline: {
  50.                positions: _siglePositions,
  51.                material: new Cesium.Color(1.0, 1.0, 0.0, 0.2),
  52.            }
  53.        })
  54.    });
  55.    
  56.    /**
  57.     * @description: 抛物线构造函数(参考开源代码)
  58.     * @param {*
  59.     * @return {*}
  60.     */
  61.    function parabola(
  62.        startPosition,
  63.        endPosition,
  64.        height = 0,
  65.        count = 50
  66.    ) {
  67.        //方程 y=-(4h/L^2)*x^2+h h:顶点高度 L:横纵间距较大者
  68.        let result = []
  69.        height = Math.max(+height, 100)
  70.        count = Math.max(+count, 50)
  71.        let diffLon = Math.abs(startPosition[0] - endPosition[0])
  72.        let diffLat = Math.abs(startPosition[1] - endPosition[1])
  73.        let L = Math.max(diffLon, diffLat)
  74.        let dlt = L / count
  75.        if (diffLon > diffLat) {
  76.            //base on lon
  77.            let delLat = (endPosition[1] - startPosition[1]) / count
  78.            if (startPosition[0] - endPosition[0] > 0) {
  79.                dlt = -dlt
  80.            }
  81.            for (let i = 0; i < count; i++) {
  82.                let h =
  83.                    height -
  84.                    (Math.pow(-0.5 * L + Math.abs(dlt) * i, 2) * 4 * height) /
  85.                    Math.pow(L, 2)
  86.                let lon = startPosition[0] + dlt * i
  87.                let lat = startPosition[1] + delLat * i
  88.                let point = new Cesium.Cartesian3.fromDegrees(lon, lat, h);
  89.                result.push(point);
  90.            }
  91.        } else {
  92.            //base on lat
  93.            let delLon = (endPosition[0] - startPosition[0]) / count
  94.            if (startPosition[1] - endPosition[1] > 0) {
  95.                dlt = -dlt
  96.            }
  97.            for (let i = 0; i < count; i++) {
  98.                let h =
  99.                    height -
  100.                    (Math.pow(-0.5 * L + Math.abs(dlt) * i, 2) * 4 * height) /
  101.                    Math.pow(L, 2)
  102.                let lon = startPosition[0] + delLon * i
  103.                let lat = startPosition[1] + dlt * i
  104.                let point = new Cesium.Cartesian3.fromDegrees(lon, lat, h);
  105.                result.push(point);
  106.            }
  107.        }
  108.        return result
  109.    }
  110. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/109612
推荐阅读
相关标签
  

闽ICP备14008679号