开源!矢量建筑白模泛光特效以及全国77个大中城市的矢量shp数据获取!

大家好,我是日拱一卒的攻城师不浪,致力于前沿科技探索,摸索小而美工作室,这是2025年输出的第38/100篇原创文章。

效果预览

只是单单的一个白模杵在那,总是感觉少点什么,若是能给它们增加一点泛光特效,特别是在夜晚,定能给场景增添不少乐趣。

之前看到网上大多数的技术方案,是去修改3dtiles 里的一个非常深度的属性_source,但是如果Cesium版本在1.102之后,这个属性貌似已经不复存在了,给不少人带去了烦恼。

百思不得其解,为什么这博主行,我不行,是不是骗我?

要不说这么多人骂Cesium开源团队呢,确实该骂,Cesium的团队在升级版本的时候,真是一点都不考虑向后兼容啊!这也是一直以来被开发者诟病的原因之一。确实带来了不少麻烦。

其实,个人认为Cesium是一个非常强大的框架,涉及了多个领域知识,它本不该只有13K的star~

好了,今天给大家带来白模泛光的另一种技术方案:自定义Shader(CustomShader

数据处理

想批量创建白模,手动创建当然是不现实的,一般都会有一个矢量建筑数据shp文件,(如果没有的话,我这里有全国大中77个城市的数据,关注公众号后台回复:白模,即可获取)并且会有一个高度字段,当然,是哪个字段,那就得根据具体数据具体分析了。

拿到shp文件,我们就可以去用专业的工具去构建3dtiles了,这里博主一直用的是cesiumlab,进入到"通用模型切片",切一刀即可。

用的比较顺手了,且是免费开源的。谁让它带了个"cesium"字样呢,我一开始以为是官方的呢,太鸡贼了也。

不过还有类似的工具如:dasviewer,这类工具其实很多,我就不再一一列举了,选择适合自己的即可。

数据渲染

数据处理好之后,我们就可以在Cesium中加载3dtiles了。怎么加载3dtiles应该不用我写了吧。。。算了,啰嗦两句吧

js 复制代码
const addBuildings = async () => {
  const url = "/models/tileset.json";
  const tilesetUrl = await Cesium.Cesium3DTileset.fromUrl(url);
  const build3Dtileset = viewer.scene.primitives.add(tilesetUrl);
}

自定义shader

这里我们使用Cesium的原生接口CustomShader,自定义片元着色器

js 复制代码
build3Dtileset.style = new Cesium.Cesium3DTileStyle({
    color: {
      conditions: [['true', "color('rgb(51, 153, 255)',1)"]]
    },
  });
  const customShader = new Cesium.CustomShader({
    //不考虑光照模型
    lightingModel: Cesium.LightingModel.UNLIT,
    fragmentShaderText: `
      void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {
      float bh = 0.0; // 物体的基础高度,需要修改成一个合适的建筑基础高度
      float hR = 100.0; // 高亮的范围
      float gR = 400.0; // 光环的移动范围(高度)
      float vtxf_height = fsInput.attributes.positionMC.z-bh;
      float vtxf_a11 = fract(czm_frameNumber / 360.0) * 3.14159265 * 2.0;
      float vtxf_a12 = vtxf_height / hR + 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 / gR, 0.0, 1.0);
      vtxf_a13 = abs(vtxf_a13 - 0.5) * 2.0;
      float vtxf_diff = step(0.01, abs(vtxf_h - vtxf_a13));
      material.diffuse += material.diffuse * (1.0 - vtxf_diff);
    }     
    `,
  });
  //将定义好的着色器作用域建筑tilesets
  build3Dtileset.customShader = customShader;

OK,完整的源码已经都贴出来了,是不是比老版本简单很多了,也不用费劲巴拉的去一个一个属性深挖了,有时候还挖不到,全看脸🐕。

总结

创建一个完整的白模泛光的数据主要就3步:

  • 数据获取

  • 数据处理

  • 自定义Shader

数据如果没有的话,我这里有全国大中77个城市的数据,关注公众号后台回复:白模,即可获取。

【开源地址】:github.com/tingyuxuan2...

若想获取全国各地更全更新的白模矢量数据以及数据处理教程的的可以看看不浪的Cesium教程 ,教程《Cesium从入门到实战》,将Cesium的知识点进行串联,让不了解Cesium的小伙伴拥有一个完整的学习路线,并最终完成一个智慧城市的完整项目,课程最近也更新了很多进阶内容,想了解课程大纲,+作者:brown_7778(备注来意)。
有需要进可视化&Webgis交流群可以加我:brown_7778(备注来意)。

相关推荐
mldong5 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排5 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60616 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角7 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!7 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰7 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi9 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen9 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马10 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒10 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端