123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- /* 引入Cesium */
- // import * as Cesium from 'Cesium';
- /**
- * 天气场景
- */
- class Weather {
- /**
- * 默认初始化
- * @param {Object} viewer 三维场景
- */
- constructor(viewer) {
- if (!viewer) throw new Cesium.DeveloperError('no viewer object!');
- this._viewer = viewer;
- }
- /**
- * 雨天特效
- * @ignore 忽略注释,注释不生成Doc
- */
- _initRain() {
- this.rainStage = new Cesium.PostProcessStage({
- name: 'jt_rain',
- fragmentShader: this._rain(),
- uniforms: {
- tiltAngle: () => {
- return this.tiltAngle;
- },
- rainSize: () => {
- return this.rainSize;
- },
- rainSpeed: () => {
- return this.rainSpeed;
- }
- }
- });
- this._viewer.scene.postProcessStages.add(this.rainStage);
- }
- /**
- * 雪天特效
- * @ignore 忽略注释,注释不生成Doc
- */
- _initSnow() {
- this.snowStage = new Cesium.PostProcessStage({
- name: 'jt_snow',
- fragmentShader: this._snow(),
- uniforms: {
- snowSize: () => {
- return this.snowSize;
- },
- snowSpeed: () => {
- return this.snowSpeed;
- }
- }
- });
- this._viewer.scene.postProcessStages.add(this.snowStage);
- }
- /**
- * 雾天特效
- * @ignore 忽略注释,注释不生成Doc
- */
- _initFog() {
- this.fogStage = new Cesium.PostProcessStage({
- name: 'jt_fog',
- fragmentShader: this._fog(),
- uniforms: {
- visibility: () => {
- return this.visibility;
- },
- fogColor: () => {
- return this.color;
- }
- }
- });
- this._viewer.scene.postProcessStages.add(this.fogStage);
- }
- /**
- * 雨天粒子效果
- * @ignore 忽略注释,注释不生成Doc
- */
- _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\
- ";
- }
- /**
- * 雪天粒子效果
- * @ignore 忽略注释,注释不生成Doc
- */
- _snow() {
- return "uniform sampler2D colorTexture;\n\
- varying vec2 v_textureCoordinates;\n\
- uniform float snowSpeed;\n\
- uniform float snowSize;\n\
- float snow(vec2 uv,float scale)\n\
- {\n\
- float time=czm_frameNumber/snowSpeed;\n\
- float w=smoothstep(1.,0.,-uv.y*(scale/10.));if(w<.1)return 0.;\n\
- uv+=time/scale;uv.y+=time*2./scale;uv.x+=sin(uv.y+time*.5)/scale;\n\
- uv*=scale;vec2 s=floor(uv),f=fract(uv),p;float k=3.,d;\n\
- p=.5+.35*sin(11.*fract(sin((s+p+scale)*mat2(7,3,6,5))*5.))-f;d=length(p);k=min(d,k);\n\
- k=smoothstep(0.,k,sin(f.x+f.y)*snowSize);\n\
- return k*w;\n\
- }\n\
- void main(void){\n\
- vec2 resolution=czm_viewport.zw;\n\
- vec2 uv=(gl_FragCoord.xy*2.-resolution.xy)/min(resolution.x,resolution.y);\n\
- vec3 finalColor=vec3(0);\n\
- //float c=smoothstep(1.,0.3,clamp(uv.y*.3+.8,0.,.75));\n\
- float c=0.;\n\
- c+=snow(uv,30.)*.0;\n\
- c+=snow(uv,20.)*.0;\n\
- c+=snow(uv,15.)*.0;\n\
- c+=snow(uv,10.);\n\
- c+=snow(uv,8.);\n\
- c+=snow(uv,6.);\n\
- c+=snow(uv,5.);\n\
- finalColor=(vec3(c));\n\
- gl_FragColor=mix(texture2D(colorTexture,v_textureCoordinates),vec4(finalColor,1),.5);\n\
- }\n\
- ";
- }
- /**
- * 雾天粒子效果
- * @ignore 忽略注释,注释不生成Doc
- */
- _fog() {
- return "uniform sampler2D colorTexture;\n\
- uniform sampler2D depthTexture;\n\
- uniform float visibility;\n\
- uniform vec4 fogColor;\n\
- varying vec2 v_textureCoordinates; \n\
- void main(void) \n\
- { \n\
- vec4 origcolor = texture2D(colorTexture, v_textureCoordinates); \n\
- float depth = czm_readDepth(depthTexture, v_textureCoordinates); \n\
- vec4 depthcolor = texture2D(depthTexture, v_textureCoordinates); \n\
- float f = visibility * (depthcolor.r - 0.3) / 0.2; \n\
- if (f < 0.0) f = 0.0; \n\
- else if (f > 1.0) f = 1.0; \n\
- gl_FragColor = mix(origcolor, fogColor, f); \n\
- }\n";
- }
- /**
- * 移除雪天效果
- * @ignore 忽略注释,注释不生成Doc
- */
- _removeSnow() {
- if (!this._viewer || !this.snowStage) return;
- this._viewer.scene.postProcessStages.remove(this.snowStage);
- // this.snowStage.destroy();
- delete this.snowSize;
- delete this.snowSpeed;
- }
- /**
- * 移除雨天效果
- * @ignore 忽略注释,注释不生成Doc
- */
- _removeRain() {
- 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;
- }
- /**
- * 移除雾天效果
- * @ignore 忽略注释,注释不生成Doc
- */
- _removeFog() {
- if (!this._viewer || !this.fogStage) return;
- this._viewer.scene.postProcessStages.remove(this.fogStage);
- // this.fogStage.destroy();
- delete this.visibility;
- delete this.color;
- }
- }
- /**
- * 通用对外公开函数
- */
- Object.assign(Weather.prototype, /** @lends Weather.prototype */ {
- /**
- * 开启雨天特效
- * @param {Object} options 具有以下属性:
- * @param {Number} [options.tiltAngle=-0.6] 倾斜角度,负数向右,正数向左
- * @param {Number} [options.rainSize=0.3] 雨大小
- * @param {Number} [options.rainSpeed=-60.0] 雨速
- */
- addRainEffect(options) {
- options = options || {};
- this.tiltAngle = Cesium.defaultValue(options.tiltAngle, -0.6);
- this.rainSize = Cesium.defaultValue(options.rainSize, 0.3);
- this.rainSpeed = Cesium.defaultValue(options.rainSpeed, 60.0);
- this._initRain();
- },
- /**
- * 开启雪天特效
- * @param {Object} options 具有以下属性:
- * @param {Number} [options.snowSize=0.02] 雪大小,最好小于0.02,默认可不写,
- * @param {Number} [options.snowSpeed=60.0] 雪速,默认可不写
- */
- addSnowEffect(options) {
- options = options || {};
- this.snowSize = Cesium.defaultValue(options.snowSize, 0.02);
- this.snowSpeed = Cesium.defaultValue(options.snowSpeed, 60.0);
- this._initSnow();
- },
- /**
- * 开启雾天特效
- * @param {Object} options 具有以下属性:
- * @param {Number} [options.visibility=-0.1]
- * @param {Number} [options.color=0.3]
- * @param {Number} [options.show]
- */
- addFogEffect(options) {
- options = options || {};
- this.visibility = Cesium.defaultValue(options.visibility, 0.1);
- this.color = Cesium.defaultValue(options.color, new Cesium.Color(0.8, 0.8, 0.8, 0.5));
- this._show = Cesium.defaultValue(options.show, !0);
- this._initFog();
- },
- /**
- * 移除天气特效
- */
- removeEffect() {
- if (this.snowStage) {
- this._removeSnow();
- }
- if (this.rainStage) {
- this._removeRain();
- }
- if (this.fogStage) {
- this._removeFog();
- }
- }
- });
- export default Weather;
|