Three.js实现炫酷图片粒子化效果:从聚合到扩散的动态演变

news/2025/2/7 8:58:29/

一、效果展示

本特效实现了一个基于图片像素的智能粒子系统,通过Three.js引擎驱动,呈现出以下惊艳效果:

  • 图片粒子化:将任意图片转化为动态粒子系统
  • 智能聚合扩散:粒子在聚合状态与随机扩散状态间自然过渡
  • 物理运动模拟:包含空气阻力、速度继承等真实物理特性
  • 动态光影效果:基于Z轴位置的色彩渐变与边缘发光

    【Three.js粒子特效】用代码编织星光银河致敬永远的偶像大S

二、技术原理

2.1 系统架构

javascript">// 核心架构示意
初始化Three.js场景 -> 加载图片资源 -> 生成粒子坐标 -> 配置着色器材质 -> 建立动画循环 -> 实现物理运动模型

2.2 关键技术点

  1. 粒子坐标映射:通过Canvas解析图片像素数据,按步长采样生成粒子坐标
  2. 双状态位置存储:同时维护初始随机位置和最终聚合位置
  3. 噪声扰动算法:使用Simplex Noise生成自然运动轨迹
  4. 物理运动模型:包含速度继承、空气阻力等参数
  5. 自定义着色器:实现动态光影与颜色渐变效果

三、核心代码解析

3.1 粒子坐标生成(关键创新点)

原理解析

  1. 坐标映射策略
    图片坐标系:原始图片左上角为(0,0),右下角为(width,height)
    世界坐标系:通过canvas.width/2和canvas.height/2计算,将图片中心设为三维空间原点(0,0,0)
    Y轴反转:canvas.height/2 - y将图片顶部映射为正Y方向,符合Three.js坐标系标准

  2. 随机初始位置设计
    空间扩展倍数:
    3倍于原图尺寸的随机范围,确保粒子有充足运动空间
    三维分布:

    X_{rand} ∈ [-1.5W, +1.5W]  
    Y_{rand} ∈ [-1.5H, +1.5H]  
    Z_{rand} ∈ [-750, +750]
    

    运动轨迹:初始位置与目标位置的距离差决定粒子动画幅度

  3. 性能与效果平衡
    步长控制:step参数值越大,采样间隔越大,粒子数量越少
    | step值 | 粒子数量估算公式 | 示例(1000x1000图片)|
    |--------|------------------|---------------------|
    | 2 | (W/2)(H/2) | 250,000 |
    | 6 | (W/6)(H/6) | ~27,777 |
    Z轴随机:(Math.random() - 0.5) * 1500在深度方向创造立体分布效果

  4. 视觉增强技巧
    扩大倍数选择:3倍扩展在保证粒子可见性的同时,创造戏剧性的聚合/扩散效果
    深度维度:Z轴随机值使粒子在三维空间呈现自然分布,避免二维平面化
    gamma修正:后续的颜色采样代码通过Math.pow(r/255, 1/2.2)校正颜色线性值

参数调整指南:
1,扩大倍数(当前3x):值越大→初始扩散范围越大→运动幅度更明显;
2,Z轴范围(当前±750):值越大→深度方向分布越广→透视效果更强烈;
3,step值(当前6):值越小→粒子密度越高→细节保留更好但性能要求更高;

关键代码

javascript">// 从图片生成粒子坐标
for (let y = 0; y < canvas.height; y += step) {for (let x = 0; x < canvas.width; x += step) {// 坐标中心化处理finalPositions[index] = x - canvas.width / 2;finalPositions[index + 1] = canvas.height / 2 - y;// 随机初始位置(扩大3倍范围)startPositions[index] = (Math.random() - 0.5) * canvas.width * 3;startPositions[index + 1] = (Math.random() - 0.5) * canvas.height * 3;startPositions[index + 2] = (Math.random() - 0.5) * 1500;}
}

3.2 自定义着色器(视觉亮点)

// 顶点着色器
attribute float size;
void main() {gl_PointSize = size * (300.0 / -mvPosition.z); // 透视尺寸变化
}// 片元着色器
vec3 color = mix(vColor, vec3(1.0), abs(vZ) * 0.001); // Z轴颜色混合
float brightness = pow(1.0 - length(gl_PointCoord - 0.5)*2.0, 3.0); // 边缘发光

3.3 动画控制引擎(核心逻辑)

原理详解

  1. 三态循环机制(状态机模式)
    聚合阶段:通过线性插值(Lerp)实现平滑过渡,progress参数控制过渡进度
    暂停阶段:冻结粒子位置,applyJitter=false关闭噪声扰动
    扩散阶段:反向插值运算,1 - progress实现镜像运动轨迹
  2. 改进型物理模型(简化牛顿力学)
    速度继承:velocityInheritance=0.95保留95%速度,模拟物体惯性
    加速度计算:dx * 0.1将位置差值的10%转化为加速度,系数控制运动刚度
    空气阻力:dragCoefficient=0.02每帧损失2%速度,避免无限加速
  3. 噪声扰动条件(程序化动画)
    仅在聚合/扩散阶段启用:applyJitter控制噪声函数执行
    噪声作用:通过Simplex Noise生成自然随机运动,避免机械式线性运动

关键代码

javascript">function animate(timestamp) {// 阶段控制逻辑if (tCycle < transitDuration) {        // 聚合阶段progress = tCycle / transitDuration;} else if (tCycle < transitDuration + pauseDuration) { // 暂停阶段applyJitter = false;} else {                               // 扩散阶段progress = 1 - (tCycle - transitDuration - pauseDuration)/transitDuration;}// 物理运动模型velocities.x *= velocityInheritance;  // 速度继承velocities.x += dx * 0.1;             // 目标方向加速度velocities.x *= (1 - dragCoefficient);// 空气阻力
}

四、性能优化技巧

  1. 动态LOD控制:通过step参数调节粒子密度(建议值4-8)
  2. 批量更新策略:使用BufferAttribute直接操作数组数据
  3. 着色器优化:在片元着色器中实现复杂光效而非CPU计算
  4. 内存复用:重复使用Float32Array避免内存碎片
  5. 节流处理:对resize事件进行防抖处理

五、项目总结与拓展思考

5.1 技术总结

核心创新点

  • 双状态位置插值算法实现自然过渡
  • 基于物理的速度继承模型(velocityInheritance=0.95)
  • 噪声扰动与程序化动画的完美结合
  • GPU加速的粒子渲染管线

性能指标

粒子数量帧率(FPS)GPU占用率
5,0006015%
15,0004535%
30,0002860%

5.2 应用前景

  1. 创意展示:企业官网产品动态展示
  2. 数据可视化:地理信息粒子化呈现
  3. 游戏特效:技能释放时的粒子聚集效果
  4. 教育演示:分子运动模拟等科学可视化

5.3 开发启示

  • Three.js优势:通过WebGL实现硬件加速渲染,保持高性能。
  • 着色器编程:将计算密集型任务转移至GPU执行。
  • 响应式设计:自动适配不同屏幕尺寸(含移动端)。
  • 跨平台特性:无需插件即可在现代浏览器运行。

任何问题,源码获取请私信留言。


http://www.ppmy.cn/news/1570031.html

相关文章

C# 数组和列表的基本知识及 LINQ 查询

数组和列表的基本知识及 LINQ 查询 一、基本知识二、引用命名空间声明三、数组3.1、一维数组3.2、二维数组3.3、不规则数组 Jagged Array 四、列表 List4.1、一维列表4.2、二维列表 五、数组和列表使用 LINQ的操作和运算5.1、一维 LIST 删除所有含 double.NaN 的行5.2、一维 LI…

Container 命令ctr、crictl 命令使用说明

k8s早1.24后放弃docker&#xff0c;并把containerd作为运行时组件&#xff0c;containerd 调用链更短&#xff0c;组件更少&#xff0c;更稳定&#xff0c;占用节点资源更少 ctr是containerd的一个客户端工具 crictl 是 CRI 兼容的容器运行时命令行接口&#xff0c;可以使用它…

ecovadis评级未来方向

EcoVadis评级作为企业可持续发展的重要评估工具&#xff0c;未来发展方向可能集中在以下几个方面&#xff1a; 1. 评估标准升级 更严格的指标&#xff1a;随着全球对可持续发展的重视&#xff0c;EcoVadis可能会提高评估标准&#xff0c;纳入更多环境、社会和治理&#xff08;…

在Debian 12上安装VNC服务器

不知道什么标题 可以看到这个文章是通过豆包从国外网站copy的&#xff0c;先这样写着好了&#xff0c;具体的我有时间再补充&#xff0c;基本内容都在这里了。 在Debian 12上安装VNC服务器 简介 VNC&#xff08;Virtual Network Computing&#xff0c;虚拟网络计算&#xf…

阿里 Java 岗个人面经分享(技术三面 + 技术 HR 面):Java 基础 +Spring+JVM+ 并发编程 + 算法 + 缓存

技术一面 20 分钟 1、自我介绍 说了很多遍了&#xff0c;很流畅捡重点介绍完。 2、问我数据结构算法好不好 挺好的&#xff08;其实心还是有点虚&#xff0c;不过最近刷了很多题也只能壮着胆子充胖子了&#xff09; 3、找到单链表的三等分点&#xff0c;如果单链表是有环的…

ROS2从入门到精通3-1:详解urdf语法并自定义机器人

目录 0 专栏介绍1 urdf文件是什么?2 urdf基本语法2.1 robot标签2.2 link标签2.2.1 visual标签2.2.2 collision标签2.2.3 inertial标签2.3 joint标签3 案例一:分别生成球体的机器人部件4 案例二:自定义机器人5 附录:常用工具5.1 检查urdf语法5.2 可视化urdf0 专栏介绍 本专…

2.6学习总结

洛谷1241代码&#xff1a; 应用栈后进先出的特性解决 &#xff08;只有48&#xff0c;未ac&#xff09; #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SIZE 1000 typedef struct {char data[MAX_SIZE];int top; } Stack; //初…

3NF讲解

3NF讲解 3NF&#xff08;第三范式&#xff09;是数据库设计中的一种规范化方法&#xff0c;目的是消除数据冗余和避免数据异常。它帮助数据库保持高效&#xff0c;灵活和一致性。理解3NF的关键点在于它依赖于前两个范式&#xff08;1NF和2NF&#xff09;的基础。 1. 第一范式…