Cesium流动线纹理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cesium流动线纹理相关的知识,希望对你有一定的参考价值。

参考技术A 注:流动效果使用的图片是渐进色

1.扩展类PolylineTrailMaterialProperty (Cesium  1.67-1.68)

import Cesium from "cesium/Cesium";

export class PolylineTrailMaterialProperty

    constructor(options)

        options = Cesium.defaultValue(options, Cesium.defaultValue.EMPTY_OBJECT);

        this._definitionChanged = new Cesium.Event();

        this._color = undefined;

        this._colorSubscription = undefined;

        this.color = options.color;

        this.duration = options.duration;

        this.trailImage = options.trailImage;

        this._time = performance.now();

   



Cesium.defineProperties(PolylineTrailMaterialProperty.prototype,

    isConstant:

        get: function()

            return false;

       

    ,

    definitionChanged:

        get: function()

            return this._definitionChanged;

       

    ,

    color: Cesium.createPropertyDescriptor('color')

);

PolylineTrailMaterialProperty.prototype.getType = function(time)

    return 'PolylineTrail';



PolylineTrailMaterialProperty.prototype.getValue = function(time, result)

    if (!Cesium.defined(result))

        result = ;

   

    result.color = Cesium.Property.getValueOrClonedDefault(this._color, time, Cesium.Color.WHITE, result.color);

    //result.image = Cesium.Material.PolylineTrailImage;

    result.image = this.trailImage;

    result.time = ((performance.now() - this._time) % this.duration) / this.duration;

    return result;



PolylineTrailMaterialProperty.prototype.equals = function(other)

    return this === other ||

        (other instanceof PolylineTrailMaterialProperty &&

            Cesium.Property.equals(this._color, other._color))



Cesium.Material.PolylineTrailType = 'PolylineTrail';

Cesium.Material.PolylineTrailImage = "images/colors.png";

Cesium.Material.PolylineTrailSource = "czm_material czm_getMaterial(czm_materialInput materialInput)\n\

                                                      \n\

                                                          czm_material material = czm_getDefaultMaterial(materialInput);\n\

                                                          vec2 st = materialInput.st;\n\

                                                          vec4 colorImage = texture2D(image, vec2(fract(st.s - time), st.t));\n\

                                                          material.alpha = colorImage.a * color.a;\n\

                                                          material.diffuse = (colorImage.rgb+color.rgb)/2.0;\n\

                                                          return material;\n\

                                                      ";

Cesium.Material._materialCache.addMaterial(Cesium.Material.PolylineTrailType,

    fabric:

        type: Cesium.Material.PolylineTrailType,

        uniforms:

            color: new Cesium.Color(1.0, 0.0, 0.0, 0.5),

            image: Cesium.Material.PolylineTrailImage,

            time: 0

        ,

        source: Cesium.Material.PolylineTrailSource

    ,

    translucent: function(material)

        return true;

   

);

Cesium.PolylineTrailMaterialProperty = PolylineTrailMaterialProperty;

2.使用

<template>

  <div class="fullSize" id="cesiumContainer"></div>

</template>

<script>

import "cesium/Widgets/widgets.css";

import Cesium from "cesium/Cesium";

import CesiumFactory from "@/js/cesium/CesiumFactory";

import PolylineTrailMaterialProperty from "@/js/cesium/overlay/PolylineTrailMaterialProperty";

export default

  name: "CesiumDynamicLine1",

  data()

    return

      viewer: null

    ;

  ,

  mounted()

    const factory = new CesiumFactory();

    this.viewer = factory.getViewer();

    this.create();

  ,

  methods:

    create()

      //创建射线

      var data =

        center:

          id: 0,

          lon: 114.302312702,

          lat: 30.598026044,

          size: 20,

          color: Cesium.Color.PURPLE

        ,

        points: [

         

            id: 1,

            lon: 115.028495718,

            lat: 30.200814617,

            color: Cesium.Color.YELLOW,

            size: 15

          ,

         

            id: 2,

            lon: 110.795000473,

            lat: 32.638540762,

            color: Cesium.Color.RED,

            size: 15

          ,

         

            id: 3,

            lon: 111.267729446,

            lat: 30.698151246,

            color: Cesium.Color.BLUE,

            size: 15

          ,

         

            id: 4,

            lon: 112.126643144,

            lat: 32.058588576,

            color: Cesium.Color.GREEN,

            size: 15

          ,

         

            id: 5,

            lon: 114.885884938,

            lat: 30.395401912,

            color: Cesium.Color.BLUE,

            size: 15

          ,

         

            id: 6,

            lon: 112.190419415,

            lat: 31.043949588,

            color: Cesium.Color.BLUE,

            size: 15

          ,

         

            id: 7,

            lon: 113.903569642,

            lat: 30.93205405,

            color: Cesium.Color.BLUE,

            size: 15

          ,

         

            id: 8,

            lon: 112.226648859,

            lat: 30.367904255,

            color: Cesium.Color.BLUE,

            size: 15

          ,

         

            id: 9,

            lon: 114.86171677,

            lat: 30.468634833,

            color: Cesium.Color.BLUE,

            size: 15

          ,

         

            id: 10,

            lon: 114.317846048,

            lat: 29.848946148,

            color: Cesium.Color.BLUE,

            size: 15

          ,

         

            id: 11,

            lon: 113.371985426,

            lat: 31.70498833,

            color: Cesium.Color.BLUE,

            size: 15

          ,

         

            id: 12,

            lon: 109.468884533,

            lat: 30.289012191,

            color: Cesium.Color.BLUE,

            size: 15

          ,

         

            id: 13,

            lon: 113.414585069,

            lat: 30.368350431,

            color: Cesium.Color.SALMON,

            size: 15

          ,

         

            id: 14,

            lon: 112.892742589,

            lat: 30.409306203,

            color: Cesium.Color.WHITE,

            size: 15

          ,

         

            id: 15,

            lon: 113.16085371,

            lat: 30.667483468,

            color: Cesium.Color.SALMON,

            size: 15

          ,

         

            id: 16,

            lon: 110.670643354,

            lat: 31.74854078,

            color: Cesium.Color.PINK,

            size: 15

         

        ],

        options:

          name: "",

          polyline:

            width: 2,

            material: [Cesium.Color.GREEN, 3000]

         

       

      ;

      this.createFlyLines(data);

    ,

    createFlyLines(data)

      const center = data.center;

      const cities = data.points;

      const startPoint = Cesium.Cartesian3.fromDegrees(

        center.lon,

        center.lat,

        0

      );

      //中心点

      this.viewer.entities.add(

        position: startPoint,

        point:

          pixelSize: center.size,

          color: center.color

       

      );

      //大批量操作时,临时禁用事件可以提高性能

      this.viewer.entities.suspendEvents();

      //散点

      cities.map(city =>

        let material = new Cesium.PolylineTrailMaterialProperty(

          color: Cesium.Color.GREEN,

          duration: 3000,

          trailImage: "images/colors1.png"

        );

        const endPoint = Cesium.Cartesian3.fromDegrees(city.lon, city.lat, 0);

        this.viewer.entities.add(

          position: endPoint,

          point:

            pixelSize: city.size - 10,

            color: city.color

         

        );

        this.viewer.entities.add(

          polyline:

            positions: this.generateCurve(startPoint, endPoint),

            width: 2,

            material: material

         

        );

      );

      this.viewer.entities.resumeEvents();

      this.viewer.flyTo(this.viewer.entities);

    ,

    /**

    * 生成流动曲线

    * @param startPoint 起点

    * @param endPoint 终点

    * @returns Array

    */

    generateCurve(startPoint, endPoint)

      let addPointCartesian = new Cesium.Cartesian3();

      Cesium.Cartesian3.add(startPoint, endPoint, addPointCartesian);

      let midPointCartesian = new Cesium.Cartesian3();

      Cesium.Cartesian3.divideByScalar(addPointCartesian, 2, midPointCartesian);

      let midPointCartographic = Cesium.Cartographic.fromCartesian(

        midPointCartesian

      );

      midPointCartographic.height =

        Cesium.Cartesian3.distance(startPoint, endPoint) / 5;

      let midPoint = new Cesium.Cartesian3();

      Cesium.Ellipsoid.WGS84.cartographicToCartesian(

        midPointCartographic,

        midPoint

      );

      let spline = new Cesium.CatmullRomSpline(

        times: [0.0, 0.5, 1.0],

        points: [startPoint, midPoint, endPoint]

      );

      let curvePoints = [];

      for (let i = 0, len = 200; i < len; i++)

        curvePoints.push(spline.evaluate(i / len));

     

      return curvePoints;

   

 

;

</script>

<style lang="scss" >

</style>

关于Three.js实现智慧城市我实现的一些特效

关于所有特效的集成效果可见知乎上我发的视频https://www.zhihu.com/zvideo/1277995319629037568

1、OD线(着色器实现)

2、透明墙

3、地面扩散粒子
4、地震波

5、发光扩散半球

6、发光旋转四棱锥

7、流动线

8、上升粒子

9、建筑线框
10、圆扩散

11、建筑物纹理流动

12、建筑流动着色器版本

13、粒子地面

14、雷达扫描(着色器实现)

15、flyto

16、mesh动画

17、仿真道路

18、格网地面
19、科技风线框

20、数字柱

21、流动箭头(gif显示有问题)

22、能量罩
23、扫描光带
24、无人机巡航特效
25、线框渲染
26、Xray透视特效
27、类似守望先锋能量护盾
28、光束模拟

以上是关于Cesium流动线纹理的主要内容,如果未能解决你的问题,请参考以下文章

Cesium简介以及离线部署运行

cesium源码研究之uniformMap的自动更新机制

cesium源码研究之uniformMap的自动更新机制

Cesium绘制点、线、面、圆、矩形

Cesium - 离线使用方法

Cesium 自定义Material 系列 (十二)