cesium 添加动态波纹效果 圆形扩散效果 波纹材质

56 篇文章 1 订阅

一、扩展材质

/**
         * 水波纹扩散材质
         * @param {*} options
         * @param {String} options.color 颜色
         * @param {Number} options.duration 持续时间 毫秒
         * @param {Number} options.count 波浪数量
         * @param {Number} options.gradient 渐变曲率
         */
        function CircleWaveMaterialProperty(options) {
            this._definitionChanged = new Cesium.Event();
            this.color = Cesium.defaultValue(options.color && new Cesium.Color.fromCssColorString(options.color), Cesium.Color.RED);
            this.duration = Cesium.defaultValue(options.duration, 1000);
            this.count = Cesium.defaultValue(options.count, 2);
            if (this.count <= 0) {
                this.count = 1;
            }
            this.gradient = Cesium.defaultValue(options.gradient, 0.1);
            if (this.gradient > 1) {
                this.gradient = 1;
            }
            this.time = new Date().getTime();
        }
        Object.defineProperties(CircleWaveMaterialProperty.prototype, {
            isConstant: {
                get: function () {
                    return false;
                },
            },
            definitionChanged: {
                get: function () {
                    return this._definitionChanged;
                },
            },
            color: Cesium.createPropertyDescriptor('color'),
            gradient: Cesium.createPropertyDescriptor('gradient'),
            duration: Cesium.createPropertyDescriptor('duration'),
            count: Cesium.createPropertyDescriptor('count'),
        });
        CircleWaveMaterialProperty.prototype.getType = function () {
            return Cesium.Material.CircleWaveMaterialType;
        };
        CircleWaveMaterialProperty.prototype.getValue = function (time, result) {
            if (!Cesium.defined(result)) {
                result = {};
            }
            result.color = Cesium.Property.getValueOrClonedDefault(this.color, time, Cesium.Color.WHITE, result.color);
            result.time = ((new Date().getTime() - this.time) % this.duration) / this.duration;
            result.count = this.count;
            result.gradient = 1 + 10 * (1 - this.gradient);
            return result;
        };
        CircleWaveMaterialProperty.prototype.equals = function (other) {
            const reData =
                this === other ||
                (other instanceof CircleWaveMaterialProperty
                    && Cesium.Property.equals(this.color, other.color)
                    && Cesium.Property.equals(this.duration, other.duration)
                    && Cesium.Property.equals(this.count, other.count)
                    && Cesium.Property.equals(this.gradient, other.gradient));
            return reData;
        };
        Cesium.CircleWaveMaterialProperty = CircleWaveMaterialProperty;
        Cesium.Material.CircleWaveMaterialType = 'CircleWaveMaterial';
        Cesium.Material.CircleWaveSource = `
                      czm_material czm_getMaterial(czm_materialInput materialInput) {
                        czm_material material = czm_getDefaultMaterial(materialInput);
                        material.diffuse = 1.5 * color.rgb;
                        vec2 st = materialInput.st;
                        vec3 str = materialInput.str;
                        float dis = distance(st, vec2(0.5, 0.5));
                        float per = fract(time);
                        if (abs(str.z) > 0.001) {
                          discard;
                        }
                        if (dis > 0.5) {
                          discard;
                        } else {
                          float perDis = 0.5 / count;
                          float disNum;
                          float bl = .0;
                          for (int i = 0; i <= 9; i++) {
                            if (float(i) <= count) {
                              disNum = perDis *float(i) - dis + per / count;
                              if (disNum > 0.0) {
                                if (disNum < perDis) {
                                  bl = 1.0 - disNum / perDis;
                                } else if(disNum - perDis < perDis) {
                                  bl = 1.0 - abs(1.0 - disNum / perDis);
                                }
                                material.alpha = pow(bl, gradient);
                              }
                            }
                          }
                        }
                        return material;
                      }
                      `;
        Cesium.Material._materialCache.addMaterial(Cesium.Material.CircleWaveMaterialType, {
            fabric: {
                type: Cesium.Material.CircleWaveMaterialType,
                uniforms: {
                    color: new Cesium.Color(181, 241, 254, 1),
                    time: 1,
                    count: 1,
                    gradient: 0.1,
                },
                source: Cesium.Material.CircleWaveSource,
            },
            translucent: function () {
                return true;
            },
        });

二、调用:添加entity 

viewer.entities.add({
                    position: Cesium.Cartesian3.fromDegrees(longitude, latitude, height),
                    ellipse: {
                        semiMinorAxis: 10,
                        semiMajorAxis: 10,
                        height: height,
                        material: new Cesium.CircleWaveMaterialProperty({
                            color: '#FFCB33',
                            duration: 1000,
                            gradient: 0,
                            count: 3,
                        }),
                    },
                })

电子围栏效果参考:cesium 动态墙效果 电子围栏效果-CSDN博客

  • 13
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cesium JS中,添加波纹效果可以通过使用shader来实现。一种实现方式是使用叫做“水面波纹”的shader片段,这将在三维地球上显示一个水面波纹效果。以下是一些基本的步骤和代码示例: 1.首先,需要为水面波纹效果创建一个材质(Material)实例。 ```javascript var waveMaterial = new Cesium.Material({ fabric: { uniforms: { time: 0 }, source: ` uniform float time; varying vec2 v_texcoord; void main() { vec2 uv = v_texcoord.xy; float x = mod(uv.x + time, 1.0); float y = mod(uv.y + time, 1.0); float mov0 = x * (1.0 - x); float mov1 = y * (1.0 - y); float mov2 = (1.-x) * (y); vec2 mov = vec2(mov0, mov1 * mov2); vec4 texColor = texture2D(image, vec2(mov.x*.1+uv.x, mov.y*.1+uv.y)); texColor = texColor * vec4(.2, .2, .5, 1.0); gl_FragColor = texColor; } ` } }); ``` 2.接下来,需要使用材质将它应用于一个实体(Entity)或表面。这可以通过将材质传递给实体的材质属性或表面属性来完成。 ```javascript var waveEntity = viewer.entities.add({ name: 'Wave', position: Cesium.Cartesian3.fromDegrees(-75.62898254394531, 40.02804946899414, 0), cylinder: { length: 100000, topRadius: 1000, bottomRadius: 1000, material: waveMaterial } }); ``` 3.最后,在render loop中更新材质中的时间属性来更新水面波纹的动画效果。 ```javascript viewer.scene.preRender.addEventListener(function(scene, time) { waveMaterial.uniforms.time = time * 0.001; }); ``` 使用这些步骤,您就可以在Cesium JS中添加波纹效果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值