news 2026/5/1 11:47:37

【前端】【canvas】【pixi.js】水波纹滤镜实现教程 - 支持随机波动与鼠标交互

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【前端】【canvas】【pixi.js】水波纹滤镜实现教程 - 支持随机波动与鼠标交互

前言

在Web图形开发中,Canvas技术为我们提供了丰富的视觉表现能力。今天,我将分享如何使用Pixi.js框架及其滤镜系统,实现一个具有随机水波纹和鼠标交互的水波纹特效。本教程基于Pixi.js 7.4.2版本,通过实际代码演示如何创建动态的视觉体验。
实现效果预览:

  • 随机生成的水波纹扩散效果
  • 点击屏幕任意位置触发水波纹
  • 多种滤镜叠加的视觉体验

一、环境搭建与项目创建

# 创建Vite项目npmcreate vite@latest.-- --template vue# 安装Pixi.js 7.4.2版本npminstallpixi.js@7.4.2# 安装Pixi滤镜库npminstallpixi-filters@5.1.0

1.2 版本说明

  • Pixi.js 7.4.2:这是目前稳定的版本,提供了优秀的性能和API支持
  • pixi-filters 5.1.0:官方滤镜库,包含多种特效滤镜

二、完整代码实现

下面是一个完整的Vue单文件组件实现:
注意: 需要删除vite构建项目的基本样式,因为这里将一些全局的样式也写在这里了,所以为了能生效,<style>标签不能使用scope

<template><divclass="canvas-container"><!--Pixi.js画布将通过JavaScript动态添加到此处--></div></template><script setup>import{onMounted,onUnmounted}from'vue';import*asPIXIfrom'pixi.js';import{ShockwaveFilter}from'pixi-filters';// Pixi应用实例letapp=null;onMounted(()=>{initPixiApp();});onUnmounted(()=>{// 清理资源if(app){app.destroy(true);app=null;}});constinitPixiApp=()=>{// 1. 创建Pixi应用app=newPIXI.Application({width:window.innerWidth,height:window.innerHeight,backgroundColor:0x1099bb,// 背景颜色resolution:window.devicePixelRatio||1,// 适配高清屏幕antialias:true,// 开启抗锯齿resizeTo:window,// 自适应窗口大小});// 将Pixi画布添加到DOMdocument.querySelector('.canvas-container').appendChild(app.view);// 2. 创建容器constcontainer=newPIXI.Container();app.stage.addChild(container);// 3. 创建背景精灵// 注意:你需要准备一张名为tree.jpg的图片放在public/textures目录下consttexture=PIXI.Texture.from('/textures/tree.jpg');constsprite=newPIXI.Sprite(texture);// 居中并缩放图片sprite.anchor.set(0.5);sprite.scale.set(0.5);sprite.position.set(app.screen.width/2,app.screen.height/2-300);container.addChild(sprite);// 4. 创建文字元素consttext=newPIXI.Text('Hello Tree',{fontFamily:"Arial",fontSize:30+Math.floor(app.screen.width*0.1),align:'center',fill:0xffffff,dropShadow:true,dropShadowColor:'#000000',dropShadowBlur:4,dropShadowAngle:Math.PI/2,dropShadowDistance:20});text.anchor.set(0.5);text.position.set(app.screen.width/2,app.screen.height/2);container.addChild(text);// 5. 创建置换滤镜(增强波纹效果)// 注意:需要一张名为replace.png的置换贴图constdisplaceSprite=PIXI.Sprite.from("/textures/replace.png");displaceSprite.scale.set(0.1);displaceSprite.texture.baseTexture.wrapMode=PIXI.WRAP_MODES.REPEAT;// 设置为重复模式constdisplaceFilter=newPIXI.DisplacementFilter(displaceSprite);container.addChild(displaceSprite);// 6. 创建多个水波纹滤镜(实现复杂效果)// 第一个水波纹滤镜(主波纹)constwaveFilter1=newShockwaveFilter([Math.random()*app.screen.width,Math.random()*app.screen.height],{radius:180,// 波纹半径wavelength:30,// 波长amplitude:10,// 振幅strength:100,// 强度speed:500,// 扩散速度waveLength:100,},0);// 第二个水波纹滤镜(辅助波纹1)constwaveFilter2=newShockwaveFilter([Math.random()*app.screen.width,Math.random()*app.screen.height],{radius:40,wavelength:30,amplitude:10,strength:100,speed:200,waveLength:100,},0);// 第三个水波纹滤镜(辅助波纹2)constwaveFilter3=newShockwaveFilter([Math.random()*app.screen.width,Math.random()*app.screen.height],{radius:40,wavelength:30,amplitude:10,strength:100,speed:200,waveLength:100,},0);// 7. 应用所有滤镜container.filters=[displaceFilter,waveFilter1,waveFilter2,waveFilter3];// 8. 动画循环app.ticker.add((delta)=>{// 更新置换贴图位置(创建流动效果)displaceSprite.position.x+=1;displaceSprite.position.y+=1;// 更新各个水波纹滤镜updateWaveFilter(waveFilter1,1);updateWaveFilter(waveFilter2,1.5);updateWaveFilter(waveFilter3,2);});// 9. 鼠标点击交互app.view.addEventListener('click',(e)=>{// 点击时重置第一个水波纹的位置和时间waveFilter1.center=[e.clientX,e.clientY];waveFilter1.time=0;});// 10. 窗口大小调整处理window.addEventListener('resize',()=>{app.renderer.resize(window.innerWidth,window.innerHeight);sprite.position.set(app.screen.width/2,app.screen.height/2-300);text.position.set(app.screen.width/2,app.screen.height/2);});};// 更新水波纹滤镜的辅助函数functionupdateWaveFilter(filter,resetTime){// 更新时间,控制波纹扩散filter.time+=0.01;// 重置时间并随机位置if(filter.time>resetTime){filter.time=0;filter.center=[Math.random()*app.screen.width,Math.random()*app.screen.height];}}</script><style>.canvas-container{width:100vw;height:100vh;margin:0;padding:0;overflow:hidden;}/* 重置全局样式 */*{margin:0;padding:0;box-sizing:border-box;}body{margin:0;overflow:hidden;}/* 确保Canvas占满屏幕 */canvas{display:block;width:100vw;height:100vh;}</style>

三、核心代码解析

3.1 ShockwaveFilter参数详解

constwaveFilter=newShockwaveFilter([centerX,centerY// 波纹中心位置],{radius:180,// 波纹最大半径wavelength:30,// 波长,控制波纹间距amplitude:10,// 振幅,控制波纹高度strength:100,// 强度,影响扭曲程度speed:500,// 波纹扩散速度waveLength:100,// 初始波长},0);// 初始时间

3.2 随机水波纹实现原理

// 通过定时重置滤波器中心位置实现随机波纹functionupdateWaveFilter(filter,resetTime){filter.time+=0.01;if(filter.time>resetTime){filter.time=0;// 随机生成新的波纹中心filter.center=[Math.random()*app.screen.width,Math.random()*app.screen.height];}}

3.3 鼠标交互实现

app.view.addEventListener('click',(e)=>{// 将鼠标点击坐标设置为波纹中心waveFilter1.center=[e.clientX,e.clientY];waveFilter1.time=0;// 重置时间开始新波纹});

总结

通过本教程,我们学习了:

  1. Pixi.js基础应用创建:初始化、精灵创建、容器管理
  2. 滤镜系统使用:ShockwaveFilter水波纹滤镜和DisplacementFilter置换滤镜
  3. 动画循环实现:使用app.ticker创建动态效果
  4. 交互功能添加:响应鼠标点击事件

附件

上面使用到了DisplacementFilter置换滤镜,这是需要一张置换滤镜的图片的,在这里附带上了,主要是通过黑白色的图片进行置换.

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:07:59

文献查询:高效获取学术资源的方法与技巧研究

科研新人做综述时最痛苦&#xff1a;一搜就是几十页论文&#xff0c;重复、无关、没用。下面三款工具让我效率翻倍。 ① WisPaper&#xff08;智能学术搜索 文献管理&#xff09; 官网&#xff1a;https://www.wispaper.ai WisPaper 能通过关键词和语义搜索快速找到相关文献&…

作者头像 李华
网站建设 2026/5/1 8:33:29

FaceFusion在Linux环境下编译时常见依赖缺失问题解决

FaceFusion在Linux环境下编译时常见依赖缺失问题解决 在AI内容生成技术迅速普及的今天&#xff0c;人脸替换&#xff08;Face Swapping&#xff09;已不再是影视特效工作室的专属工具。开源项目如 FaceFusion 正在让高保真度的人脸融合、表情迁移和年龄变换能力走向更广泛的开发…

作者头像 李华
网站建设 2026/4/30 19:06:25

Langchain-Chatchat开源项目部署指南(Docker Compose版)

Langchain-Chatchat开源项目部署指南&#xff08;Docker Compose版&#xff09; 在企业级AI应用日益普及的今天&#xff0c;如何在保障数据安全的前提下&#xff0c;构建一个真正“可控”的智能问答系统&#xff0c;已成为技术选型的核心命题。尤其是在金融、医疗、法律等对隐私…

作者头像 李华
网站建设 2026/5/1 9:50:56

uniapp+springboot档案馆参观预约系统 微信小程序_x0af865x_论文

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 u你APPSpring波哦天_jpalw52_微信小程序_xaf865x_ …

作者头像 李华
网站建设 2026/5/1 9:47:57

从点测量到解决方案:光谱共焦技术如何集成于运动平台,实现3D轮廓扫描与透明物体测厚?

光谱共焦技术凭借非接触、高精度、抗干扰性强的优势&#xff0c;在微观尺寸测量领域占据重要地位。但单一的光谱共焦传感器仅能实现“点测量”&#xff0c;难以满足工业场景中对大面积、复杂形态物体&#xff08;如透明玻璃/薄膜、复杂曲面零件&#xff09;的检测需求。通过与高…

作者头像 李华
网站建设 2026/5/1 9:33:14

Qwen3-VL-30B Docker部署与容器化最佳实践

Qwen3-VL-30B Docker部署与容器化最佳实践 &#x1f680; 在构建下一代AI Agent、智能文档处理系统和多模态搜索引擎的浪潮中&#xff0c;Qwen3-VL-30B 正迅速成为行业首选的视觉语言模型引擎。它不仅拥有 300亿参数的庞大体量&#xff0c;更通过创新架构实现了“高效激活”——…

作者头像 李华