用 Three.js 打造 520 粒子心形特效:6 大视觉效果的工程实现
文章目录前言一、整体架构二、性能分级:让低端设备也能跑三、心形数学:参数方程 + 分层填充四、效果 1:Bokeh 散景——深度决定柔化程度五、效果 2:彩虹渐变——HSL 色轮映射六、效果 3:中心 Bloom——Canvas 纹理 + Sprite七、效果 4:运动拖尾——速度场驱动的椭圆采样八、效果 5:呼吸光环——心形轮廓的脉动粒子九、效果 6:主题切换——CPU 端颜色重算 + GPU 端 uniform 控制十、鼠标视差:平滑插值的交互感十一、CSS 层:星云背景 + 暗角总结一个单 HTML 文件,5200+ 粒子,6 大视觉效果,3 套主题自动切换——用前端工程思维拆解浪漫。前言520 快到了,想用代码做点浪漫的事?本文将拆解一个纯前端实现的粒子心形特效,涵盖 Bokeh 散景、运动拖尾、呼吸光晕、彩虹渐变、中心 Bloom 和主题切换六大效果。项目仅依赖 Three.js CDN,单文件即可运行。在线效果:点击查看一、整体架构整个特效由5 套粒子系统 + 1 个中心光晕组成:系统粒子数(满配)作用Heart5200心形主体Halo1600心形外围光晕Dust900漂浮尘埃Stars900远景星空Ring500呼吸光环Glow1 (Sprite)中心 Bloom所有粒子共享Additive Blending + 深度关闭的渲染策略,通过自定义 ShaderMaterial 实现逐粒子动画。二、性能分级:让低端设备也能跑不是所有设备都能扛住 5200 个粒子。项目在启动时通过 WebGL 参数检测 GPU 性能等级:functiongetPerformanceTier(){constc=document.createElement("canvas");constgl=c.getContext("webgl")||c.getContext("experimental-webgl");if(!gl)return0.4;constdbg=gl.getExtension("WEBGL_debug_renderer_info");constr=dbg?gl.getParameter(dbg.UNMASKED_RENDERER_WEBGL):"";if(/Mobi|Android|iPhone/i.test(navigator.userAgent)||/Mali-[TG4]|Adreno [345]\d{2}|PowerVR/i.test(r))return0.5;constmt=gl.getParameter(gl.MAX_TEXTURE_SIZE);returnmt=16384?1.0:mt=8192?0.75:0.55;}constTIER=getPerformanceTier();所有粒子数量都乘以TIER系数:heartParticleCount:Math.round(5200*TIER),haloParticleCount:Math.round(1600*TIER),// ...关键思路:用MAX_TEXTURE_SIZE作为 GPU 能力的代理指标——高端卡 16384,中端 8192,集显/移动端更低。这比navigator.hardwareConcurrency更准确地反映图形性能。三、心形数学:参数方程 + 分层填充心形曲线用的是经典参数方程:functionheartShape(t){return{x:16*Math.pow(Math.sin