zoukankan      html  css  js  c++  java
  • 【Cesium】水浪

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <!-- Use correct character set. -->
            <meta charset="utf-8" />
            <!-- Tell IE to use the latest, best version. -->
            <meta http-equiv="X-UA-Compatible" content="IE=edge" />
            <!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
            <meta name="viewport"
                content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" />
            <title>Cesium Viewer</title>
            <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
            <link rel="stylesheet" href="CesiumViewer.css" media="screen" />
        </head>
        <body style="background: #000">
            <div id="cesiumContainer" class="fullWindow"></div>
            <!-- <div id="loadingIndicator" class="loadingIndicator"></div> -->
            <!-- <script src="CesiumViewer.js" type="module"></script> -->
        </body>
        <script src="../../Build/Cesium/Cesium.js"></script>
        <script>
            var viewer = new Cesium.Viewer("cesiumContainer");
            //多边形,可以具有空洞或者拉伸一定的高度
            function createPrimitives(scene) {
                var primitive = new Cesium.Primitive({
                    geometryInstances: new Cesium.GeometryInstance({
                        geometry: new Cesium.PolygonGeometry({
                            polygonHierarchy: new Cesium.PolygonHierarchy(Cesium
                                .Cartesian3.fromDegreesArray([
                                    130.0, 30.0,
                                    150.0, 30.0,
                                    150.0, 10.0,
                                    130.0, 10.0
                                ])
                            ),
                            ///extrudedHeight:10000,
                            height: 5,
                            vertexFormat: Cesium.EllipsoidSurfaceAppearance
                                .VERTEX_FORMAT
    
                        })
                    }),
                    appearance: new Cesium.EllipsoidSurfaceAppearance({
                        aboveGround: false
                    })
                    // ,appearance: new Cesium.EllipsoidSurfaceAppearance({
                    //     material: Cesium.Material.fromType('Checkerboard')
                    // // })
                    // appearance: new Cesium.PerInstanceColorAppearance()
                });
                return primitive
            }
    
            function drawByLocal() {
                var scene = viewer.scene;
    
                //---------------水体-----------------------------------------------------------
                var orangePolygon = viewer.entities.add({
                    name: 'Orange polygon with per-position heights and outline',
                    polygon: {
                        hierarchy: Cesium.Cartesian3.fromDegreesArrayHeights([
                            130.0, 30.0, 1110,
                            150.0, 30.0, 1110,
                            150.0, 10.0, 1110,
                            130.0, 10.0, 1110
                        ]),
                        extrudedHeight: 0,
                        perPositionHeight: true,
                        fill: true,
                        //        material : Cesium.Color.AQUA.withAlpha(0.5),
                        outline: true,
                        outlineColor: Cesium.Color.AQUA
                    },
                });
                viewer.zoomTo(viewer.entities);
                //---------------------------水面--------------------------------------------- 
                var primitive = createPrimitives(scene);
                primitive.appearance.material = new Cesium.Material({
                    fabric: {
                        type: 'Water',
                        uniforms: {
                            // specularMap: "img/waterNormals.jpg",
                            normalMap: "img/waterNs.png",
                            frequency: 100.0,
                            animationSpeed: 0.01,
                            amplitude: 1.0,
                        },
                    }
                });
                scene.primitives.add(primitive);
                // viewer.entities.removeAll();
            }
    
    
            //绘制水面波浪效果
            function drawWater() {
    
                viewer.camera.flyTo({
                    destination: Cesium.Cartesian3.fromDegrees(140, 20, 6000000.0),
                    orientation: {
                        heading: Cesium.Math.toRadians(0.0), //默认朝北0度,顺时针方向,东是90度
                        pitch: Cesium.Math.toRadians(-90), //默认朝下看-90,0为水平看,
                        roll: Cesium.Math.toRadians(0) //默认0
                    }
                });
    
                var waterFace = [
                    130.0, 30.0, 0,
                    150.0, 30.0, 0,
                    150.0, 10.0, 0,
                    130.0, 10.0, 0
                ];
                var waterPrimitive = new Cesium.Primitive({ 
                    geometryInstances: new Cesium.GeometryInstance({
                        geometry: new Cesium.PolygonGeometry({
                            polygonHierarchy: new Cesium.PolygonHierarchy(
                                Cesium.Cartesian3.fromDegreesArrayHeights(waterFace)), 
                        })
                    }),
                    // 可以设置内置的水面shader
                    appearance: new Cesium.EllipsoidSurfaceAppearance({
                        aboveGround: false
                    })
                });
                waterPrimitive.appearance.material = new Cesium.Material({
                    fabric: {
                        type: 'Water',
                        uniforms: {
                            normalMap: "http://127.0.0.1:2141/Apps/CesiumViewer/img/waterNs.png",
                            frequency: 100.0,
                            animationSpeed: 0.01,
                            amplitude: 1.0
                        }
                    }
                });
                waterPrimitive.appearance.fragmentShaderSource = 'varying vec3 v_positionMC;
    varying vec3 v_positionEC;
    varying vec2 v_st;
    void main()
    {
    czm_materialInput materialInput;
    vec3 normalEC = normalize(czm_normal3D * czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0)));
    #ifdef FACE_FORWARD
    normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC);
    #endif
    materialInput.s = v_st.s;
    materialInput.st = v_st;
    materialInput.str = vec3(v_st, 0.0);
    materialInput.normalEC = normalEC;
    materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, materialInput.normalEC);
    vec3 positionToEyeEC = -v_positionEC;
    materialInput.positionToEyeEC = positionToEyeEC;
    czm_material material = czm_getMaterial(materialInput);
    #ifdef FLAT
    gl_FragColor = vec4(material.diffuse + material.emission, material.alpha);
    #else
    gl_FragColor = czm_phong(normalize(positionToEyeEC), material);
                        gl_FragColor.a=0.5;
    #endif
    }
    ' //重写shader,修改水面的透明度
                viewer.scene.primitives.add(waterPrimitive);
    
    
            }
    
            function drawWater2() {
    
                viewer.camera.flyTo({
                    destination: Cesium.Cartesian3.fromDegrees(140, 20, 6000000.0),
                    orientation: {
                        heading: Cesium.Math.toRadians(0.0), //默认朝北0度,顺时针方向,东是90度
                        pitch: Cesium.Math.toRadians(-90), //默认朝下看-90,0为水平看,
                        roll: Cesium.Math.toRadians(0) //默认0
                    }
                });
    
                viewer.scene.globe.depthTestAgainstTerrain = false;
                var waterFace = [
                    130.0, 30.0, 
                    150.0, 30.0, 
                    150.0, 10.0, 
                    130.0, 10.0
                ];
    
                var polygon = new Cesium.PolygonGeometry({
                    polygonHierarchy: new Cesium.PolygonHierarchy(
                        Cesium.Cartesian3.fromDegreesArray(waterFace)
                    )
                });
                var geometry = Cesium.PolygonGeometry.createGeometry(polygon);
    
                var waterPrimitive = new Cesium.Primitive({
                    show: true, // 默认隐藏
                    allowPicking: false,
                    geometryInstances: new Cesium.GeometryInstance({
                        geometry: geometry
                    })
                })
    
                waterPrimitive.appearance = new Cesium.EllipsoidSurfaceAppearance({
                    // aboveGround: false
                });
    
                waterPrimitive.appearance.material = new Cesium.Material({
                    fabric: {
                        type: 'Water',
                        uniforms: {
                            normalMap: "http://127.0.0.1:2141/Apps/CesiumViewer/img/waterNs.png",
                            frequency: 100.0,
                            animationSpeed: 0.01,
                            amplitude: 10.0
                        }
                    }
                })
                waterPrimitive.appearance.fragmentShaderSource = 'varying vec3 v_positionMC;
    varying vec3 v_positionEC;
    varying vec2 v_st;
    void main()
    {
    czm_materialInput materialInput;
    vec3 normalEC = normalize(czm_normal3D * czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0)));
    #ifdef FACE_FORWARD
    normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC);
    #endif
    materialInput.s = v_st.s;
    materialInput.st = v_st;
    materialInput.str = vec3(v_st, 0.0);
    materialInput.normalEC = normalEC;
    materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, materialInput.normalEC);
    vec3 positionToEyeEC = -v_positionEC;
    materialInput.positionToEyeEC = positionToEyeEC;
    czm_material material = czm_getMaterial(materialInput);
    #ifdef FLAT
    gl_FragColor = vec4(material.diffuse + material.emission, material.alpha);
    #else
    gl_FragColor = czm_phong(normalize(positionToEyeEC), material);
                gl_FragColor.a=0.5;
    #endif
    }
    ' //重写shader,修改水面的透明度
    
    
                viewer.scene.primitives.add(waterPrimitive);
            }
    
            function drawWaterInstance() {
                var rectangleInstance = new Cesium.GeometryInstance({
                    geometry: new Cesium.RectangleGeometry({
                        rectangle: Cesium.Rectangle.fromDegrees(-140.0, 30.0, -100.0, 40.0),
                        vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT
                    }),
                    id: 'rectangle',
                    attributes: {
                        color: new Cesium.ColorGeometryInstanceAttribute(0.0, 1.0, 1.0, 0.5)
                    }
                });
                var ellipsoidInstance = new Cesium.GeometryInstance({
                    geometry: new Cesium.EllipsoidGeometry({
                        radii: new Cesium.Cartesian3(500000.0, 500000.0, 1000000.0),
                        vertexFormat: Cesium.VertexFormat.POSITION_AND_NORMAL
                    }),
                    modelMatrix: Cesium.Matrix4.multiplyByTranslation(Cesium.Transforms.eastNorthUpToFixedFrame(
                        Cesium.Cartesian3.fromDegrees(-95.59777, 40.03883)), new Cesium.Cartesian3(0.0, 0.0,
                        500000.0), new Cesium.Matrix4()),
                    id: 'ellipsoid',
                    attributes: {
                        color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.AQUA)
                    }
                });
                viewer.scene.primitives.add(new Cesium.Primitive({
                    geometryInstances: [rectangleInstance, ellipsoidInstance],
                    appearance: new Cesium.PerInstanceColorAppearance()
                }));
    
            }
    
    
            setTimeout(function() {
                // drawByLocal()
                // drawWater();
                drawWater2();
                // drawWaterInstance();
            }, 3000)
        </script>
    </html>
    博客地址: http://www.cnblogs.com/defineconst/
    博客版权: 本文以学习、研究和分享为主,欢迎转载和各类爬虫,但必须在文章页面明显位置给出原文链接。 如果文中有不妥或者错误的地方还望高手的您指出,以免误人子弟。如果您有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。
  • 相关阅读:
    【五校联考5day1】登山
    非旋Treap及其可持久化
    自然数幂求和——第二类Strling数
    [JZOJ6011] 【NOIP2019模拟1.25A组】天天爱跑步
    [JZOJ5232] 【NOIP2017模拟A组模拟8.5】带权排序
    FreeRTOS 任务通知模拟消息邮箱
    Python爬虫技术:爬虫时如何知道是否代理ip伪装成功?
    Python网络爬虫入门实战(爬取最近7天的天气以及最高/最低气温)
    Python numpy的基本操作你一般人都不会
    如何正确的使用Python解释器?你之前肯定用错了
  • 原文地址:https://www.cnblogs.com/defineconst/p/15177882.html
Copyright © 2011-2022 走看看