Three.js 蒸汽粒子教程

发布时间:2026/7/8 3:00:11

Three.js 蒸汽粒子教程
蒸汽粒子 ·Steam Particle· ▶ 在线运行案例案例合集三维可视化功能案例threehub.cn开源仓库github地址https://github.com/z2586300277/three-cesium-examples400个案例代码:网盘链接你将学到什么ShaderMaterial 自定义着色器实现核心视觉效果OrbitControls 相机轨道交互THREE.Points 粒子点渲染BufferGeometry 自定义顶点/索引数据requestAnimationFrame渲染循环与resize自适应效果说明本案例演示蒸汽粒子效果基于 WebGL 实现「蒸汽粒子」可视化效果附完整可运行源码核心用到 ShaderMaterial、OrbitControls、THREE.Points。建议先打开文首在线案例查看动态画面再对照下方源码逐步理解。核心概念Scene / Camera / WebGLRenderer构成最小渲染闭环大场景可开logarithmicDepthBuffer缓解 Z-fighting。ShaderMaterial通过uniforms 自定义 GLSL 控制逐像素/逐点效果透明粒子常配合depthTest: false。OrbitControls提供轨道旋转/缩放开启enableDamping后需在 animate 中controls.update()。THREE.Points将每个顶点渲染为可控大小的粒子可用自定义 attribute如u_index驱动片元/顶点动画。实现步骤搭建 Scene、PerspectiveCamera、WebGLRenderer挂载 canvas 并处理resize定义 uniforms / onBeforeCompile 或 ShaderMaterial编写 GLSL 与材质参数创建 OrbitControls及 Raycaster 等交互控件若源码包含在requestAnimationFrame循环中更新状态并 renderCesium 为viewer.render或自动渲染代码要点import * as THREE from threeimport { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GUI } from dat.gui// 初始化场景 const box document.getElementById(box) const scene new THREE.Scene() scene.background new THREE.Color(0x445566)const camera new THREE.PerspectiveCamera(50, box.clientWidth / box.clientHeight, 0.1, 1000) camera.position.set(0, 8, 20)// 设置渲染器 const renderer new THREE.WebGLRenderer({ antialias: true, alpha: true }) renderer.setSize(box.clientWidth, box.clientHeight) box.appendChild(renderer.domElement)// 轨道控制器 const controls new OrbitControls(camera, renderer.domElement) controls.enableDamping truescene.add(new THREE.AmbientLight(0xffffff, 0.5))// 可配置参数 const config { particleCount: 3000, particleSize: 1.2, width: 12, depth: 2, height: 15, riseSpeed: 0.4, spread: 0.3, turbulence: 0.3, density: 0.4, }const uniforms { time: { value: 0 }, baseColor: { value: new THREE.Color(0xffffff) }, height: { value: config.height }, turbulence: { value: config.turbulence }, density: { value: config.density }, }const material new THREE.ShaderMaterial({ uniforms, vertexShader:attribute float size; attribute float phase; attribute vec3 velocity; uniform float time; uniform float height; uniform float turbulence; varying float vAlpha; varying float vAge; void main() { float age mod(time * 0.3 phase, 1.0); vAge age; vec3 pos position velocityageheight; pos.x sin(age8.0 phase20.0)turbulence(0.5 age); pos.z cos(age6.0 phase15.0)turbulence(0.3 age * 0.5); pos.x (1.0 age1.5); pos.z (1.0 age0.8); vec4 mvPosition modelViewMatrix * vec4(pos, 1.0); gl_Position projectionMatrix * mvPosition; gl_PointSize size(1.0 age3.0) * (250.0 / -mvPosition.z); float fadeIn smoothstep(0.0, 0.1, age); float fadeOut 1.0 - smoothstep(0.6, 1.0, age); vAlpha fadeIn * fadeOut; }, fragmentShader:uniform vec3 baseColor; uniform float density; varying float vAlpha; varying float vAge; void main() { float dist length(gl_PointCoord - 0.5) * 2.0; if (dist 1.0) discard; float edge 1.0 - smoothstep(0.3, 1.0, dist); vec3 color mix(baseColor, vec3(0.85, 0.88, 0.92), vAge * 0.3); gl_FragColor vec4(color, vAlphaedgedensity); }, blending: THREE.NormalBlending, depthWrite: false, transparent: true, })function buildGeometry() { const geo new THREE.BufferGeometry() const positions [], sizes [], phases [], velocities [] for (let i 0; i config.particleCount; i) { positions.push( (Math.random() - 0.5) * config.width, Math.random() * 0.3, (Math.random() - 0.5) * config.depth ) sizes.push(config.particleSize(0.6 Math.random()0.8)) phases.push(Math.random()) velocities.push( (Math.random() - 0.5) * config.spread, config.riseSpeed(0.8 Math.random()0.4), (Math.random() - 0.5)config.spread0.5 ) } geo.setAttribute(position, new THREE.Float32BufferAttribute(positions, 3)) geo.setAttribute(size, new THREE.Float32BufferAttribute(sizes, 1)) geo.setAttribute(phase, new THREE.Float32BufferAttribute(phases, 1)) geo.setAttribute(velocity, new THREE.Float32BufferAttribute(velocities, 3)) return geo }const steam new THREE.Points(buildGeometry(), material) scene.add(steam)// GUI const gui new GUI() gui.add(config, height, 5, 30).name(上升高度).onChange(v uniforms.height.value v) gui.add(config, turbulence, 0, 1).name(湍流强度).onChange(v uniforms.turbulence.value v) gui.add(config, density, 0.1, 1).name(浓度).onChange(v uniforms.density.value v) gui.add(config, width, 1, 20).name(喷口宽度).onChange(() { steam.geometry.dispose(); steam.geometry buildGeometry() }) gui.add(config, depth, 0.5, 10).name(喷口深度).onChange(() { steam.geometry.dispose(); steam.geometry buildGeometry() }) gui.add(config, riseSpeed, 0.1, 1).name(上升速度).onChange(() { steam.geometry.dispose(); steam.geometry buildGeometry() }) gui.add(config, particleCount, 500, 8000, 500).name(粒子数量).onChange(() { steam.geometry.dispose(); steam.geometry buildGeometry() }) gui.add(config, particleSize, 0.3, 3).name(粒子大小).onChange(() { steam.geometry.dispose(); steam.geometry buildGeometry() }) gui.addColor({ color: #ffffff }, color).name(蒸汽颜色).onChange(v uniforms.baseColor.value.set(v))// 动画 const clock new THREE.Clock()function animate() { requestAnimationFrame(animate) uniforms.time.value clock.getElapsedTime() controls.update() renderer.render(scene, camera) }animate()window.onresize () { renderer.setSize(box.clientWidth, box.clientHeight) camera.aspect box.clientWidth / box.clientHeight camera.updateProjectionMatrix() }完整源码GitHub小结本文提供蒸汽粒子完整 Three.js 源码与在线 Demo建议先运行案例再改 uniform/参数做二次实验更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库

相关新闻

如何从‘能聊天’升级到‘让别人愿意主动找你聊’的系统?

如何从‘能聊天’升级到‘让别人愿意主动找你聊’的系统?

2026/7/7 19:19:25

一、第一刀:为什么大多数人只能“能聊天”,不能“被找聊”? 因为他们停留在:被动对话系统✔ 特征: 别人发起你回应你维持但不会“积累吸引力”👉 本质:只是“对话节点”,不是“对话源…

高效电机驱动方案:TC78H660FTG与STM32G071RB实战解析

高效电机驱动方案:TC78H660FTG与STM32G071RB实战解析

2026/7/7 11:49:02

1. 项目背景与核心器件选型在工业自动化和消费电子领域,电机驱动系统的效率提升一直是工程师们关注的焦点。最近我在一个AGV小车项目中,需要设计一套兼顾性能和功耗的驱动方案,最终选择了东芝的TC78H660FTG电机驱动芯片搭配ST的STM32G071RB微…

深度学习图像识别实战:从CNN原理到PyTorch实现

深度学习图像识别实战:从CNN原理到PyTorch实现

2026/7/7 20:12:12

1. 项目概述:深度学习驱动的图像识别实战作为一名长期混迹在计算机视觉领域的从业者,我完整参与了李哥深度学习班的图像识别课程。这个系列课程最打动我的地方在于:它用工业级的代码标准教会学员如何从零搭建可落地的图像识别系统。不同于市面…

bgp基础实验

bgp基础实验

2026/7/8 2:57:21

BGP基础实验实验拓扑及要求:IP配置:R1:interface GigabitEthernet0/0/0ip address 100.1.12.1 255.255.255.0interface GigabitEthernet0/0/1ip address 100.1.13.1 255.255.255.0interface LoopBack0ip address 1.1.1.1 255.255.255.255inte…

2026年国家级制造业单项冠军申报全攻略!

2026年国家级制造业单项冠军申报全攻略!

2026/7/8 2:57:21

近期多地制造企业咨询2026国家级制造业单项冠军申报事宜,行业普遍预判8月底工信部将启动新一轮遴选。作为制造业资质金字塔顶端荣誉,单项冠军评审标准逐年收紧,不少企业卡在硬指标、材料佐证、省级推荐环节遗憾落选。本文结合工信部《制造业单…

APK Editor Studio:当传统逆向工具无法满足时,如何构建跨平台的Android应用分析工作流

APK Editor Studio:当传统逆向工具无法满足时,如何构建跨平台的Android应用分析工作流

2026/7/8 2:57:21

APK Editor Studio:当传统逆向工具无法满足时,如何构建跨平台的Android应用分析工作流 【免费下载链接】apk-editor-studio Powerful yet easy to use APK editor for PC and Mac. 项目地址: https://gitcode.com/gh_mirrors/ap/apk-editor-studio …

vibe coding 整体流程

vibe coding 整体流程

2026/7/8 2:57:21

你要的不是“工具组合”,而是开发操作系统。 结论先说:Obsidian 管知识,Harness 管约束,Trae 管执行,Git/CI 管交付。 你现在最容易犯的错误是:以为把几个 AI 工具串起来,就能自动完成开发。错…

企业做 AI 落地时,为什么越来越需要成本意识

企业做 AI 落地时,为什么越来越需要成本意识

2026/7/8 2:57:21

前段时间,很多团队谈 AI,重点还是“能不能做”“要不要接”“哪个模型更强”。但到了现在,越来越多企业开始把问题换了一种问法:这件事做下来,到底值不值。这个变化很重要,因为它说明 AI 在很多公司里&…

APK-Installer:在Windows上无缝安装Android应用的终极解决方案

APK-Installer:在Windows上无缝安装Android应用的终极解决方案

2026/7/8 2:47:21

APK-Installer:在Windows上无缝安装Android应用的终极解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上直接安装Androi…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/8 0:44:47

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/7 4:34:17

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/7 13:20:59

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

Qwen Code+Obsidian构建可执行的AI时代认知操作系统

Qwen Code+Obsidian构建可执行的AI时代认知操作系统

2026/7/8 0:07:15

1. 项目概述:这不是又一个笔记软件教程,而是一套可复用的“认知操作系统”搭建逻辑你有没有试过,在读完Andrej Karpathy那篇著名的《Software 2.0》之后,满脑子都是“神经网络即代码”的震撼,但合上网页,打…

校园服饰细分赛道测算程序,学生平价国风,机能穿搭市场规模预估。

校园服饰细分赛道测算程序,学生平价国风,机能穿搭市场规模预估。

2026/7/8 0:07:15

校园服饰细分赛道测算程序(Python)——学生平价国风 & 机能穿搭市场规模预估(TAM / SAM / SOM)一、实际应用场景描述(真实业务抽象)在《时尚产业与品牌创新》课程中,细分市场切入&#xff0…

Visual C++运行库完整解决方案:告别软件兼容性问题

Visual C++运行库完整解决方案:告别软件兼容性问题

2026/7/8 0:07:15

Visual C运行库完整解决方案:告别软件兼容性问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾为打开游戏时弹出的"DLL缺失"错误…