ansel0926
2022-05-16 cee67c9f4623f287ce96901763963d50cdc24736
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
var PrimitiveWaterFace = (
    function () {
        var degreesArrayHeights;
        var fragmentShader;
        var normalMapUrl;
        var geometry;
        var appearance;
        var viewer;
        function _(options) {
            viewer = options.viewer;
            fragmentShader = FSWaterFace();
            normalMapUrl = options.normalMapUrl;
            if (options.DegreesArrayHeights && options.DegreesArrayHeights.length >= 3) {
                degreesArrayHeights = options.DegreesArrayHeights;
                
            } else {
                degreesArrayHeights = [116.04437, 30.10932, -100,
                         116.04537, 30.10932, -120,
                         116.04537, 30.11032, -100,
                         116.04437, 30.11032, -120,
                         116.04437, 30.10932, -100];
            }      
            if (options.extrudedHeight) {
                geometry = CreateGeometry(degreesArrayHeights, options.extrudedHeight);
            } else {
                geometry = CreateGeometry(degreesArrayHeights);
            }
            
            appearance = CreateAppearence(fragmentShader, normalMapUrl);
 
            this.primitive = viewer.scene.primitives.add(new Cesium.Primitive({
                allowPicking: false,
                geometryInstances: new Cesium.GeometryInstance({
                    geometry: geometry
                }),
                appearance: appearance,
                asynchronous: false
            }));
        }
        //_degreesArrayHeights是一个组成多边形顶点数组[lon,lat,alt]
        function CreateGeometry(_degreesArrayHeights, _extrudedHeight) {
            return new Cesium.PolygonGeometry({
                polygonHierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(_degreesArrayHeights)),
                extrudedHeight: _extrudedHeight?_extrudedHeight:0,
                perPositionHeight: true
            });
        }
 
        function CreateAppearence(fs, url) {
            return new Cesium.EllipsoidSurfaceAppearance({
                material: new Cesium.Material({
                    fabric: {
                        type: 'Water',
                        uniforms: {
                            //水波动的法线纹理贴图
                            normalMap: url,
                            //波的数量
                            frequency: 1000.0,
                            //水震动的速度
                            animationSpeed: 0.05,
                            //振幅大小
                            amplitude: 2
                        }
                    }
                }),
                fragmentShaderSource: fs
            });
        }
         
        function FSWaterFace() {
            return 'varying vec3 v_positionMC;\n\
varying vec3 v_positionEC;\n\
varying vec2 v_st;\n\
\n\
void main()\n\
{\n\
    czm_materialInput materialInput;\n\
    vec3 normalEC = normalize(czm_normal3D * czm_geodeticSurfaceNormal(v_positionMC, vec3(0.0), vec3(1.0)));\n\
#ifdef FACE_FORWARD\n\
    normalEC = faceforward(normalEC, vec3(0.0, 0.0, 1.0), -normalEC);\n\
#endif\n\
    materialInput.s = v_st.s;\n\
    materialInput.st = v_st;\n\
    materialInput.str = vec3(v_st, 0.0);\n\
    materialInput.normalEC = normalEC;\n\
    materialInput.tangentToEyeMatrix = czm_eastNorthUpToEyeCoordinates(v_positionMC, materialInput.normalEC);\n\
    vec3 positionToEyeEC = -v_positionEC;\n\
    materialInput.positionToEyeEC = positionToEyeEC;\n\
    czm_material material = czm_getMaterial(materialInput);\n\
#ifdef FLAT\n\
    gl_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n\
#else\n\
    gl_FragColor = czm_phong(normalize(positionToEyeEC), material,czm_lightDirectionEC);\n\
    gl_FragColor.a = 0.5;\n\
#endif\n\
}\n\
';
        }
 
        _.prototype.remove = function () {
            if (this.primitive != null) {
                viewer.scene.primitives.remove(this.primitive);
                this.primitive = null;
            }
        }
        _.prototype.updateDegreesPosition = function (_degreesArrayHeights, _extrudedHeight) {
            if (this.primitive != null) {
                viewer.scene.primitives.remove(this.primitive);
                if (_degreesArrayHeights && _degreesArrayHeights.length < 3) { return; }
                geometry = CreateGeometry(_degreesArrayHeights, _extrudedHeight?_extrudedHeight:0);
               
                this.primitive = viewer.scene.primitives.add(new Cesium.Primitive({
                    allowPicking: false,
                    geometryInstances: new Cesium.GeometryInstance({
                        geometry: geometry
                    }),
                    appearance: appearance,
                    asynchronous: false
                }));
            } else { return; }
        }
        return _;
    })();