首页/新闻资讯/正文详情

Three.js 赛博空间高拟真流体雨滴与地面波纹:基于动态法线贴图与水面着色器

发布时间:2026/9/27 8:45:35 来源:云帆数科 栏目:资讯中心
Three.js 赛博空间高拟真流体雨滴与地面波纹:基于动态法线贴图与水面着色器
Three.js 赛博空间高拟真流体雨滴与地面波纹基于动态法线贴图与水面着色器在构建赛博朋克 3D 虚拟都市、雨夜暗黑展厅或未来全息交互界面时倾盆大雨与积水地面上的动态雨滴涟漪Rain Droplets Ground Ripples是渲染电影级光影沉浸感的灵魂所在数万颗带有微弱荧光拖尾的雨丝在空中以物理加速度斜向下坠雨滴击中湿漉漉的赛博柏油路面瞬间地面激发出一圈圈随时间扩散、相干干涉的同心圆涟漪波纹Concentric Water Ripples地面通过动态扰动的法线贴图Dynamic Ripple Normal Map将周围五彩斑斓的霓虹灯广告牌折射反射出波光粼粼的湿润倒影。通过编写自定义的Three.js 水面涟漪片元着色器Custom Water Ripple GLSL Shader我们可以在零额外粒子计算开销的前提下在单一平面网格上以 60 FPS 满帧渲染出成千上万个生生不息的雨滴波纹一、雨丝系统与水面波纹着色器架构拓扑graph LR RainSystem[GPU 粒子系统: 30,000 颗倾斜下坠雨丝粒子 (LineSegments)] -- GroundMesh[赛博积水地面网格 (PlaneGeometry)] subgraph GPU 片元着色器水面涟漪计算 (Water Ripple Shader) GroundMesh -- UVCoords[计算表面 UV 坐标] UVCoords -- RippleEquation[周期性波纹方程: sin(dist * 40.0 - uTime * 15.0) * exp(-dist * 8.0)] RippleEquation -- NormalDistort[动态计算水面扰动法线 (Perturbed Normal Vector)] NormalDistort -- CubemapReflect[采样环境霓虹贴图反射 菲涅尔高光 (Fresnel Refraction)] end CubemapReflect -- Output[输出波光粼粼、倒影摇曳的赛博雨夜积水地面]二、水面雨滴波纹着色器GLSL ShaderMaterial完整实现// shaders/cyberRainRippleShader.ts import * as THREE from three; export function createRainRippleMaterial() { return new THREE.ShaderMaterial({ uniforms: { uTime: { value: 0 }, uBaseColor: { value: new THREE.Color(0x020617) }, // 极黑湿润路面 uNeonReflectColor: { value: new THREE.Color(0x00f3ff) }, // 霓虹青反射 uRippleSpeed: { value: 6.0 }, // 涟漪扩散速度 uRippleDensity: { value: 12.0 }, // 雨滴密集度 }, vertexShader: varying vec2 vUv; varying vec3 vWorldPosition; void main() { vUv uv; vec4 worldPos modelMatrix * vec4(position, 1.0); vWorldPosition worldPos.xyz; gl_Position projectionMatrix * viewMatrix * worldPos; } , fragmentShader: uniform float uTime; uniform vec3 uBaseColor; uniform vec3 uNeonReflectColor; uniform float uRippleSpeed; uniform float uRippleDensity; varying vec2 vUv; varying vec3 vWorldPosition; // 经典伪随机 Hash vec2 hash22(vec2 p) { vec3 p3 fract(vec3(p.xyx) * vec3(.1031, .1030, .0973)); p3 dot(p3, p3.yzx 33.33); return fract((p3.xx p3.yz) * p3.zy); } // 计算单个网格单元内的雨滴涟漪高度 float getRipple(vec2 uv, float timeOffset) { vec2 gridIndex floor(uv); vec2 gridFrac fract(uv); float totalRipple 0.0; // 采样 3x3 邻近网格实现波纹自然交叠干涉 for (int y -1; y 1; y) { for (int x -1; x 1; x) { vec2 neighbor vec2(float(x), float(y)); vec2 randomDropPos hash22(gridIndex neighbor); // 雨滴击落的时间相位 float dropPhase fract(uTime * 1.5 timeOffset randomDropPos.x * 6.28); float currentRadius dropPhase * 0.7; // 涟漪扩散半径 vec2 diff gridFrac - (neighbor randomDropPos); float dist length(diff); // 涟漪波峰方程: 扩散同心圆 随时间与距离快速衰减 if (dist currentRadius dropPhase 0.05) { float wave sin((dist - currentRadius) * 35.0); float decay (1.0 - dropPhase) * smoothstep(0.0, 0.2, dist); totalRipple wave * decay * 0.15; } } } return totalRipple; } void main() { vec2 rippleUv vUv * uRippleDensity; // 1. 计算两个时间层叠加的涟漪波纹 float h getRipple(rippleUv, 0.0) getRipple(rippleUv * 1.5 4.2, 0.5) * 0.6; // 2. 利用高度差估算法线扰动 (Finite Difference Normal) float eps 0.02; float hRight getRipple(rippleUv vec2(eps, 0.0), 0.0); float hTop getRipple(rippleUv vec2(0.0, eps), 0.0); vec3 normal normalize(vec3(h - hRight, eps * 2.0, h - hTop)); // 3. 计算视线方向与菲涅尔镜面反射 (Fresnel Specular) vec3 viewDir normalize(cameraPosition - vWorldPosition); float fresnel pow(1.0 - max(0.0, dot(viewDir, normal)), 3.5); // 4. 颜色合成: 湿润路面底色 动态波纹霓虹倒影 vec3 surfaceColor uBaseColor; vec3 reflectGlow uNeonReflectColor * (fresnel * 2.2 abs(h) * 1.5); gl_FragColor vec4(surfaceColor reflectGlow, 1.0); } , }); }三、场景组装与 30,000 雨丝粒子动态级联// scene/cyberRainStage.ts import * as THREE from three; import { createRainRippleMaterial } from ../shaders/cyberRainRippleShader; export function setupCyberRainScene(scene: THREE.Scene) { // 1. 创建积水地面 const groundGeo new THREE.PlaneGeometry(30, 30); const groundMat createRainRippleMaterial(); const ground new THREE.Mesh(groundGeo, groundMat); ground.rotation.x -Math.PI / 2; scene.add(ground); // 2. 创建 25,000 根雨丝粒子 (LineSegments) const rainCount 25000; const rainGeo new THREE.BufferGeometry(); const rainPositions new Float32Array(rainCount * 6); // 每根雨丝 2 个顶点 (起点与尾点) for (let i 0; i rainCount; i) { const x (Math.random() - 0.5) * 28; const y Math.random() * 15; const z (Math.random() - 0.5) * 28; rainPositions[i * 6] x; rainPositions[i * 6 1] y; rainPositions[i * 6 2] z; // 倾斜下坠尾部 rainPositions[i * 6 3] x - 0.08; rainPositions[i * 6 4] y - 0.6; rainPositions[i * 6 5] z; } rainGeo.setAttribute(position, new THREE.BufferAttribute(rainPositions, 3)); const rainMat new THREE.LineBasicMaterial({ color: 0x00f3ff, transparent: true, opacity: 0.45, blending: THREE.AdditiveBlending, }); const rainSystem new THREE.LineSegments(rainGeo, rainMat); scene.add(rainSystem); return { update: (delta: number) { // 1. 更新地面涟漪着色器时间 groundMat.uniforms.uTime.value delta; // 2. 更新雨丝下坠 const posAttr rainGeo.attributes.position as THREE.BufferAttribute; const arr posAttr.array as Float32Array; for (let i 0; i rainCount; i) { arr[i * 6 1] - 22.0 * delta; // Y 轴下落 arr[i * 6 4] - 22.0 * delta; // 若落到地面以下重置到顶部 if (arr[i * 6 1] 0) { arr[i * 6 1] 15; arr[i * 6 4] 14.4; } } posAttr.needsUpdate true; }, }; }四、雨夜水面特效三大极客优化法则绝对零 CPU 涟漪网格变形Pure GPU Fragment Ripples所有的涟漪干涉与同心圆计算全部在片元着色器内由 GPU 并行完成CPU 占用率维持在 0.1%3x3 邻域相干干涉Coherent Wave Interference在着色器中采样相邻单元格的雨滴当两个雨滴波纹碰撞时波峰相加产生极其真实的物理干涉图案线段渲染代替复杂模型LineSegments for Raindrops雨丝使用单一LineSegments承载 25,000 根雨滴单次 Draw Call 即可满帧渲染倾盆大雨。用精密的数学波动方程在屏幕上激荡起如梦似幻的雨夜涟漪让赛博朋克 3D 界面散发出沁人心脾的流体科技质感。

相关推荐

ESP32-S3 接入 OneNET 物联网平台:MQTT + OLED + DHT11 温湿度上传与远程控制全攻略
ESP32-S3 接入 OneNET 物联网平台:MQTT + OLED + DHT11 温湿度上传与远程控制全攻略

若该文为原创文章,转载请注明原文出处。 本文基于 Arduino 框架,使用 ESP32-S3 通过 MQTT 协议连接 OneNET 物联网平台,实现 DHT11 温湿度采集、OLED 中文显示、定时上传数据,并接收云端下发指令。文中包含完整代码、库安装、流程… · 2026/9/27 8:45:35

研发团队代码重构管理:如何在高速业务奔跑中优雅还清技术债
研发团队代码重构管理:如何在高速业务奔跑中优雅还清技术债

研发团队代码重构管理:如何在高速业务奔跑中优雅还清技术债在高速增长期的技术创业团队中,技术债务(Technical Debt)与业务需求冲刺往往是一对极其激烈的生死矛盾: 失控的重构狂热(Refactoring Paralysis&a… · 2026/9/27 8:45:28

使用 Go 的 SO_REUSEPORT:让多个进程共享同一端口的高可用网络服务方案
使用 Go 的 SO_REUSEPORT:让多个进程共享同一端口的高可用网络服务方案

云原生微服务容器编排运维 【免费下载链接】flynn [UNMAINTAINED] A next generation open source platform as a service (PaaS) 项目地址: https://gitcode.com/gh_mirrors/fl/flynn 点击查看 免费下载 导读 本文围绕 flynn 仓库 vendor 目录中引入的 go_reusep… · 2026/9/27 8:45:28

网站业务员好做吗?拆解3个最佳实践避坑指南
网站业务员好做吗?拆解3个最佳实践避坑指南

网站业务员好做吗?拆解3个最佳实践避坑指南 网站做好了没人访问,这大概是做建站销售最头疼的事。很多新人觉得,只要网站做得漂亮,客户就会买单,结果发现根本卖不出去。其实,这背后涉及的是 最佳实践… · 2026/9/27 9:31:11

IDEA按照JSP Model2思想实现用户注册功能
IDEA按照JSP Model2思想实现用户注册功能

【任务目标】 按照JSP Model2思想编写一个用户注册程序。 组件关系图如下: (1)UserBean: 封装用户信息的JavaBean。 (2)RegisterFormBean是封装注册表单信息的JavaBeanl,用于校验从ControllerServlet中获… · 2026/9/27 9:31:04

CSS 代码格式化在线工具,前端样式调试整理小工具
CSS 代码格式化在线工具,前端样式调试整理小工具

一、前言 在前端日常开发工作中,我们经常会接触压缩后的 CSS 代码。线上为了减少资源体积,CSS 文件通常会去除换行、空格和缩进,全部合并为单行文本。 当我们需要分析第三方样式、排查样式冲突问题、阅读线上 CSS 源码时,面对挤… · 2026/9/27 9:30:58

使用docker-compose部署项目(mysql、springboot、vue、nginx)
使用docker-compose部署项目(mysql、springboot、vue、nginx)

结合前面几篇文章: 9.如何将jar包打包成docker镜像并进行部署 10.docker如何部署一个前端网站 docker系列文章: https://blog.csdn.net/baidu_32523857/article/details/135212681 这篇文章我们使用docker-compose来部署项目。 docker-compose是一个编… · 2026/9/27 9:30:58

第247篇_全网羊毛优惠活动聚合采集
第247篇_全网羊毛优惠活动聚合采集

【Python爬虫实战】第247篇:羊毛信息不再东奔西跑——多平台优惠活动聚合去重抓取实战 所属专栏:【Python爬虫实战】从零到企业级爬虫工程师(CSDN 付费专栏) 本篇篇目:第 247 篇(多源聚合与去重专场,每篇都是一个可独立上手的实战项目) 难度等级:中高级,重点练「多源… · 2026/9/27 9:30:52

南京seo关键词优化资讯图解步骤:网站被黑别慌,3招找回排名
南京seo关键词优化资讯图解步骤:网站被黑别慌,3招找回排名

南京seo关键词优化资讯图解步骤:网站被黑别慌,3招找回排名 网站突然打不开,或者首页被挂满非法广告,后台密码改了也没用?这是很多南京站长半夜惊醒时的噩梦。别急着删库重建,那只是掩盖问题,不是解决根源。根据中国互联网络信息中心(CNNIC)… · 2026/9/27 9:30:46

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码