cesium添加下雨效果

class RainEffect {
   constructor(viewer, options) {
       if (!viewer) throw new Error('no viewer object!');
       options = options || {};
       //倾斜角度,负数向右,正数向左
       this.tiltAngle = Cesium.defaultValue(options.tiltAngle, -.6);
       this.rainSize = Cesium.defaultValue(options.rainSize, 0.3);
       this.rainSpeed = Cesium.defaultValue(options.rainSpeed, 60.0);
       this.viewer = viewer;
       this.init();
   }

   init() {
       this.rainStage = new Cesium.PostProcessStage({
           name: 'czm_rain',
           fragmentShader: this.rain(),
           uniforms: {
               tiltAngle: () => {
                   return this.tiltAngle;
               },
               rainSize: () => {
                   return this.rainSize;
               },
               rainSpeed: () => {
                   return this.rainSpeed;
               }
           }
       });
       this.viewer.scene.postProcessStages.add(this.rainStage);
   }

   destroy() {
       if (!this.viewer || !this.rainStage) return;
       this.viewer.scene.postProcessStages.remove(this.rainStage);
       this.rainStage.destroy();
       delete this.tiltAngle;
       delete this.rainSize;
       delete this.rainSpeed;
   }

   show(visible) {
       this.rainStage.enabled = visible;
   }

   rain() {
       return "uniform sampler2D colorTexture;\n\
               varying vec2 v_textureCoordinates;\n\
               uniform float tiltAngle;\n\
               uniform float rainSize;\n\
               uniform float rainSpeed;\n\
               float hash(float x) {\n\
                   return fract(sin(x * 133.3) * 13.13);\n\
               }\n\
               void main(void) {\n\
                   float time = czm_frameNumber / rainSpeed;\n\
                   vec2 resolution = czm_viewport.zw;\n\
                   vec2 uv = (gl_FragCoord.xy * 2. - resolution.xy) / min(resolution.x, resolution.y);\n\
                   vec3 c = vec3(.6, .7, .8);\n\
                   float a = tiltAngle;\n\
                   float si = sin(a), co = cos(a);\n\
                   uv *= mat2(co, -si, si, co);\n\
                   uv *= length(uv + vec2(0, 4.9)) * rainSize + 1.;\n\
                   float v = 1. - sin(hash(floor(uv.x * 100.)) * 2.);\n\
                   float b = clamp(abs(sin(20. * time * v + uv.y * (5. / (2. + v)))) - .95, 0., 1.) * 20.;\n\
                   c *= v * b;\n\
                   gl_FragColor = mix(texture2D(colorTexture, v_textureCoordinates), vec4(c, 1), .5);\n\
               }\n\
               ";
   }
}

Cesium.RainEffect = RainEffect;

使用 :

// 引入
require('./js/rain-effect')

// 开启下雨效果
this.effect = new Cesium.RainEffect(viewer, {
  tiltAngle: -0.1, //倾斜角度
  rainSize: 0.6,   // 雨大小
  rainSpeed: 120.0 // 雨速
})

关闭下雨效果
this.effect.destroy()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cesium是一种开源的虚拟地球浏览器,可以用于呈现三维地球上的地理空间数据。Cesium通过其强大的图形渲染引擎和开放的插件系统,可以实现流动效果。 要实现流动,首先需要将动态数据加载到Cesium中。Cesium支持各种数据格式,如GeoJSON、KML、Shapefile等,可以通过加载这些数据文件来获取实时或历史地理空间数据。数据可以包含地球表面上的对象,例如河流、风向、海洋流等。将这些数据加载到Cesium中后,即可在三维地球上呈现流动效果。 在数据加载后,可以使用Cesium提供的API来实现流动效果。例如,可以使用Cesium的动画功能来控制时间流逝,并在地球上移动对象。这样,地球上的河流、风向箭头或海洋流线就可以随着时间的推移动态展示其流动状态。通过调整时间流逝的速度和其他动画参数,可以实现不同的流动效果,从而更好地展示地理空间数据。 此外,Cesium还支持自定义流动效果。开发人员可以使用Cesium的开放插件系统创建自定义的流动效果。通过使用Cesium的图形渲染引擎和JavaScript编程接口,可以实现各种各样的流动效果,满足不同的需求和创意。 总之,Cesium通过其强大的图形渲染引擎和开放的插件系统,可以实现流动效果。通过加载动态数据,并使用Cesium的动画功能或自定义插件,可以在三维地球上展示各种流动状态的地理空间数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值