如何用 Three.js 制作迷幻波浪动画?WebGL 鼠标交互调节颜色,免费体验 + 开源代码

2025-07-02| 595 阅读

? 手把手教你用 Three.js 做迷幻波浪动画,还能鼠标调节颜色,附开源代码!


最近在研究 WebGL 动画的时候,发现用 Three.js 做波浪效果特别酷,尤其是加上鼠标交互变色后,视觉效果直接拉满。很多小伙伴问我怎么实现,今天就把整个过程拆解开来,哪怕你是 Three.js 新手也能跟着一步步做出来。咱们不仅会讲清楚每一步代码的作用,最后还会给大家提供免费体验地址和完整开源代码,直接拿走就能跑起来。

?️ 准备工作:先搭好项目框架


首先得确保你电脑里装了 Node.js,这是跑 Three.js 项目的基础。打开终端,新建一个项目文件夹,比如叫 wave-animation,然后进去初始化项目:npm init -y,这一步会生成 package.json 文件,记录项目的基本信息。

接下来安装必要的依赖,Three.js 肯定是必须的,还有用于处理三维数学的 three/addons/math/Vector2.js,以及监听鼠标事件需要用到的工具库。输入命令 npm install three 就行,安装完后,在项目里新建 index.htmlsrc 文件夹,src 里放 main.js 作为入口文件。

index.html 里,先把基本的 HTML 结构写好,引入 Three.js 的库,注意这里用 ES6 模块的方式引入,代码大概是这样:

html
DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>迷幻波浪动画title>
    <style>
        body { margin: ; }
        canvas { display: block; }
    style>
head>
<body>
    <script type="module" src="./src/main.js">script>
body>
html>

这样基本的页面框架就搭好了,接下来就要在 main.js 里写核心的 Three.js 代码了。

? 第一步:创建场景、相机和渲染器


Three.js 里所有东西都要放在场景里,所以先创建一个场景 const scene = new THREE.Scene();。相机就像我们的眼睛,这里用透视相机,视角设为 75 度,宽高比用窗口的宽高比,近裁剪面设为 0.1,远裁剪面设为 1000,代码是 const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);,相机的位置稍微往后退一点,比如 camera.position.z = 5;,这样能看得更清楚。

渲染器选择 WebGL 渲染器,设置一下尺寸,让它和窗口一样大,const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight);,然后把渲染器的 DOM 元素添加到页面 body 里,document.body.appendChild(renderer.domElement);

? 第二步:生成波浪几何体


波浪动画的关键在于顶点的位置变化,所以我们要用 BufferGeometry 来创建自定义的几何体。先确定波浪的网格大小,比如宽度和高度方向各有 100 个点,const widthSegments = 100; const heightSegments = 100;

然后创建顶点坐标数组,每个顶点的 x、y、z 坐标,这里 y 坐标暂时都设为 0,后面通过着色器来动态计算波浪的高度。代码大概是这样:

javascript
const geometry = new THREE.BufferGeometry();
const positions = [];
for (let y = ; y <= heightSegments; y++) {
    for (let x = ; x <= widthSegments; x++) {
        const px = (x / widthSegments) *  - ; // x 范围在 -2 到 2 之间
        const pz = (y / heightSegments) *  - ; // z 范围在 -2 到 2 之间
        positions.push(px, , pz); // y 暂时为 0
    }
}

把顶点坐标数组赋值给几何体的位置属性,geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));

? 第三步:编写着色器实现波浪效果


接下来是重点,用着色器来让顶点动起来。先定义顶点着色器,需要接收时间 time 作为 uniform 变量,然后根据顶点的 x 和 z 坐标计算波浪的高度,这里用正弦函数来生成波浪,比如 y = Math.sin(x * 3 + time) * 0.5 + Math.sin(z * 3 + time) * 0.5;,这样就能形成一个立体的波浪效果。

顶点着色器的代码大概是这样:

glsl
varying vec2 vUv;
uniform float time;

void main() {
    vUv = uv;
    vec3 pos = position;
    pos.y = sin(pos.x * 3.0 + time) * 0.5 + sin(pos.z * 3.0 + time) * 0.5; // 计算波浪高度
    gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
}

片元着色器负责颜色渲染,这里先暂时用一个基础的颜色,后面再加上鼠标交互变色的逻辑。片元着色器可以先返回一个蓝色,比如 gl_FragColor = vec4(0.2, 0.5, 0.8, 1.0);

然后创建 ShaderMaterial,把顶点着色器和片元着色器传进去,同时设置一些材质属性,比如透明度、混合模式等,const material = new THREE.ShaderMaterial({ vertexShader: vertexShader, fragmentShader: fragmentShader, uniforms: { time: { value: 0 }, mouse: { value: new THREE.Vector2() } // 后面用于鼠标位置 }, transparent: true, opacity: 0.8, blending: THREE.AdditiveBlending });

?️ 第四步:实现鼠标交互调节颜色


现在要让鼠标移动时波浪的颜色跟着变化,首先得监听鼠标移动事件。在窗口上添加 mousemove 事件监听,获取鼠标在画布上的坐标,注意坐标要转换为 Three.js 所需的范围,x 和 y 都从 -1 到 1,window.addEventListener('mousemove', (e) => { material.uniforms.mouse.value.x = (e.clientX / window.innerWidth) * 2 - 1; material.uniforms.mouse.value.y = -((e.clientY / window.innerHeight) * 2 - 1); // y 轴反转 });

然后在片元着色器里,根据鼠标位置来计算颜色,这里可以用鼠标位置作为颜色的 RGB 分量,或者做一些更复杂的计算,比如 vec3 color = vec3(mouse.x * 0.5 + 0.5, mouse.y * 0.5 + 0.5, 0.8);,这样鼠标移动时颜色就会跟着变化。

? 第五步:动画循环和时间更新


在动画循环里,首先要更新时间变量,让波浪动起来,material.uniforms.time.value += 0.05;,然后渲染场景和相机,renderer.render(scene, camera);,最后用 requestAnimationFrame(animate); 来循环调用动画函数。

同时,为了让波浪在窗口 Resize 时也能适配,添加窗口 Resize 事件监听,更新相机的宽高比和渲染器的尺寸,window.addEventListener('resize', () => { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); });

? 第六步:组合所有元素并添加到场景


把创建好的几何体和材质组合成网格对象,const mesh = new THREE.Mesh(geometry, material);,然后添加到场景里,scene.add(mesh);

现在整个项目的核心代码就写完了,接下来把所有代码整合到 main.js 里,确保没有语法错误。

✅ 免费体验和开源代码获取


写完代码后,我们可以用 npx serve 命令启动一个本地服务器,在浏览器里访问 http://localhost:3000 就能看到效果啦。鼠标移动到画布上,波浪的颜色会跟着变化,呈现出迷幻的效果。

如果你想获取完整的开源代码,可以到我的 GitHub 仓库下载,地址是 https://github.com/your-username/wave-animation-threejs(这里记得替换成你实际的仓库地址)。仓库里不仅有完整的代码,还有详细的安装步骤和说明,新手也能轻松跑起来。

? 注意事项和优化建议


在制作过程中,可能会遇到一些问题,比如波浪的起伏不够明显,这时候可以调整顶点着色器里的正弦函数的频率和振幅,比如把 3.0 改成 4.0 或者 2.0,看看效果变化。还有颜色的调节,可以在片元着色器里加入更多的计算,比如使用 HSV 颜色模型,让颜色变化更丰富。

另外,性能方面,如果网格的分段数太高,可能会影响运行速度,尤其是在低端设备上。可以根据实际情况调整 widthSegmentsheightSegments 的值,比如从 100 改成 50,看看性能和效果的平衡。

最后,记得在生产环境中压缩代码,优化资源加载,比如使用 Webpack 或者 Rollup 进行打包,提高页面加载速度。

这样,一个带鼠标交互变色的迷幻波浪动画就完成啦!整个过程其实并不复杂,只要按照步骤一步步来,理解每个部分的作用,就能做出炫酷的 WebGL 动画。赶紧动手试试吧,有问题可以在评论区留言,大家一起讨论解决。

【该文章由dudu123.com嘟嘟 ai 导航整理,嘟嘟 AI 导航汇集全网优质网址资源和最新优质 AI 工具】

分享到:

相关文章

创作资讯2025-03-16

AIGC 检测与降重一站式平台:2025 年免费网站全解析

🔍精准检测:揭秘 2025 年免费 AIGC 检测平台的核心技术 在人工智能生成内容(AIGC)爆发式增长的今天,如何快速识别并降低 AI 痕迹成为学术、创作领域的刚需。2025 年,多款免费平台通

第五AI
创作资讯2025-01-28

论文 ai 检测原理和方法 系统数据库解析 结果影响因素有哪些?

最近总被身边朋友问:“我论文拿去检测,为啥两次结果差那么多?”“AI 检测到底是怎么判断抄袭的?” 作为跟各类检测系统打交道多年的人,今天就掰开揉碎了跟大家聊聊论文 AI 检测这点事 —— 从原理到数

第五AI
创作资讯2025-06-15

影响流量主单价的变量太多?抓住内容垂直度和粉丝画像这两个核心

📌 内容垂直度:决定流量价值的根基​做流量主的都清楚,账号内容乱成一锅粥的时候,单价基本高不了。你今天写美食,明天聊科技,后天又发情感故事,算法都摸不清你的定位,怎么可能给你匹配高价值广告?​内容垂

第五AI
创作资讯2025-02-11

免费AI查重工具的“坑”与“宝”:哪个软件查得准还不收费?

现在市面上免费 AI 查重工具特别多,大家用的时候可得擦亮眼睛。有些工具看着免费,实际藏着不少 “坑”,但也有一些是真正的 “宝”。那到底怎么分辨呢?咱们从实际情况出发好好聊聊。 免费 AI 查重工具

第五AI
推荐2025-08-07

力扣模拟面试防作弊指南:双机位 + 实时代码审查策略揭秘

?双机位布置:打造360°无死角面试环境力扣模拟面试的双机位要求让不少同学犯难,其实把它想象成给电脑装个「监控搭档」就简单了。主机位就是咱们平时用的电脑摄像头,记得调整到能露出整张脸和桌面的角度——下巴别藏在阴影里,键盘也别只露出半个。副机位一般用手机支架固定,放在身体侧后方45度角,这个位置既能拍

第五AI
推荐2025-08-07

Examify AI 是一款怎样的考试平台?2025 最新个性化学习计划解析

?精准提分黑科技!ExamifyAI如何重塑2025考试备考模式?一、核心功能大揭秘:AI如何让考试准备更高效?ExamifyAI作为新一代智能考试平台,最吸引人的地方就是它的自适应学习引擎。这个系统就像一个贴心的私人教练,能根据你的答题数据自动调整学习路径。比如你在数学几何题上错误率高,系统会优先

第五AI
推荐2025-08-07

公众号注册的“蝴蝶效应”:一个选择,可能影响未来三年的运营 - 前沿AIGC资讯

你可能觉得公众号注册就是填几个信息的事,殊不知,这里面的每个选择都像蝴蝶扇动翅膀,未来三年的运营轨迹可能就被悄悄改变了。很多人刚开始没当回事,等到后面想调整,才发现处处受限,那叫一个后悔。今天就跟你好好聊聊,注册时那些看似不起眼的选择,到底能给未来的运营带来多大影响。​📌账号类型选不对,三年运营路难

第五AI
推荐2025-08-07

AI写作如何进行事实核查?确保头条文章信息准确,避免误导读者 - AI创作资讯

上周帮同事核查一篇AI写的行业报告,发现里面把2023年的用户增长率写成了2025年的预测数据。更离谱的是,引用的政策文件号都是错的。现在AI生成内容速度快是快,但这种硬伤要是直接发出去,读者信了才真叫坑人。今天就掰开揉碎了说,AI写作怎么做好事实核查,别让你的头条文章变成 误导重灾区 。​📌AI写

第五AI
推荐2025-08-07

10w+阅读量爆文案例拆解分析:高手都从这5个维度入手 - AI创作资讯

🎯维度一:选题像打靶,靶心必须是「用户情绪储蓄罐」做内容的都清楚,10w+爆文的第一步不是写,是选。选题选不对,后面写得再好都是白搭。高手选选题,就像往用户的「情绪储蓄罐」里投硬币,投对了立刻就能听到回响。怎么判断选题有没有击中情绪?看三个指标:是不是高频讨论的「街头话题」?是不是藏在心里没说的「抽

第五AI
推荐2025-08-07

135编辑器会员值得买吗?它的AI模板库和秀米H5比哪个更丰富? - AI创作资讯

📌135编辑器会员值不值得买?AI模板库和秀米H5谁更胜一筹?🔍135编辑器会员的核心价值解析企业级商用保障与效率提升135编辑器的企业会员堪称新媒体运营的「合规保险箱」。根据实际案例,某团队通过企业会员节省了大量设计费用,完成多篇内容创作,单篇成本从千元降至百元内。这得益于其海量正版模板和素材库,

第五AI
推荐2025-08-07

新公众号被限流怎么办?粉丝增长影响分析及 2025 恢复指南 - AI创作资讯

新公众号被限流怎么办?粉丝增长影响分析及2025恢复指南🔍新公众号限流的核心原因解析新公众号被限流,往往是多个因素叠加的结果。根据2025年最新数据,超过70%的限流案例与内容质量直接相关。比如,有些新手喜欢用“震惊体”标题,像“惊!某公众号三天涨粉十万”,这类标题在2025年的算法里已经被明确标记

第五AI
推荐2025-08-07

AI内容重复率太高怎么办?掌握这些技巧轻松通过AIGC检测 - AI创作资讯

⚠️AI内容重复率高的3大核心原因现在用AI写东西的人越来越多,但很多人都会遇到同一个问题——重复率太高。明明是自己用工具生成的内容,一检测却显示和网上某些文章高度相似,这到底是为什么?最主要的原因是AI训练数据的重叠性。不管是ChatGPT还是国内的大模型,训练数据来源其实大同小异,都是爬取的互联

第五AI
推荐2025-08-07

135编辑器让排版更简单 | 专为公众号运营者设计的效率工具 - AI创作资讯

🌟135编辑器:公众号运营者的效率革命做公众号运营的朋友都知道,排版是个费时费力的活。一篇文章从内容到排版,没几个小时根本搞不定。不过现在好了,135编辑器的出现,彻底改变了这一现状。135编辑器是提子科技旗下的在线图文排版工具,2014年上线至今,已经成为国内新媒体运营的主流工具之一。它的功能非常

第五AI
推荐2025-08-07

用对prompt指令词,AI内容的原创度能有多高?实测效果惊人 - 前沿AIGC资讯

现在做内容的人几乎都离不开AI,但最头疼的就是原创度。平台检测一严格,那些模板化的AI文很容易被打回,甚至判定为“非原创”。但你知道吗?同样是用AI写东西,换个prompt指令词,原创度能差出天壤之别。我最近拿不同的prompt测了好几次,结果真的吓一跳——好的指令能让AI内容原创度直接从“及格线”

第五AI