cesium,实现下雨下雪效果切换

honey们,一起来学习cesium天气效果吧^^

本篇文章实现的是简单的HTML页面在线显示,用其他框架的改一下就可以啦

1、CDN引入

<script src='https://cdn.bootcdn.net/ajax/libs/cesium/1.98.1/Cesium.js'></script>
<link href='https://cdn.bootcdn.net/ajax/libs/cesium/1.98.1/Widgets/widgets.css' rel='stylesheet'>

2、页面显示

        设置切换按钮和显示区域

<body>
  <div class="button">
    <button onclick="rainning()">下雨</button>
    <button onclick="snowwing()">下雪</button>
    <button onclick="clean()">晴天</button>
  </div>
  <div id='container'></div>
</body>

3、容器设置

        有需要的控件,可以自行改动为“true”

  const viewer = new Cesium.Viewer('container', {
    // terrainExaggeration: 1.0,
    fullscreenButton: false,
    baseLayerPicker: false,
    selectionIndicator: false,
    sceneModePicker: false,
    navigationHelpButton: false,
    homeButton: false,
    animation: false, // 时间控制器
    geocoder: false,
    timeline: false, //时间线
    infoBox: false,
    scene3DOnly: false,
    vrButton: false,
    shouldAnimate: true,
    navigationInstructionsInitiallyVisible: false,
    imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
      url: 'http://t{s}.tianditu.gov.cn/img_w/wmts?tk=4befa5ab78e9656c766335d1a007f570',
      layer: 'img',
      style: 'default',
      format: 'tiles',
      tileMatrixSetID: 'w',
      subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
      maximumLevel: 18,
    }),
  });
  viewer._cesiumWidget._creditContainer.style.display = 'none';
  //启用光照
  viewer.scene.globe.enableLighting = true

4、特效着色器设置

 /***********************下雨*************************/
const FS_Rain="uniform sampler2D colorTexture;\n\
				varying vec2 v_textureCoordinates;\n\
			\n\
				float hash(float x){\n\
					return fract(sin(x*133.3)*13.13);\n\
			}\n\
			\n\
			void main(void){\n\
			\n\
				float time = czm_frameNumber / 60.0;\n\
			vec2 resolution = czm_viewport.zw;\n\
			\n\
			vec2 uv=(gl_FragCoord.xy*2.-resolution.xy)/min(resolution.x,resolution.y);\n\
			vec3 c=vec3(.6,.7,.8);\n\
			\n\
			float a=-.4;\n\
			float si=sin(a),co=cos(a);\n\
			uv*=mat2(co,-si,si,co);\n\
			uv*=length(uv+vec2(0,4.9))*.3+1.;\n\
			\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\
			\n\
			gl_FragColor = mix(texture2D(colorTexture, v_textureCoordinates), vec4(c,1), 0.5);  \n\
			}\n\
";		
/*************************下雪*********************/
  const FS_Snow="uniform sampler2D colorTexture;\n\
    varying vec2 v_textureCoordinates;\n\
      \n\
    float snow(vec2 uv,float scale)\n\
    {\n\
        float time = czm_frameNumber / 60.0;\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)*0.01);\n\
        return k*w;\n\
    }\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 = 0.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), 0.5); \n\
\n\
    }\n\
";

5、控制按钮

 // 清除特效
    let lastStage=null;
    let removeStage = () => {
            lastStage && viewer.scene.postProcessStages.remove(lastStage), lastStage = null
      }
      //下雨
      function rainning(){
            removeStage()
            var rain = new Cesium.PostProcessStage({
            name: 'hi_rain',
            fragmentShader: FS_Rain
          });
              viewer.scene.postProcessStages.add(rain);
              lastStage=rain
      }
      //下雪
      function snowwing(){
              removeStage()
              var snow = new Cesium.PostProcessStage({
              name: 'hi_snow',
              fragmentShader: FS_Snow
            });
              viewer.scene.postProcessStages.add(snow);
              lastStage=snow
      }
      //晴天
      function clean(){
        removeStage()
        lastStage=null
      }

完整代码

<!DOCTYPE html>
<html lang='en'>

<head>
  <meta charset='UTF-8'>
  <meta http-equiv='X-UA-Compatible' content='IE=edge'>
  <meta name='viewport' content='width=device-width, initial-scale=1.0'>
  <script src='https://cdn.bootcdn.net/ajax/libs/cesium/1.98.1/Cesium.js'></script>
  <link href='https://cdn.bootcdn.net/ajax/libs/cesium/1.98.1/Widgets/widgets.css' rel='stylesheet'>
  <title>Document</title>
  <style>
    html,
    body,
    #container {
      margin: 0;
      padding: 0;
      height: 100%;
    }
    .button{
      background:rgb(5,5,5);
    }
  </style>
</head>

<body>
  <div class="button">
    <button onclick="rainning()">下雨</button>
    <button onclick="snowwing()">下雪</button>
    <button onclick="clean()">晴天</button>
  </div>
  <div id='container'></div>
</body>
<script>
  const viewer = new Cesium.Viewer('container', {
    // terrainExaggeration: 1.0,
    fullscreenButton: false,
    baseLayerPicker: false,
    selectionIndicator: false,
    sceneModePicker: false,
    navigationHelpButton: false,
    homeButton: false,
    animation: false, // 时间控制器
    geocoder: false,
    timeline: false, //时间线
    infoBox: false,
    scene3DOnly: false,
    vrButton: false,
    shouldAnimate: true,
    navigationInstructionsInitiallyVisible: false,
    imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
      url: 'http://t{s}.tianditu.gov.cn/img_w/wmts?tk=4befa5ab78e9656c766335d1a007f570',
      layer: 'img',
      style: 'default',
      format: 'tiles',
      tileMatrixSetID: 'w',
      subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
      maximumLevel: 18,
    }),
  });
  viewer._cesiumWidget._creditContainer.style.display = 'none';
  //启用光照
  viewer.scene.globe.enableLighting = true


  /***********************下雨*************************/
const FS_Rain="uniform sampler2D colorTexture;\n\
				varying vec2 v_textureCoordinates;\n\
			\n\
				float hash(float x){\n\
					return fract(sin(x*133.3)*13.13);\n\
			}\n\
			\n\
			void main(void){\n\
			\n\
				float time = czm_frameNumber / 60.0;\n\
			vec2 resolution = czm_viewport.zw;\n\
			\n\
			vec2 uv=(gl_FragCoord.xy*2.-resolution.xy)/min(resolution.x,resolution.y);\n\
			vec3 c=vec3(.6,.7,.8);\n\
			\n\
			float a=-.4;\n\
			float si=sin(a),co=cos(a);\n\
			uv*=mat2(co,-si,si,co);\n\
			uv*=length(uv+vec2(0,4.9))*.3+1.;\n\
			\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\
			\n\
			gl_FragColor = mix(texture2D(colorTexture, v_textureCoordinates), vec4(c,1), 0.5);  \n\
			}\n\
";		
/*************************下雪*********************/
  const FS_Snow="uniform sampler2D colorTexture;\n\
    varying vec2 v_textureCoordinates;\n\
      \n\
    float snow(vec2 uv,float scale)\n\
    {\n\
        float time = czm_frameNumber / 60.0;\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)*0.01);\n\
        return k*w;\n\
    }\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 = 0.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), 0.5); \n\
\n\
    }\n\
";

      // 清除特效
    let lastStage=null;
    let removeStage = () => {
            lastStage && viewer.scene.postProcessStages.remove(lastStage), lastStage = null
      }
      //下雨
      function rainning(){
            removeStage()
            var rain = new Cesium.PostProcessStage({
            name: 'hi_rain',
            fragmentShader: FS_Rain
          });
              viewer.scene.postProcessStages.add(rain);
              lastStage=rain
      }
      //下雪
      function snowwing(){
              removeStage()
              var snow = new Cesium.PostProcessStage({
              name: 'hi_snow',
              fragmentShader: FS_Snow
            });
              viewer.scene.postProcessStages.add(snow);
              lastStage=snow
      }
      //晴天
      function clean(){
        removeStage()
        lastStage=null
      }

</script>

</html>

实现效果

 

 

着色器设置引用https://blog.csdn.net/qq_40863573/article/details/125327716?spm=1001.2014.3001.5506

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Cesium实现抛物线效果,可以使用贝塞尔曲线来模拟抛物线的路径。以下是实现抛物线效果的步骤: 1. 使用entity方式创建一个新的实体对象。 2. 设置实体的position为抛物线的起始点。 3. 使用polyline实例化一个新的PolylineGraphics对象。 4. 将PolylineGraphics对象的positions属性设置为一个包含抛物线路径上的点的数组。 5. 设置PolylineGraphics对象的material为所需的抛物线材质。 6. 将PolylineGraphics对象添加到viewer中。 下面是一个示例代码,展示了如何在Cesium实现抛物线效果: ```javascript // 创建起始点和终点 var start = Cesium.Cartesian3.fromDegrees(113.9236839, 22.528061); var end = Cesium.Cartesian3.fromDegrees(113.925, 22.53); // 计算控制点 var controlPoint = new Cesium.Cartesian3( (start.x + end.x) / 2, (start.y + end.y) / 2, (start.z + end.z) / 2 + 1000 ); // 计算抛物线路径上的点 var numberOfPoints = 100; var positions = []; for (var i = 0; i <= numberOfPoints; i++) { var t = i / numberOfPoints; var x = (1 - t) * (1 - t) * start.x + 2 * (1 - t) * t * controlPoint.x + t * t * end.x; var y = (1 - t) * (1 - t) * start.y + 2 * (1 - t) * t * controlPoint.y + t * t * end.y; var z = (1 - t) * (1 - t) * start.z + 2 * (1 - t) * t * controlPoint.z + t * t * end.z; positions.push(new Cesium.Cartesian3(x, y, z)); } // 创建实体对象 viewer.entities.add({ polyline: { positions: positions, width: 10, material: new Cesium.PolylineGlowMaterialProperty({ glowPower: 0.5, color: Cesium.Color.YELLOW }) } }); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值