首页 > 其他分享 >【cesium】修改底图颜色为蓝色科技范儿

【cesium】修改底图颜色为蓝色科技范儿

时间:2024-11-26 18:22:29浏览次数:12  
标签:baseFragmentShader 底图 1.0 color 代码 filterRGB 范儿 cesium baseLayer

cesium中,默认的底图颜色往往难以满足个性化需求,而【蓝色科技】风格常常备受青睐,本文从实操角度介绍实现方法。

 

简单来说,我们所用的方法叫做【反色滤镜】,总的分为2个步骤,反色,过滤。具体做法如下:

首先要获取目标影像图层,这里不能直接对div进行操作,因为会将地图上的所有元素都反色过滤了。

  js 代码解读 复制代码
 // 获取地图影像图层
  let baseLayer = viewer.imageryLayers.get(0);

其次,定义2个变量,用来控制是否反色,以及过滤的具体值

  js 代码解读 复制代码
  //设置2个变量,用来判断是否进行颜色的翻转和过滤
  baseLayer.invertColor = true;
  baseLayer.filterRGB = [0, 50, 100]; //[255,255,255] = > [0,50,100]

接着要获取着色器,方便后续直接操作着色器,写入修改后的glsl。

  js 代码解读 复制代码
//   更改底图着色器的代码
  const baseFragmentShader =
    viewer.scene.globe._surfaceShaderSet.baseFragmentShaderSource.sources;

通过打印baseFragmentShader,可以看到里面有3个

 

接下来是最关键的步骤,反色+过滤。

  js 代码解读 复制代码
// 循环修改着色器
  for (let i = 0; i < baseFragmentShader.length; i++) {
    // console.log(baseFragmentShader[i]);
    const strS = "color = czm_saturation(color, textureSaturation);\n#endif\n";
    let strT = "color = czm_saturation(color, textureSaturation);\n#endif\n";
    if (baseLayer.invertColor) {
      strT += `
        color.r = 1.0 - color.r;
        color.g = 1.0 - color.g;
        color.b = 1.0 - color.b;
      `;
    }
    if (baseLayer.filterRGB) {
      strT += `
        color.r = color.r*${baseLayer.filterRGB[0]}.0/255.0;
        color.g = color.g*${baseLayer.filterRGB[1]}.0/255.0;
        color.b = color.b*${baseLayer.filterRGB[2]}.0/255.0;
      `;
    }

    baseFragmentShader[i] = baseFragmentShader[i].replace(strS, strT);
  }

因为R、G、B都是从0-1,反色就是用1减去原来的值

  js 代码解读 复制代码
color.r = 1.0 - color.r;
color.g = 1.0 - color.g;
color.b = 1.0 - color.b;

过滤则是要套用公式,对R、G、B进行操作

  js 代码解读 复制代码
color.r = color.r*${baseLayer.filterRGB[0]}.0/255.0;
color.g = color.g*${baseLayer.filterRGB[1]}.0/255.0;
color.b = color.b*${baseLayer.filterRGB[2]}.0/255.0;

strS中的内容是glsl,原本就存在于baseFragmentShader中,而修改后的颜色值,直接用replace进行替换,将strT顶进去,发挥作用。

filterRGB的值可以根据需要进行调整,我试了2个值,都不错 [60, 145, 172] 和[0, 50, 100]

 

 

完整代码如下,可以封装成一个方法被调用。

  js 代码解读 复制代码
export default function modifyMap(viewer) {
  // 获取地图影像图层
  let baseLayer = viewer.imageryLayers.get(0);
  //设置2个变量,用来判断是否进行颜色的翻转和过滤
  baseLayer.invertColor = true;

  baseLayer.filterRGB = [0, 50, 100]; //[255,255,255] = > [0,50,100]
  //   更改底图着色器的代码
  const baseFragmentShader =
    viewer.scene.globe._surfaceShaderSet.baseFragmentShaderSource.sources;
  // console.log(baseFragmentShader);

  // 循环修改着色器
  for (let i = 0; i < baseFragmentShader.length; i++) {
    // console.log(baseFragmentShader[i]);
    const strS = "color = czm_saturation(color, textureSaturation);\n#endif\n";
    let strT = "color = czm_saturation(color, textureSaturation);\n#endif\n";
    if (baseLayer.invertColor) {
      strT += `
        color.r = 1.0 - color.r;
        color.g = 1.0 - color.g;
        color.b = 1.0 - color.b;
      `;
    }
    if (baseLayer.filterRGB) {
      strT += `
        color.r = color.r*${baseLayer.filterRGB[0]}.0/255.0;
        color.g = color.g*${baseLayer.filterRGB[1]}.0/255.0;
        color.b = color.b*${baseLayer.filterRGB[2]}.0/255.0;
      `;
    }

    baseFragmentShader[i] = baseFragmentShader[i].replace(strS, strT);
  }
}
  标签: 前端  
作者:小前端端
链接:https://juejin.cn/post/7276695947705630754
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:baseFragmentShader,底图,1.0,color,代码,filterRGB,范儿,cesium,baseLayer
From: https://www.cnblogs.com/telwanggs/p/18570751

相关文章

  • 【转】cesium之添加天地图
    转自 https://www.cnblogs.com/s313139232/p/16351468.html公共参数:vartoken='7b56038c276128a86a5b946404bf4df4';//服务域名vartdtUrl='https://t{s}.tianditu.gov.cn/';//服务负载子域varsubdomains=['......
  • Cesium教程07_entity进阶
    基于Cesium和Vue的卫星轨道可视化本文介绍了如何使用Cesium和Vue构建一个动态卫星轨道可视化应用。该示例模拟了一个卫星围绕地球轨道运动的场景,并实现了实时的轨迹渲染、卫星扫描范围展示以及摄像头跟随功能。目录项目背景功能展示代码实现模板部分脚本部分样......
  • Cesium教程08_camera使用
    使用Vue和Cesium实现城市天际线视角切换本文将介绍如何使用Vue和Cesium构建一个展示城市天际线的3D场景,并通过按钮切换不同视角,实现场景的动态交互和视角控制。目录项目背景功能展示代码实现模板部分脚本部分样式部分代码解析动态添加建筑物视角切换功能总......
  • Cesium中级开发教程之十五:键控地球
    教程示例网站:https://thomaz529.github.io/一、原理 关闭默认屏幕控制机制,开启ScreenSpaceEventHandler自定义键盘事件,viewer.clock.onTick.addEventListener监听键盘事件,并控制相机的前进后退的操作。w键是前进,s键是后退,a键是向左,d键是向右,q键是抬起,e键是降低。二、效果......
  • Cesium初级开发教程之五:Entity#Polyline
    一、简介二、效果图 三、代码1、测地线constredLine=viewer.entities.add({name:"红线",polyline:{positions:Cesium.Cartesian3.fromDegreesArray([-75,35,-125,35]),width:5,material:Cesium.Color.RED,clampToGround:true,//......
  • Cesium初级开发教程之五:Entity#cylinder
    一、圆锥constredCone=viewer.entities.add({position:Cesium.Cartesian3.fromDegrees(-105.0,40.0,200000.0),cylinder:{length:400000.0,topRadius:0.0,bottomRadius:200000.0,outline:true,material:Cesium.Color.RED,},})......
  • Cesium初级开发教程之六:模型#model
    一、原理cesium只支持glb和gltf两种模型格式,可以通过gltf的模型node控制节点运动,加载模型的方式主要是entity和primitives两种方式。二、效果图三、代码1、entityviewer.trackedEntity可以将相机聚焦到entity上,并可以围绕entity旋转缩放相机,viewFrom可以调整相机围绕en......
  • Cesium for UE-04-一些说明
    目前主要做webgis的工作,UE官方对web的支持截止到了4.23版本,即使是4.23版本之后的4.xx版本也有办法支持,已经有大佬开源了一些方法和工具,不再介绍。即使是4.23想要输出为h5,也是有一定的折腾门槛的。最重要的是【CesiumforUE】不支持4.23,而其支持的版本,目前主流方案就是推流,......
  • 比CesiumLab还好用的工具:免费的倾斜摄影OSGB/3Dtiles编辑转换发布平台
    GIS数据处理工具在现代技术与应用中扮演着至关重要的角色,它们不仅是连接原始地理信息与可分析、可视化数据的桥梁,更是推动地理信息系统(GIS)在各个行业领域深入发展与应用不可或缺的关键工具。选择一款合适的工具直接关系到数据处理、分析和展示的效率和精度,本文将对比GISBox、Ce......
  • 从零搭建Cesium+vue3+vite
    介绍在现代前端开发中,Cesium是一个功能强大的WebGL库,广泛应用于3D地球可视化、空间数据展示等领域。结合Vue3的组件化开发模式,我们可以创建一个高效且可维护的3D地图应用。本文将带你一步步搭建一个简单的Cesium+Vue3项目,并且对各个功能模块进行细致划分,帮助你快......