当前位置: 首页 > news >正文

从零开始搭建开源智慧城市项目(三)上升线效果

前言

上一节实现了添加建筑物线框,模型外墙和道路地面材质添加。这一节准备通过简单的shader实现上升线效果。

思路

简单的说一下思路,通过获取模型顶点坐标所在的高度Z来进行筛选,高度再某一区间内设置成上升线的颜色,其余高度颜色正常,把高度不断上升来让这根上升线不断上升,到一定高度后重置。

ShaderMaterial的组成

实现主要通关Three内自定义材质(ShaderMaterial)来实现,首先来实现一个最简单的ShaderMaterial来看一下这个材质的组成。

  const shader = new THREE.ShaderMaterial({//从程序穿到着色器里面的值,这里先不传值uniforms: {},//顶点着色器vertexShader: `void main(){gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );}`,//片段着色器fragmentShader: `void main(){gl_FragColor = vec4(1.0);}`,});
  1. 顶点着色器(vertexShader ):首先来介绍一下顶点着色器,顶点着色器是用来处理顶点数据的,本例子中的顶点着色器主要代码就一句:
 gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );

先来说一下每个变量的意思

  • position:模型点位数据。

  • modelViewMatrix:视图矩阵,等于camera.matrixWorldInverse * object.matrixWorld,就是模型矩阵和相机矩阵(视图矩阵)的乘积。

  • projectionMatrix:投影矩阵,等于camera.projectionMatrix。

  • gl_Position:矩阵变换后模型点位投影到屏幕上的位置,该值与position的关系如下图。

    image.png

经过上述的矩阵变化,模型就会投影到裁剪坐标系然后经过一系列计算,显示到屏幕上。

  1. 片段着色器 (fragmentShader ):片段着色器是片元的颜色,本例子中的顶点着色器如下:
 gl_FragColor = vec4(1.0,1.0,1.0,1.0);

gl_FragColor是每个片段的颜色,这里统一设置成白色 vec4(1.0,1.0,1.0,1.0)。 然后把这个材质赋给模型

//object.geometry是模型的geometry属性,shader是上面定义的材质const city = new THREE.Mesh(object.geometry, shader);
//把重新生成的模型对象添加到场景里面scene.add(city);

这里的显示效果:

image.png

所有的建筑模型显示白色。

上升线效果实现

  1. 这个效果的实现需要四个值:线上升到的高度height、上升线的颜色uFlowColor、建筑模型的颜色uCityColor、模型点位的高度值z(这个顶点着色器里面有,需要从顶点着色器传到片段着色器中),然后把这些值通过uniforms传入到着色器里面去。着色器代码如下:
   const shader = new THREE.ShaderMaterial({uniforms: {height: this.height,uFlowColor: {value: new THREE.Color("#5588aa"),},uCityColor: {value: new THREE.Color("#FFFFDC"),},},vertexShader: `varying vec3 vPosition;void main(){vPosition = position;gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );}`,fragmentShader: `varying vec3 vPosition;uniform float height;uniform float uStartTime; uniform vec3 uSize;uniform vec3 uFlow;uniform vec3 uFlowColor;uniform vec3 uCityColor;void main(){//模型的基础颜色vec3 distColor=uCityColor;// 流动范围当前点z的高度加上流动线的高度float topY = vPosition.z +5.0;if (height > vPosition.z && height < topY) {// 颜色渐变 distColor = uFlowColor; }gl_FragColor = vec4(distColor, 0.6);}`,transparent: true,});

render添加如下代码

      this.height.value += 0.03;if(this.height.value>100){this.height.value=0.0}

首先说一下render中的代码,render是在每一次渲染中都会执行,在每一帧渲染时把height值逐渐增加,当height大于100的时候重置。

接下来是shader材质的定义,这里我们在uniforms中把需要的上升线的高度height,上升线的颜色uFlowColor,建筑模型的颜色uCityColor进行了传入,然后在vertexShader中把fragmentShader需要的点位属vPosition性通过varying变量实现了两个着色器直接的共用,这样上升效果需要的变量就都齐全了。

在片段着色器中首先定义模型的基本颜色distColor,然后定义流动颜色的位置float topY = vPosition.z +5.0;vPosition.z 是当前点位的z值加上一个宽度就是模型需要着色的部位。下一步进行筛选,筛选点位高度在 vPosition.z-height vPosition.z+0.5-height之间的值进行着色。把这一块的颜色设置成上升片段的颜色(uFlowColor).显示效果如下图:

完整项目源码获取:关注公众号「码农园区」,回复 【智慧城市】,即可获取完整项目源

附送250套精选项目源码

源码截图

 源码获取:关注公众号「码农园区」,回复 【源码】,即可获取全套源码下载链接

相关文章:

从零开始搭建开源智慧城市项目(三)上升线效果

前言 上一节实现了添加建筑物线框&#xff0c;模型外墙和道路地面材质添加。这一节准备通过简单的shader实现上升线效果。 思路 简单的说一下思路&#xff0c;通过获取模型顶点坐标所在的高度Z来进行筛选&#xff0c;高度再某一区间内设置成上升线的颜色&#xff0c;其余高度…...

unity基础(五)地形详解

目录 一 创建地形 二 调整地形大小 三 创建相邻地形 四 创建山峰 五 创建树木 七 添加风 八 添加水 简介: Unity 中的基础地形是构建虚拟场景的重要元素之一。 它提供了一种直观且灵活的方式来创建各种地形地貌&#xff0c;如山脉、平原、山谷等。 通过 Unity 的地形…...

postman接口测试工具详解

Postman 是一个功能强大的 API 开发和测试工具&#xff0c;广泛应用于开发人员和测试人员进行 API 的调试、测试、文档生成等工作。以下是对 Postman 的详细介绍。 1. 功能概览 1.1 请求构建 请求类型: 支持 GET、POST、PUT、DELETE、PATCH、OPTIONS 等多种 HTTP 方法。URL …...

2024年护网行动全国各地面试题汇总(3)作者:————LJS

应急响应基本思路和流程 收集信息&#xff1a;收集客户信息和中毒主机信息&#xff0c;包括样本判断类型&#xff1a;判断是否是安全事件&#xff0c;何种安全事件&#xff0c;勒索、挖矿、断网、DoS 等等抑制范围&#xff1a;隔离使受害⾯不继续扩⼤深入分析&#xff1a;日志分…...

计算机专业的学生要达到什么水平才能进入大厂工作?越早知道越好

计算机专业的学生要达到什么水平才能进入BAT等大厂工作&#xff1f;越早知道越好. 一、算法题 各大公司笔试、面试基本都考这个&#xff0c;别的不说&#xff0c;《剑指Offer》所有题目背下来&#xff0c;Leetcode高频题目刷个一两百遍&#xff0c;搞过ACM也可以&#xff0c;…...

巡检费时费力?试试AI自动巡检

随着企业IT规模不断增长&#xff0c;设备、系统越来越多&#xff0c;运维工作压力也与日俱增。保障设备、系统健康稳定地运行&#xff0c;日常巡检是运维工作不可或缺的部分。通过巡检可以及时发现设备、系统的异常问题&#xff0c;提前预防及时处理&#xff0c;避免问题扩大产…...

46-4 等级保护 - 网络安全等级保护概述

一、网络安全等级保护概述 原文:没有网络安全就没有国家安全 二、网络安全法 - 安全立法 中华人民共和国主席令 第五十三号 《中华人民共和国网络安全法》已于2016年11月7日由中华人民共和国第十二届全国人民代表大会常务委员会第二十四次会议通过,并自2017年6月1日起正式…...

css引入方式有几种?link和@import有什么区别?

在CSS中&#xff0c;引入外部样式表的方式主要有两种&#xff1a;<link>标签和import规则。 使用<link>标签引入外部样式表&#xff1a; <link rel"stylesheet" href"path/to/style.css">这种方式是在HTML文档的<head>部分或者…...

使用‘消除’技术绕过LLM的安全机制,不用训练就可以创建自己的nsfw模型

开源的大模型在理解和遵循指令方面都表现十分出色。但是这些模型都有审查的机制&#xff0c;在获得被认为是有害的输入的时候会拒绝执行指令&#xff0c;例如会返回“As an AI assistant, I cannot help you.”。这个安全功能对于防止误用至关重要&#xff0c;但它限制了模型的…...

解决使用elmessage 没有样式的问题

错误情况 这里使用了一个消息提示&#xff0c;但是没有出现正确的样式&#xff0c; 错误原因和解决方法 出现这种情况是因为&#xff0c;在全局使用了按需导入&#xff0c;而又在局部组件中导入了ElMessage组件&#xff0c;我们只需要将局部组件的import删除就可以了 import…...

pxe批量部署linux介绍

1、PXE批量部署的作用及必要性&#xff1a; 1&#xff09;智能实现操作系统的批量安装&#xff08;无人值守安装&#xff09;2&#xff09;减少管理员工作&#xff0c;提高工作效率3&#xff09;可以定制操作系统的安装流程a.标准流程定制(ks.cfg)b.自定义流程定制(ks.cfg(%pos…...

RAG 实践-Ollama+AnythingLLM 搭建本地知识库

什么是 RAG RAG&#xff0c;即检索增强生成&#xff08;Retrieval-Augmented Generation&#xff09;&#xff0c;是一种先进的自然语言处理技术架构&#xff0c;它旨在克服传统大型语言模型&#xff08;LLMs&#xff09;在处理开放域问题时的信息容量限制和时效性不足。RAG的…...

【超详细】使用RedissonClient实现Redis分布式锁

使用RedissonClient实现Redis分布式锁是一个非常简洁和高效的方式。Redisson是一个基于Redis的Java客户端&#xff0c;它提供了许多高级功能&#xff0c;包括分布式锁、分布式集合、分布式映射等&#xff0c;简化了分布式系统中的并发控制。 添加依赖 首先&#xff0c;你需要…...

CC攻击的有效应对方案

随着互联网的发展&#xff0c;网络安全问题愈发突出。CC攻击&#xff08;Challenge Collapsar Attack&#xff09;&#xff0c;一种针对Web应用程序的分布式拒绝服务&#xff08;DDoS&#xff09;攻击方式&#xff0c;已经成为许多网络管理员和网站拥有者不得不面对的重大挑战。…...

自动驾驶基础一车辆模型

模型概述&#xff1a; 自行车动力学模型通常用于研究自行车在骑行过程中的行为&#xff0c;如稳定性、操控性和速度等。模型可以基于不同的简化假设和复杂度&#xff0c;从简单的二维模型到复杂的三维模型&#xff0c;甚至包括骑行者的动态。力学方程&#xff1a; 基础物理学方…...

机器学习:数据分布的漂移问题及应对方案

首先&#xff0c;让我们从一位高管告诉我的一个故事开始&#xff0c;很多读者可能对此感同身受。 大约两年前&#xff0c;他的公司聘请了一家咨询公司开发一个机器学习模型&#xff0c;帮助他们预测下周每种食品杂货需要多少&#xff0c;以便他们可以相应地补货。这家咨询公司…...

公链常用的共识算法

1. 工作量证明&#xff08;Proof of Work, PoW&#xff09; 工作原理&#xff1a;要求节点&#xff08;矿工&#xff09;解决一个数学难题&#xff0c;这个过程称为挖矿。第一个解决难题的矿工将有权添加一个新的区块到区块链上&#xff0c;并获得一定数量的加密货币作为奖励。…...

详解 Flink Table API 和 Flink SQL 之函数

一、系统内置函数 1. 比较函数 API函数表达式示例Table API&#xff0c;>&#xff0c;<&#xff0c;!&#xff0c;>&#xff0c;<id1001&#xff0c;age>18SQL&#xff0c;>&#xff0c;<&#xff0c;!&#xff0c;>&#xff0c;<id‘1001’&…...

rsa加签验签C#和js以及java互通

js实现rsa加签验签 https://github.com/kjur/jsrsasign 11.1.0版本 解压选择需要的版本&#xff0c;这里选择all版本了 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>JS RSA加签验签</title&g…...

C语言中数组和指针的关系

在C语言中&#xff0c;数组和指针之间存在着密切的关系&#xff0c;尽管它们在概念上是不同的。以下是关于C语言中数组和指针关系的一些要点&#xff1a; 数组名作为指针&#xff1a; 在大多数情况下&#xff0c;数组名在表达式中会被当作指向其第一个元素的指针。例如&#x…...

从仿真到AI数据集:一条龙搞定COMSOL+MATLAB+Python数据处理流水线

从仿真到AI数据集&#xff1a;COMSOLMATLABPython全流程自动化实践 在物理仿真与机器学习融合的研究中&#xff0c;最耗时的往往不是算法设计&#xff0c;而是高质量数据集的构建。想象一下这样的场景&#xff1a;你需要在数百组参数组合下运行电磁场仿真&#xff0c;每次仿真生…...

3步解锁全显卡AI超分:让老旧设备焕发新生的开源黑科技

3步解锁全显卡AI超分&#xff1a;让老旧设备焕发新生的开源黑科技 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler AI超分辨率技术正…...

FPGA篇---Vivado 与 Vitis 的区别详解

Vivado 和 Vitis 是 AMD&#xff08;原 Xilinx&#xff09;推出的两款核心开发工具&#xff0c;分别针对 硬件设计 和 软件/系统级开发。两者既有明确分工&#xff0c;又在现代设计流程中深度融合。1. 核心定位差异维度VivadoVitis全称Vivado Design SuiteVitis Unified Softwa…...

人工智能入门全景图:Nanbeige 4.1-3B带你梳理AI核心概念与技术栈

人工智能入门全景图&#xff1a;Nanbeige 4.1-3B带你梳理AI核心概念与技术栈 你是不是也对人工智能充满好奇&#xff0c;但一看到那些复杂的术语和庞大的技术栈就感到无从下手&#xff1f;机器学习、深度学习、神经网络、NLP、CV……这些词听起来很酷&#xff0c;但它们到底是…...

矩阵按键扫描技术对比:行列扫描与反转扫描的实战解析

1. 矩阵按键扫描技术入门指南 第一次接触矩阵按键时&#xff0c;我完全被那些交叉的行列线搞晕了。直到在某个深夜调试项目时&#xff0c;才突然理解了这个设计的精妙之处——它就像城市道路的十字路口&#xff0c;通过行列坐标就能精准定位每个按键位置。这种设计让16个按键只…...

LFM2.5-1.2B-Thinking-GGUF入门指南:Python零基础调用与第一个AI应用

LFM2.5-1.2B-Thinking-GGUF入门指南&#xff1a;Python零基础调用与第一个AI应用 1. 前言&#xff1a;为什么选择这个模型&#xff1f; 如果你刚接触AI大模型&#xff0c;可能会被各种复杂的术语和配置吓到。LFM2.5-1.2B-Thinking-GGUF是个不错的选择——它体积适中但能力不俗…...

MiddleBury与SceneFlow数据集相机参数解析与深度图生成实战

1. MiddleBury与SceneFlow数据集简介 MiddleBury和SceneFlow是计算机视觉领域两个非常重要的立体视觉数据集。MiddleBury数据集由Middlebury College发布&#xff0c;包含了大量高质量的立体图像对&#xff0c;这些图像对由两台相机在同一时间、不同位置拍摄&#xff0c;涵盖了…...

PLSduino:嵌入式平台轻量级偏最小二乘建模库

1. PLSduino&#xff1a;面向嵌入式平台的偏最小二乘建模与预测库1.1 技术定位与工程价值PLSduino 是一个专为资源受限嵌入式平台&#xff08;Arduino Uno/Nano/Leonardo、ESP32 等&#xff09;设计的轻量化偏最小二乘&#xff08;Partial Least Squares, PLS&#xff09;算法实…...

LVGL实战:用外部按键(Keypad)和旋转编码器(Encoder)在无触摸屏设备上实现流畅UI交互

LVGL物理交互实战&#xff1a;用按键与编码器打造无触摸屏的流畅UI控制 在智能家居控制面板、工业HMI设备等场景中&#xff0c;物理按键和旋转编码器因其可靠性和低成本优势&#xff0c;成为触摸屏的理想替代方案。本文将深入探讨如何通过LVGL的输入设备子系统&#xff0c;实现…...

C语言入门:了解历史与适用人群

要是您身为一名刚开始接触学习事物的人&#xff0c;再者您尚未弄明白何种属于编程语言&#xff0c;那就去瞧瞧这个了&#xff1a;什么是编程语言。 若您先前未曾接触过任何一种编程语言&#xff0c;或者您并不明白为何要是学习C语言来着&#xff0c;请看&#xff1a;为什么C语言…...