惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
量子位
D
DataBreaches.Net
博客园 - 司徒正美
J
Java Code Geeks
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
B
Blog
The Cloudflare Blog
D
Docker
I
InfoQ
爱范儿
爱范儿
MongoDB | Blog
MongoDB | Blog
腾讯CDC
月光博客
月光博客
Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
S
SegmentFault 最新的问题
GbyAI
GbyAI
有赞技术团队
有赞技术团队

博客园 - zhh

Cesium 实现 FlowMap Unity3D c# 使对象物体始终面向摄像机 Cesium For Unity Convert WGS84 to Earth Centered Earth Fixed 小流域设计洪水计算 cesium自定义st TerrainProviderEdit Redis Server监控数据采集 cesium添加过道corridor Cesium:entity闪烁(点、面以及billboard) arcgis 3.x 打印 CAS Client集群环境的Session问题及解决方案 不能退出登录 Client Server集群模式下session问题[转] quartz数据不完整导致不调度并且报错Couldn‘t store trigger arcgis popup关闭事件 arcgis 叠加图片 watch arcgis 叠加图片 三维地图3DGIS平台技术指标要求规划 Java – Get All Dates Between Two Dates 太阳方位角
Cesium 河道形状
zhh · 2025-02-26 · via 博客园 - zhh
<link href="path/to/cesium/Widgets/widgets.css" rel="stylesheet">
<script src="path/to/cesium/Cesium.js"></script>
<div id="cesiumContainer"></div>

<script>
const viewer = new Cesium.Viewer('cesiumContainer', {
  terrainProvider: Cesium.createWorldTerrain(),
  baseLayer: Cesium.ImageryLayer.fromProviderAsync(Cesium.createTileMapServiceImageryProvider({
    url: Cesium.buildModuleUrl('Assets/Textures/NaturalEarthII')
  }))
});
</script>
const flowMapMaterial = new Cesium.Material({
  fabric: {
    type: 'FlowMapWater',
    uniforms: {
      flowMap: 'path/to/flowmap.png',       // FlowMap 纹理(RG通道编码流向)
      normalMap: 'path/to/waterNormals.jpg',// 基础法线贴图
      speed: 0.3,                          // 流速控制
      amplitude: 1.5,                      // 波纹振幅
      time: 0                              // 时间变量
    },
    source: `
      uniform sampler2D flowMap;
      uniform sampler2D normalMap;
      uniform float speed;
      uniform float amplitude;
      uniform float time;
      
      varying vec2 v_st;
      varying vec3 v_positionEC;

      void main() {
        // 获取 FlowMap 向量场(范围映射到 -1 到 1)
        vec2 flowDir = texture2D(flowMap, v_st).rg * 2.0 - 1.0;
        flowDir *= speed;

        // 双相位插值(防止周期断层)
        float phase0 = fract(time * 0.1);
        float phase1 = fract(time * 0.1 + 0.5);
        vec2 uvOffset0 = flowDir * phase0;
        vec2 uvOffset1 = flowDir * phase1;

        // 混合法线贴图
        vec3 normal0 = texture2D(normalMap, v_st * 10.0 + uvOffset0).rgb;
        vec3 normal1 = texture2D(normalMap, v_st * 10.0 + uvOffset1).rgb;
        float lerpFactor = abs(0.5 - phase0) * 2.0;
        vec3 finalNormal = mix(normal0, normal1, lerpFactor);

        // 计算光照与颜色
        vec3 viewDir = normalize(-v_positionEC);
        vec3 reflected = reflect(viewDir, finalNormal);
        vec4 baseColor = vec4(0.1, 0.3, 0.8, 0.8);
        gl_FragColor = vec4(baseColor.rgb * (0.5 + dot(finalNormal, viewDir)), baseColor.a);
      }
    `
  }
});
// 创建水面几何体(河道形状)
const waterPolygon = viewer.scene.primitives.add(
  new Cesium.Primitive({
    geometryInstances: new Cesium.GeometryInstance({
      geometry: new Cesium.PolygonGeometry({
        polygonHierarchy: new Cesium.PolygonHierarchy(
          Cesium.Cartesian3.fromDegreesArray([
            -75.0, 40.0, -74.5, 40.2, -74.0, 40.0
          ])
        ),
        vertexFormat: Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT,
        extrudedHeight: 0,
        height: 0
      })
    }),
    appearance: new Cesium.EllipsoidSurfaceAppearance({
      material: flowMapMaterial,
      aboveGround: false
    })
  })
);

// 更新时间变量
viewer.scene.preUpdate.addEventListener(() => {
  flowMapMaterial.uniforms.time = Cesium.JulianDate.now().secondsOfDay;
});
flowMapMaterial.uniforms.speed = 0.5;    // 流速(0.1-2.0)
flowMapMaterial.uniforms.amplitude = 2.0;// 波纹高度
flowMapMaterial.uniforms.normalMap = new Cesium.TextureUniform({
  url: 'path/to/new_normalmap.jpg'       // 替换法线贴图
});