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

news/2024/11/28 21:21:37/文章来源:https://www.cnblogs.com/telwanggs/p/18570751

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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/841757.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机入门:独立按键(02)

标题: ​ 51单片机入门:独立按键(02) 一、独立按键的基本结构和功能二、独立按键在单片机的位置三、初次使用独立按键 设计第1个程序,使用按键K1控制D1的亮灭 #include<regx52.h>void main() {while(1){if(P3_1 == 0) // 按下按钮相当于接地 P3_1 == 0; {P2_0 = 0…

【cesium】打造科技感建筑泛光效果

一些智慧城市项目经常需要加载建筑白膜数据(3dtiles),并制作炫酷的炫光效果,在cesium中可以使用自定义着色器修改白膜建筑的外观。 1.首先,加载3Dtiles格式的建筑白膜数据,这里我们使用一个免费的数据链接: data.mars3d.cn/3dtiles/jzw… 这是mars3D提供的一个链接,发送…

k8s容器中的Java进程经常自动被杀

故事背景 主角:低代码项目agile-bpm 时间:2023-08-29 背景:项目通过jenkins部署k8s容器到虚拟机,在一次部署之后,服务发生无限重启的现象,springboot项目起来后没多久(甚至有几次还没启动)就会被杀掉进程,服务宕机了一个晚上。 排查过程 查看日志 通过 kubelet logs 命…

从零开始:苹果手机免越狱群控系统的快速入门指南

对于初次接触苹果手机免越狱群控系统的用户来说,可能会感到有些困惑和不知所措。本章将提供一个详细的快速入门指南,帮助你从零开始,轻松掌握如何设置和使用这项强大的技术。免越狱群控系统概述 苹果手机免越狱群控系统是一种通过合法合规的技术手段,在不破坏iOS系统安全性…

网站模板文字内容修改,如何在网站后台或代码编辑器中修改模板文字内容

修改模板文字内容可以提升网站的信息传达效果。以下是具体步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入模板管理:登录后,点击顶部菜单栏中的“模板”或“主题”。 选择“模板管理”或…

网站模板文字内容修改,如何在网站后台或代码编辑器中准确修改模板文字内容

修改模板文字内容可以提升网站的信息传达效果。以下是如何准确在网站后台或代码编辑器中修改模板文字内容的步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入模板管理:登录后,点击顶部菜单…

本地git分支如何关联远程分支

背景 本文记录一下本地的git仓库如何与远程仓库同步,参考了网友的办法和官方的文档 如果对某些命令有疑惑,可以在命令行输入 git {command} --help 查看git的文档,例如 git remote --help ,会打开本地的帮助文件 操作步骤 首先切到本地仓库所在路径,如果git还没有初始化,…

多校A层冲刺NOIP2024模拟赛26

多校A层冲刺NOIP2024模拟赛26\(T1\) A. 随机游走 \(100pts/100pts\)在树上做临项交换即可。点击查看代码 struct node {ll nxt,to,w; }e[500010]; ll head[500010],v[500010],siz[500010],sum[500010],cnt=0,ans=0,tim=0; struct quality {ll sumt,siz,to,w; }; vector<qual…

支持4种类型的jQuery轮播图插件EasySlides

EasySlides是一款支持4种类型的jQuery轮播图插件。该jquery轮播图采用响应式设计,支持移动设备,内置有大图轮播,多图轮播,封面轮播和圆形轮播四种轮播图模式可供选择。在线演示 下载使用方法 在页面中引入jquery和jquery.easy_slides.js文件,以及样式文件jquery.easy_sl…

Avalonia 中使用 CEF 在 Ubuntu 运行崩溃分析

在 Linux 上使用 Avalonia 和 CefGlue:崩溃分析 介绍 本文主要记录了在 Avalonia 中使用 CefGlue(基于 .NET 的 Chrome 嵌入内核的封装库)时遇到的问题,目的是测试 Avalonia 的 Chrome 内核在 Linux 系统中的兼容性。然而在实际运行时,我们意外地遇到了运行崩溃的问题。环…

视频智能分析助力城市管理革新

在智慧城市建设的大潮中,视频智能分析技术正成为城市管理革新的重要推手。这项技术通过深度学习和人工智能算法,对视频数据进行实时分析和处理,为城市管理提供了前所未有的智能支持。本文将探讨视频智能分析技术在城市管理中的应用内容,以及它如何助力城市治理向更高效、更…

diffusion Policy学习

diffusion model原理 https://segmentfault.com/a/1190000043744225#item-4 https://lilianweng.github.io/posts/2021-07-11-diffusion-models/ 变分自编码器:把某图像变成向量,再用该向量生成图像。 扩散模型是一种特殊的VAE,其灵感来自于热力学:一个分布可以通过不断地添…