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

news/2024/11/28 6:33:57/文章来源:https://www.cnblogs.com/telwanggs/p/18570739

一些智慧城市项目经常需要加载建筑白膜数据(3dtiles),并制作炫酷的炫光效果,在cesium中可以使用自定义着色器修改白膜建筑的外观。

1.首先,加载3Dtiles格式的建筑白膜数据,这里我们使用一个免费的数据链接:

data.mars3d.cn/3dtiles/jzw…

这是mars3D提供的一个链接,发送请求就会返回3Dtiles建筑数据,我们用cesium提供的方法加载一下:

 
js
代码解读
复制代码
var viewer = new Cesium.Viewer("cesiumContainer", {
        geocoder: false, //是否显示地名查找工具
        homeButton: false, //是否显示首页位置工具
        sceneModePicker: false, //是否显示视角模式切换工具
        baseLayerPicker: false, //是否显示默认图层选择工具
        navigationHelpButton: false, //是否显示导航帮助工具
        animation: false, //是否显示动画工具
        timeline: false, //是否显示时间轴工具
        fullscreenButton: false, //是否显示全屏按钮工具
});
//启用实验性功能
Cesium.ExperimentalFeatures.enableModelExperimental = true;


//加载建筑数据,赋给变量tilesets
let tilesets = viewer.scene.primitives.add(
        new Cesium.Cesium3DTileset({
                url: "http://data.mars3d.cn/3dtiles/jzw-hefei/tileset.json", 
        })
);

 

可以看到,建筑已经有了一定的颜色,这是被提前设置好的,但是这个效果远远不能满足我们的需求,我们先改一下它的颜色:

 
js
代码解读
复制代码
tilesets.readyPromise.then(function (tileset) {
        tileset.style = new Cesium.Cesium3DTileStyle({
                color: {
                        conditions: [["true", "color('rgb(51, 153, 255)',1)"]],
                },
        });
        viewer.flyTo(tileset);
});

 

然后就是最重要的,我们需要使用cesium1.87+提供的customShaderAPI,来自定义shader

 
js
代码解读
复制代码

var customShader = new Cesium.CustomShader({
//不考虑光照模型
lightingModel: Cesium.LightingModel.UNLIT,
//修改片元着色器
fragmentShaderText: `
    void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {
            float _baseHeight = 0.0; // 物体的基础高度,需要修改成一个合适的建筑基础高度
            float _heightRange = 60.0; // 高亮的范围(_baseHeight ~ _baseHeight + _      heightRange) 默认是 0-60米
            float _glowRange = 300.0; // 光环的移动范围(高度)
        float vtxf_height = fsInput.attributes.positionMC.z-_baseHeight;
        float vtxf_a11 = fract(czm_frameNumber / 120.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);
    }
    `,
});
//将定义好的着色器作用域建筑tilesets
tilesets.customShader = customShader;

这个时候再看效果,明显就不一样了:

 

当然,这个影像地面不好看,也需要改一改,这里可以借用我上一篇文章写的方法

# 修改底图颜色为蓝色科技范儿

修改完地图颜色后,再看效果:

 

 

这感觉明显就不一样了。


作者:小前端端
链接:https://juejin.cn/post/7277802797473644578
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

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,其灵感来自于热力学:一个分布可以通过不断地添…

js写飞机大战小游戏

第一步,写一个html页面<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>飞机大战</title> <style>body { margin: 0; }canvas { display: block; background-color: #000; } </sty…

面试课程__性能测试讲解(5.1)

一、你做过性能测试吗? 方法1:做过 方法2:在公司性能是专门性能小组做的,但是我也会做 二、性能测试有哪些类型? (1)压力测试(破坏性测试) 压力测试是系统在一定饱和状态下,例如:cpu、内存、磁盘io在饱和使用情况下,不断给系统施加压力,看系统处理能力,以及系统是…