news 2026/7/6 8:09:59

Three.js 波浪粒子教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Three.js 波浪粒子教程

波浪粒子 ·Wave· ▶ 在线运行案例

  • 案例合集:三维可视化功能案例(threehub.cn)
  • 开源仓库github地址:https://github.com/z2586300277/three-cesium-examples
  • 400个案例代码:网盘链接

你将学到什么

  • ShaderMaterial 自定义着色器实现核心视觉效果
  • THREE.Points 粒子点渲染
  • requestAnimationFrame渲染循环与resize自适应

效果说明

本案例演示波浪粒子效果:基于 WebGL 实现「波浪粒子」可视化效果,附完整可运行源码;核心用到 ShaderMaterial、THREE.Points。建议先打开文首在线案例查看动态画面,再对照下方源码逐步理解。

核心概念

  • Scene / Camera / WebGLRenderer构成最小渲染闭环;大场景可开logarithmicDepthBuffer缓解 Z-fighting。
  • ShaderMaterial通过uniforms+ 自定义 GLSL 控制逐像素/逐点效果;透明粒子常配合depthTest: false
  • THREE.Points将每个顶点渲染为可控大小的粒子;可用自定义 attribute(如u_index)驱动片元/顶点动画。

实现步骤

  • 定义 uniforms,在 rAF 中更新并 render
  • 构建几何 attribute 或 instanceMatrix 并 add 到 scene
  • gui.add 绑定可调参数
  • 代码要点

    import { BufferAttribute, Clock, Color, PerspectiveCamera, PlaneGeometry, Points, Scene, ShaderMaterial, WebGLRenderer } from 'three';

    import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js';

    const sizes = { width: window.innerWidth, height: window.innerHeight }

    const scene = new Scene()

    const camera = new PerspectiveCamera(75, sizes.width / sizes.height, 0.1, 100) camera.position.z = 10 camera.position.y = 1.1 camera.position.x = 0 scene.add(camera)

    const planeGeometry = new PlaneGeometry(20, 20, 150, 150) const planeMaterial = new ShaderMaterial({ uniforms: { uTime: { value: 0 }, uElevation: { value: 0.482 }, ucolor: { value: new Color(0x9ab0f4) }, bsize: { value: 3 } }, vertexShader:uniform float uTime; uniform float uElevation;

    attribute float aSize; uniform float bsize;

    varying float vPositionY; varying float vPositionZ;

    void main() { vec4 modelPosition = modelMatrix * vec4(position, 1.0); modelPosition.y = sin(modelPosition.x - uTime)sin(modelPosition.z0.6 + uTime) * uElevation;

    vec4 viewPosition = viewMatrix * modelPosition; gl_Position = projectionMatrix * viewPosition;

    gl_PointSize = 2.0 * aSize; gl_PointSize= ( 1.0 / - viewPosition.z )bsize;

    vPositionY = modelPosition.y; vPositionZ = modelPosition.z; }, fragmentShader:varying float vPositionY; varying float vPositionZ; uniform vec3 ucolor;

    void main() { float strength = (vPositionY + 0.25) * 0.3; gl_FragColor = vec4(ucolor, strength); }, transparent: true, }) const planeSizesArray = new Float32Array(planeGeometry.attributes.position.count) for (let i = 0; i < planeSizesArray.length; i++) { planeSizesArray[i] = Math.random() * 4.0 } planeGeometry.setAttribute('aSize', new BufferAttribute(planeSizesArray, 1)) const plane = new Points(planeGeometry, planeMaterial) plane.rotation.x = - Math.PI * 0.4 scene.add(plane)

    window.addEventListener('resize', () => { sizes.width = window.innerWidth sizes.height = window.innerHeight camera.aspect = sizes.width / sizes.height camera.updateProjectionMatrix() renderer.setSize(sizes.width, sizes.height) renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)) })

    const renderer = new WebGLRenderer() document.body.appendChild(renderer.domElement) renderer.setSize(sizes.width, sizes.height) renderer.setPixelRatio(Math.min(window.devicePixelRatio, 1))

    const gui = new GUI() const planeFolder = gui.addFolder('Plane') planeFolder.addColor(planeMaterial.uniforms.ucolor, 'value').name('Color') planeFolder.add(planeMaterial.uniforms.bsize, 'value').min(0).max(10).step(0.001).name('Size')

    const clock = new Clock() const animate = () => { const elapsedTime = clock.getElapsedTime() planeMaterial.uniforms.uTime.value = elapsedTime renderer.render(scene, camera) window.requestAnimationFrame(animate) }

    animate()

    完整源码:GitHub

    小结

    • 本文提供波浪粒子完整 Three.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 8:07:26

放弃OpenClaw,拥抱Hermes:我的API网关迁移实战

1. 为什么放弃OpenClaw OpenClaw 作为一款轻量级 API 网关&#xff0c;在过去两年里支撑了我们的微服务架构。但随着业务规模从 20 个微服务扩展到 80&#xff0c;日均请求量从 200 万增长到 3000 万&#xff0c;它逐渐暴露出几个难以忽视的问题&#xff1a; 性能瓶颈&#xff…

作者头像 李华
网站建设 2026/7/6 8:05:30

Spring Boot DevTools 介绍:提升开发效率的利器

1. 什么是 Spring Boot DevTools&#xff1f;Spring Boot DevTools 是 Spring Boot 提供的一个开发工具模块&#xff0c;旨在提升开发者的开发体验和效率。它通过一系列自动化功能&#xff0c;如应用自动重启、静态资源热加载、LiveReload 浏览器自动刷新等&#xff0c;让开发者…

作者头像 李华
网站建设 2026/7/6 8:03:59

用开源工具监控GPT-5.5成本:一个轻量方案分享

随着GPT-5.5的发布&#xff0c;不少开发者通过AI模型聚合平台 yingcaiai.com 快速接入并体验了其强大的推理能力。然而&#xff0c;GPT-5.5的高昂API报价让很多团队在尝鲜的同时也面临“账单爆炸”的风险。为了避免Token被误用或恶意刷量&#xff0c;引入一套轻量级、无侵入的开…

作者头像 李华
网站建设 2026/7/6 8:03:12

2026年AI论文辅助平台全解析,一键解决论文写作中的各种难题!

撰写期刊论文、毕业论文或职称论文时&#xff0c;许多学术工作者常常会遇到各种挑战。亲自撰写论文&#xff0c;面对大量文献资料时&#xff0c;查找相关内容如同大海捞针&#xff1b;复杂而严格的格式要求&#xff0c;让人们常常感到无从下手&#xff1b;频繁的内容修改更是考…

作者头像 李华
网站建设 2026/7/6 8:02:50

OWASP Top 10安全漏洞深度解析与实战防御指南

1. 项目概述&#xff1a;为什么我们需要深入理解OWASP Top 10&#xff1f;如果你是一名Web开发者、运维工程师&#xff0c;或者刚刚踏入安全领域的新手&#xff0c;你可能无数次听过“OWASP Top 10”这个词。它像一份安全领域的“必读清单”&#xff0c;但很多人对它的理解&…

作者头像 李华
网站建设 2026/7/6 8:01:54

彻底搞懂指令和指令集:以 c = b + a 为例,附完整拆解表格

摘要 很多初学者分不清“指令”和“指令集”的区别&#xff0c;更不清楚它们到底存放在哪里。本文将从一个最简单的加法算式 c b a 出发&#xff0c;用表格逐条拆解汇编指令&#xff0c;并深入回答“指令集是否存在于内存中”这一核心困惑。读完此文&#xff0c;你将彻底理解…

作者头像 李华