mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-04 01:04:17 +00:00 
			
		
		
		
	点光源
This commit is contained in:
		
							parent
							
								
									ab852fc303
								
							
						
					
					
						commit
						cb3fd0eb4a
					
				
							
								
								
									
										266
									
								
								examples/cesiumEx/7.1.7、点光源.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								examples/cesiumEx/7.1.7、点光源.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,266 @@
 | 
				
			|||||||
 | 
					<!--********************************************************************
 | 
				
			||||||
 | 
					* by dagedezhiyin
 | 
				
			||||||
 | 
					https://blog.csdn.net/dagedezhiyin/article/details/146601505
 | 
				
			||||||
 | 
					*********************************************************************-->
 | 
				
			||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					    <meta charset="UTF-8" />
 | 
				
			||||||
 | 
					    <script src="https://cesium.com/downloads/cesiumjs/releases/1.127/Build/Cesium/Cesium.js"></script>
 | 
				
			||||||
 | 
					    <link href="https://cesium.com/downloads/cesiumjs/releases/1.127/Build/Cesium/Widgets/widgets.css"
 | 
				
			||||||
 | 
					        rel="stylesheet" />
 | 
				
			||||||
 | 
					    <script src="./cesium.map.min.js"></script>
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<body style="
 | 
				
			||||||
 | 
					      margin: 0;
 | 
				
			||||||
 | 
					      overflow: hidden;
 | 
				
			||||||
 | 
					      background: #fff;
 | 
				
			||||||
 | 
					      width: 100%;
 | 
				
			||||||
 | 
					      height: 100%;
 | 
				
			||||||
 | 
					      position: absolute;
 | 
				
			||||||
 | 
					      top: 0;
 | 
				
			||||||
 | 
					    ">
 | 
				
			||||||
 | 
					    <div id="map" style="margin: 0 auto; width: 100%; height: 100%"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <script type="text/javascript">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        function init() { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Cesium.Ion.defaultAccessToken =
 | 
				
			||||||
 | 
					            "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI3ZjQ5ZGUzNC1jNWYwLTQ1ZTMtYmNjYS05YTY4ZTVmN2I2MDkiLCJpZCI6MTE3MTM4LCJpYXQiOjE2NzY0NDUyODB9.ZaNSBIfc1sGLhQd_xqhiSsc0yr8oS0wt1hAo9gbke6M";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let viewer = new Cesium.Viewer("map", {});
 | 
				
			||||||
 | 
					        viewer.imageryLayers.remove(viewer.imageryLayers.get(0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // // 添加底图
 | 
				
			||||||
 | 
					        // var options = {
 | 
				
			||||||
 | 
					        //     style: "elec",
 | 
				
			||||||
 | 
					        //     crs: "WGS84",
 | 
				
			||||||
 | 
					        // };
 | 
				
			||||||
 | 
					        // viewer.imageryLayers.add(
 | 
				
			||||||
 | 
					        //     new Cesium.ImageryLayer(new Cesium.AMapImageryProvider(options))
 | 
				
			||||||
 | 
					        // );
 | 
				
			||||||
 | 
					        // setViewerTheme(viewer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var options = {
 | 
				
			||||||
 | 
					            crs: "WGS84", // 使用84坐标系,默认为:GCJ02
 | 
				
			||||||
 | 
					            style: 4,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        viewer.imageryLayers.add(
 | 
				
			||||||
 | 
					            new Cesium.ImageryLayer(new Cesium.TencentImageryProvider(options))
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 添加白膜
 | 
				
			||||||
 | 
					        initTiles();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        async function initTiles() {
 | 
				
			||||||
 | 
					            // 加载 3D Tiles
 | 
				
			||||||
 | 
					            const palaceTileset = await Cesium.Cesium3DTileset.fromUrl(
 | 
				
			||||||
 | 
					                "http://localhost:81/hefei/tileset.json"
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 添加到场景
 | 
				
			||||||
 | 
					            viewer.scene.primitives.add(palaceTileset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const lightPositionRed = Cesium.Cartesian3.fromDegrees(
 | 
				
			||||||
 | 
					                117.23585,
 | 
				
			||||||
 | 
					                31.83864,
 | 
				
			||||||
 | 
					                100
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const lightPositionGreen = Cesium.Cartesian3.fromDegrees(
 | 
				
			||||||
 | 
					                117.21589,
 | 
				
			||||||
 | 
					                31.840009,
 | 
				
			||||||
 | 
					                100
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const lightPositionBlue = Cesium.Cartesian3.fromDegrees(
 | 
				
			||||||
 | 
					                117.213929,
 | 
				
			||||||
 | 
					                31.8500233,
 | 
				
			||||||
 | 
					                100
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const lightColorRed = new Cesium.Cartesian3(3.0, 0.0, 0.0);
 | 
				
			||||||
 | 
					            const lightColorGreen = new Cesium.Cartesian3(0.0, 3.0, 0.0);
 | 
				
			||||||
 | 
					            const lightColorBlue = new Cesium.Cartesian3(1.0, 3.0, 3.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const lightRadius = 700.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            palaceTileset.customShader = new Cesium.CustomShader({
 | 
				
			||||||
 | 
					                mode: Cesium.CustomShaderMode.REPLACE_MATERIAL,
 | 
				
			||||||
 | 
					                lightingModel: Cesium.LightingModel.UNLIT,
 | 
				
			||||||
 | 
					                uniforms: {
 | 
				
			||||||
 | 
					                    u_lightPositionRed: {
 | 
				
			||||||
 | 
					                        type: Cesium.UniformType.VEC3,
 | 
				
			||||||
 | 
					                        value: lightPositionRed,
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    u_lightPositionGreen: {
 | 
				
			||||||
 | 
					                        type: Cesium.UniformType.VEC3,
 | 
				
			||||||
 | 
					                        value: lightPositionGreen,
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    u_lightPositionBlue: {
 | 
				
			||||||
 | 
					                        type: Cesium.UniformType.VEC3,
 | 
				
			||||||
 | 
					                        value: lightPositionBlue,
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    u_lightColorRed: {
 | 
				
			||||||
 | 
					                        type: Cesium.UniformType.VEC3,
 | 
				
			||||||
 | 
					                        value: lightColorRed,
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    u_lightColorGreen: {
 | 
				
			||||||
 | 
					                        type: Cesium.UniformType.VEC3,
 | 
				
			||||||
 | 
					                        value: lightColorGreen,
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    u_lightColorBlue: {
 | 
				
			||||||
 | 
					                        type: Cesium.UniformType.VEC3,
 | 
				
			||||||
 | 
					                        value: lightColorBlue,
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    u_lightRadius: {
 | 
				
			||||||
 | 
					                        type: Cesium.UniformType.FLOAT,
 | 
				
			||||||
 | 
					                        value: lightRadius,
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                fragmentShaderText: `
 | 
				
			||||||
 | 
					                    void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {                 
 | 
				
			||||||
 | 
					                        vec3 positionWC = (czm_model * vec4(fsInput.attributes.positionMC, 1.0)).xyz;
 | 
				
			||||||
 | 
					                        vec3 normalEC = normalize(fsInput.attributes.normalEC);
 | 
				
			||||||
 | 
					                        vec3 totalLight = vec3(0.0);
 | 
				
			||||||
 | 
					                        // 计算红色光源
 | 
				
			||||||
 | 
					                        vec3 lightDirRed = u_lightPositionRed - positionWC;
 | 
				
			||||||
 | 
					                        float distanceRed = length(lightDirRed);
 | 
				
			||||||
 | 
					                        vec3 lightDirectionRed = normalize(lightDirRed);
 | 
				
			||||||
 | 
					                        float diffuseFactorRed = max(dot(normalEC, lightDirectionRed), 0.9);
 | 
				
			||||||
 | 
					                        vec3 diffuseRed = diffuseFactorRed * u_lightColorRed;
 | 
				
			||||||
 | 
					                        float distanceFactorRed = clamp(distanceRed / u_lightRadius, 0.2, 1.0);
 | 
				
			||||||
 | 
					                        // 修改为你提供的颜色
 | 
				
			||||||
 | 
					                        vec3 customRedColor = vec3(0.0, 0.1, 0.3); // 自定义颜色:#3C96FA (RGB)
 | 
				
			||||||
 | 
					                        // 如果在光源范围外,设置渐变颜色
 | 
				
			||||||
 | 
					                        vec3 mixedColorRed = mix(customRedColor, diffuseRed, 1.0 - distanceFactorRed); // 从蓝色到红色的渐变
 | 
				
			||||||
 | 
					                        totalLight += mixedColorRed;
 | 
				
			||||||
 | 
					                        // 计算绿色光源
 | 
				
			||||||
 | 
					                        vec3 lightDirGreen = u_lightPositionGreen - positionWC;
 | 
				
			||||||
 | 
					                        float distanceGreen = length(lightDirGreen);
 | 
				
			||||||
 | 
					                        vec3 lightDirectionGreen = normalize(lightDirGreen);
 | 
				
			||||||
 | 
					                        float diffuseFactorGreen = max(dot(normalEC, lightDirectionGreen), 0.9);
 | 
				
			||||||
 | 
					                        vec3 diffuseGreen = diffuseFactorGreen * u_lightColorGreen;
 | 
				
			||||||
 | 
					                        float distanceFactorGreen = clamp(distanceGreen / u_lightRadius, 0.2, 1.0);
 | 
				
			||||||
 | 
					                        // 修改为你提供的颜色
 | 
				
			||||||
 | 
					                        vec3 customGreenColor = vec3(0,0.1,0.3); // 自定义颜色:#3C96FA (RGB)
 | 
				
			||||||
 | 
					                        // 如果在光源范围外,设置渐变颜色
 | 
				
			||||||
 | 
					                        vec3 mixedColorGreen = mix(customGreenColor, diffuseGreen, 1.0 - distanceFactorGreen); // 从蓝色到红色的渐变
 | 
				
			||||||
 | 
					                        totalLight += mixedColorGreen;
 | 
				
			||||||
 | 
					                        // 计算蓝色光源
 | 
				
			||||||
 | 
					                        vec3 lightDirBlue = u_lightPositionBlue - positionWC;
 | 
				
			||||||
 | 
					                        float distanceBlue = length(lightDirBlue);
 | 
				
			||||||
 | 
					                        vec3 lightDirectionBlue = normalize(lightDirBlue);
 | 
				
			||||||
 | 
					                        float diffuseFactorBlue = max(dot(normalEC, lightDirectionBlue), 0.9);
 | 
				
			||||||
 | 
					                        vec3 diffuseBlue = diffuseFactorBlue * u_lightColorBlue;
 | 
				
			||||||
 | 
					                        float distanceFactorBlue = clamp(distanceBlue / u_lightRadius, 0.2, 1.0);
 | 
				
			||||||
 | 
					                        // 修改为你提供的颜色
 | 
				
			||||||
 | 
					                        vec3 customBlueColor = vec3(0,0.1,0.3); // 自定义颜色:#3C96FA (RGB)
 | 
				
			||||||
 | 
					                        // 如果在光源范围外,设置渐变颜色
 | 
				
			||||||
 | 
					                        vec3 mixedColorBlue = mix(customBlueColor, diffuseBlue, 1.0 - distanceFactorBlue); // 从蓝色到红色的渐变
 | 
				
			||||||
 | 
					                        totalLight += mixedColorBlue;
 | 
				
			||||||
 | 
					                        material.diffuse = totalLight;
 | 
				
			||||||
 | 
					                        // 计算光环效果(保持原样)
 | 
				
			||||||
 | 
					                        float _baseHeight = -10.0;
 | 
				
			||||||
 | 
					                        float _heightRange = 100.0;
 | 
				
			||||||
 | 
					                        float _glowRange = 300.0;
 | 
				
			||||||
 | 
					                        float vtxf_height = fsInput.attributes.positionMC.z - _baseHeight;
 | 
				
			||||||
 | 
					                        float vtxf_a11 = fract(czm_frameNumber / 100.0) * 3.14159265 * 2.0;
 | 
				
			||||||
 | 
					                        float vtxf_a12 = vtxf_height / _heightRange + sin(vtxf_a11) * 0.1;
 | 
				
			||||||
 | 
					                        material.diffuse *= vec3(vtxf_a12, vtxf_a12, vtxf_a12);
 | 
				
			||||||
 | 
					                        
 | 
				
			||||||
 | 
					                        float vtxf_a13 = fract(czm_frameNumber / 360.0);
 | 
				
			||||||
 | 
					                        float vtxf_h = clamp(vtxf_height / _glowRange, 0.0, 1.0);
 | 
				
			||||||
 | 
					                        vtxf_a13 = abs(vtxf_a13 - 0.5) * 2.0;
 | 
				
			||||||
 | 
					                        float vtxf_diff = step(0.005, abs(vtxf_h - vtxf_a13));
 | 
				
			||||||
 | 
					                        material.diffuse += material.diffuse * (1.0 - vtxf_diff);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                `,
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            viewer.zoomTo(palaceTileset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // setTimeout(() => {
 | 
				
			||||||
 | 
					            //     updateLightPosition(palaceTileset, 121.25, 31.4, "red");
 | 
				
			||||||
 | 
					            // }, 5000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 动态更新光源位置
 | 
				
			||||||
 | 
					        function updateLightPosition(tileset, newLongitude, newLatitude, lightIndex) {
 | 
				
			||||||
 | 
					            const newLightPosition = Cesium.Cartesian3.fromDegrees(
 | 
				
			||||||
 | 
					                newLongitude,
 | 
				
			||||||
 | 
					                newLatitude,
 | 
				
			||||||
 | 
					                100
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 根据 lightIndex 更新不同的光源位置
 | 
				
			||||||
 | 
					            if (lightIndex === "red") {
 | 
				
			||||||
 | 
					                tileset.customShader.uniforms.u_lightPositionRed.value =
 | 
				
			||||||
 | 
					                    newLightPosition;
 | 
				
			||||||
 | 
					            } else if (lightIndex === "green") {
 | 
				
			||||||
 | 
					                tileset.customShader.uniforms.u_lightPositionGreen.value =
 | 
				
			||||||
 | 
					                    newLightPosition;
 | 
				
			||||||
 | 
					            } else if (lightIndex === "blue") {
 | 
				
			||||||
 | 
					                tileset.customShader.uniforms.u_lightPositionBlue.value =
 | 
				
			||||||
 | 
					                    newLightPosition;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        function setViewerTheme(viewer, options = {}) {
 | 
				
			||||||
 | 
					            const baseLayer = viewer.imageryLayers.get(0);
 | 
				
			||||||
 | 
					            if (!baseLayer) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            baseLayer.brightness = options.brightness ?? 0.6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            baseLayer.contrast = options.contrast ?? 1.8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            baseLayer.gamma = options.gamma ?? 0.3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            baseLayer.hue = options.hue ?? 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            baseLayer.saturation = options.saturation || 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            const baseFragShader =
 | 
				
			||||||
 | 
					                viewer.scene.globe._surfaceShaderSet.baseFragmentShaderSource
 | 
				
			||||||
 | 
					                    .sources;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (let i = 0; i < baseFragShader.length; i++) {
 | 
				
			||||||
 | 
					                const strS =
 | 
				
			||||||
 | 
					                    "color = czm_saturation(color, textureSaturation);\n#endif\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let strT =
 | 
				
			||||||
 | 
					                    "color = czm_saturation(color, textureSaturation);\n#endif\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (!options.invertColor) {
 | 
				
			||||||
 | 
					                    strT += `
 | 
				
			||||||
 | 
					                    color.r = 1.0 - color.r;
 | 
				
			||||||
 | 
					                    color.g = 1.0 - color.g;
 | 
				
			||||||
 | 
					                    color.b = 1.0 - color.b;
 | 
				
			||||||
 | 
					                `;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                strT += `
 | 
				
			||||||
 | 
					                color.r = color.r * ${options.filterRGB_R ?? 100}.0/255.0;
 | 
				
			||||||
 | 
					                color.g = color.g * ${options.filterRGB_G ?? 138}.0/255.0;
 | 
				
			||||||
 | 
					                color.b = color.b * ${options.filterRGB_B ?? 230}.0/255.0;
 | 
				
			||||||
 | 
					            `;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                baseFragShader[i] = baseFragShader[i].replace(strS, strT);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            viewer.scene.requestRender();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </script>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
@ -1025,6 +1025,12 @@ var exampleConfig = {
 | 
				
			|||||||
                        thumbnail: "7.1.5、流动线.jpg",
 | 
					                        thumbnail: "7.1.5、流动线.jpg",
 | 
				
			||||||
                        fileName: "7.1.5、流动线"
 | 
					                        fileName: "7.1.5、流动线"
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        name: "7.1.7、点光源",
 | 
				
			||||||
 | 
					                        name_en: "7.1.7、点光源",
 | 
				
			||||||
 | 
					                        thumbnail: "7.1.7、点光源.jpg",
 | 
				
			||||||
 | 
					                        fileName: "7.1.7、点光源"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
                ]
 | 
					                ]
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "map1322345514333231": {
 | 
					            "map1322345514333231": {
 | 
				
			||||||
@ -1069,7 +1075,12 @@ var exampleConfig = {
 | 
				
			|||||||
                        thumbnail: "8.1.5、等值面.jpg",
 | 
					                        thumbnail: "8.1.5、等值面.jpg",
 | 
				
			||||||
                        fileName: "8.1.5、等值面"
 | 
					                        fileName: "8.1.5、等值面"
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        name: "8.1.6、六边形网格",
 | 
				
			||||||
 | 
					                        name_en: "8.1.6、六边形网格",
 | 
				
			||||||
 | 
					                        thumbnail: "8.1.6、六边形网格.jpg",
 | 
				
			||||||
 | 
					                        fileName: "8.1.6、六边形网格"
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
                ]
 | 
					                ]
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "map11cddd3233231": {
 | 
					            "map11cddd3233231": {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								examples/cesiumEx/img/7.1.7、点光源.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								examples/cesiumEx/img/7.1.7、点光源.jpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 8.8 KiB  | 
		Loading…
	
		Reference in New Issue
	
	Block a user