当前位置: 首页 > news >正文

使用 Three.js 实现炫酷的除夕烟花特效

1,前言

在除夕夜,璀璨的烟花点亮夜空,为节日增添了浓厚的喜庆氛围。在 Web 端,我们可以使用 Three.js 来模拟这种美轮美奂的烟花特效,让网页也能展现绚丽的节日气息。本文将介绍如何利用 Three.js 及其着色器技术,创建一个动态的烟花爆炸效果。

2,技术原理解析

为了模拟真实的烟花,我们需要解决以下几个关键问题:

  1. 烟花的轨迹:在爆炸前,烟花需要沿着一定的路径上升。
  2. 爆炸模拟:在特定高度,烟花粒子会向各个方向散开,形成美丽的爆炸效果。
  3. 粒子系统:使用 THREE.Points 来管理大量的烟花粒子,控制其颜色、大小、速度等参数。
  4. 后期处理(Bloom):使用 UnrealBloomPass 增强烟花的发光效果,使其更加亮眼。

实现效果:

除夕夜的璀璨烟花秀:三维视觉盛宴,感受震撼瞬间

代码实现

3.1,初始化 Three.js 场景

首先,我们需要创建一个基本的 Three.js 场景,包括 Scene(场景)、Camera(相机)和 WebGLRenderer(渲染器)。

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
camera.position.z = 50;

3.2,添加后期处理(Bloom 效果)

为了让烟花更加炫目,我们使用 UnrealBloomPass 进行光晕处理。

const composer = new THREE.EffectComposer(renderer);
const renderPass = new THREE.RenderPass(scene, camera);
const bloomPass = new THREE.UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight),1.5,  // 泛光强度0.5,  // 泛光半径0.85  // 泛光阈值
);
bloomPass.threshold = 0.1;
bloomPass.strength = 0.5;
bloomPass.radius = 0.5;
composer.addPass(renderPass);
composer.addPass(bloomPass);

3.3,创建烟花粒子系统

我们使用 THREE.Points 来管理烟花粒子,并利用着色器 (ShaderMaterial) 实现更细腻的视觉效果。

const fireworkMaterial = new THREE.ShaderMaterial({uniforms: {color: { value: new THREE.Color(0xffffff) },pointTexture: { value: new THREE.TextureLoader().load('https://threejs.org/examples/textures/sprites/disc.png') }},vertexShader: `attribute float size;attribute vec3 customColor;varying vec3 vColor;void main() {vColor = customColor;vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);gl_PointSize = size * (300.0 / -mvPosition.z);gl_Position = projectionMatrix * mvPosition;}`,fragmentShader: `uniform vec3 color;uniform sampler2D pointTexture;varying vec3 vColor;void main() {gl_FragColor = vec4(color * vColor, 1.0);gl_FragColor = gl_FragColor * texture2D(pointTexture, gl_PointCoord);if (gl_FragColor.a < 0.1) discard;}`,blending: THREE.AdditiveBlending,depthTest: false,transparent: true
});

3.4,创建 Firework 类

Firework 类用于模拟单个烟花的运动轨迹和爆炸效果。

class Firework {constructor() {this.particles = new THREE.Points(geometry, fireworkMaterial);this.particles.position.set(Math.random() * 40 - 20, -30, Math.random() * 40 - 20);this.velocity = new THREE.Vector3(0, Math.random() * 3 + 2, 0);scene.add(this.particles);}update() {this.particles.position.add(this.velocity);this.velocity.y -= 0.02; // 重力作用if (this.velocity.y < 0) this.explode();}explode() {// 让粒子向四周扩散for (let i = 0; i < this.particles.geometry.attributes.position.array.length; i += 3) {this.particles.geometry.attributes.position.array[i] += (Math.random() - 0.5) * 10;this.particles.geometry.attributes.position.array[i + 1] += (Math.random() - 0.5) * 10;this.particles.geometry.attributes.position.array[i + 2] += (Math.random() - 0.5) * 10;}this.particles.geometry.attributes.position.needsUpdate = true;}
}

3.5,动画更新

在 animate 函数中不断更新烟花的状态,并渲染场景。

const fireworks = [];
function animate() {requestAnimationFrame(animate);if (Math.random() < 0.05) fireworks.push(new Firework());fireworks.forEach((firework, index) => {firework.update();if (firework.dead) {scene.remove(firework.particles);fireworks.splice(index, 1);}});composer.render();
}
animate();

4,功能总结

本文介绍了一个基于Three.js的3D烟花特效演示,主要功能包括:动态生成带有随机轨迹的上升烟花弹头、多阶段爆炸效果(包含二次爆炸)、粒子拖尾轨迹、颜色渐变系统,以及使用后期处理实现的泛光特效。烟花在到达预定高度后根据多种模式(球形、柱状等)爆炸,粒子受重力、空气阻力影响自然下落,并自动优化性能管理粒子生命周期,同时支持窗口自适应和不同设备的性能调节。

5,结语

本文介绍了如何使用 Three.js 创建炫目的烟花特效,主要涉及粒子系统、着色器处理以及后期效果优化。你可以根据自己的需求调整烟花的颜色、速度、爆炸范围等参数,甚至结合 Web Audio API 让烟花与音乐同步。任何问题欢迎在评论区交流!🎆🎇

相关文章:

使用 Three.js 实现炫酷的除夕烟花特效

1&#xff0c;前言 在除夕夜&#xff0c;璀璨的烟花点亮夜空&#xff0c;为节日增添了浓厚的喜庆氛围。在 Web 端&#xff0c;我们可以使用 Three.js 来模拟这种美轮美奂的烟花特效&#xff0c;让网页也能展现绚丽的节日气息。本文将介绍如何利用 Three.js 及其着色器技术&…...

LMM-3DP:集成 LMM 规划器和 3D 技能策略实现可泛化操作

25年1月来自UCSD的论文“Integrating LMM Planners and 3D Skill Policies for Generalizable Manipulation”。 大型多模态模型 (LMM) 的视觉推理能力和 3D 特征场语义丰富性的最新进展&#xff0c;拓展了机器人能力的范围。这些发展对于弥合 LMM 高级推理与利用 3D 特征场低…...

Linux——基础命令3

1、关机重启命令 reboot指令 作用&#xff1a;重启计算机 语法&#xff1a;reboot shutdown指令 作用&#xff1a;关机 语法&#xff1a;shutdown -h 时间 时间常见的值&#xff1a; now &#xff08;立即关机&#xff09; m&#xff08;m表示minutes数字&#xff09;eg&…...

ChatGPT提问技巧:行业热门应用提示词案例-文案写作

ChatGPT 作为强大的 AI 语言模型&#xff0c;已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案&#xff0c;关键在于如何与它“沟通”&#xff0c;也就是如何设计提示词&#xff08;Prompt&#xff09;。以下是一些实用的提示词案例&#xff0c;帮助你解锁 ChatG…...

python - 封装moondream(备份)

目录 一、 moondream封装成类 二、moondream封装成http api 一、 moondream封装成类 # moondream_model.py #https://github.com/vikhyat/moondream?tab=readme-ov-fileimport moondream as md from PIL import Imageclass MoondreamModel:def __init__(self, model_path):…...

响应式编程库(三) -r2dbc

r2dbc整合 什么是r2dbc版本选择简单试用整合springbootDatabaseClient 进行查询使用Repository接口(对应mapper)实体类复杂查询&#xff08;一对一&#xff09;实体类转换器测试代码一对多关系 什么是r2dbc 反应式关系数据库连接&#xff08;R2DBC&#xff09;项目为关系数据库…...

嵌入式AI革命:DeepSeek开源如何终结GPU霸权,开启单片机智能新时代?

2025年&#xff0c;全球AI领域最震撼的突破并非来自算力堆叠的超级模型&#xff0c;而是中国团队DeepSeek通过开源策略&#xff0c;推动大模型向微型化、低功耗场景的跨越。相对于当人们还在讨论千亿参数模型的训练成本被压缩到600万美金而言&#xff0c;被称作“核弹级别”的操…...

基于遗传算法的64QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; GA优化过程&#xff1a; 优化前后星座图对比&#xff1a; &#xff08;优化后…...

从零开始玩转Docker:轻松开启容器化之旅

一、什么是 Docker Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。简单来说&#xff0c;Docker 就像是一个超级 “快递箱”&#xff0c…...

kafka生产端之架构及工作原理

文章目录 整体架构元数据更新 整体架构 消息在真正发往Kafka之前&#xff0c;有可能需要经历拦截器&#xff08;Interceptor&#xff09;、序列化器&#xff08;Serializer&#xff09;和分区器&#xff08;Partitioner&#xff09;等一系列的作用&#xff0c;那么在此之后又会…...

38、【OS】【Nuttx】OSTest分析(3):参数传递

背景 接之前 blog 36、【OS】【Nuttx】OSTest分析&#xff08;2&#xff09;&#xff1a;环境变量测试 37、【OS】【Nuttx】OSTest分析&#xff08;2&#xff09;&#xff1a;任务创建 分析完环境变量测试&#xff0c;和任务创建的一些关键要素&#xff0c;OSTest 进入下一阶段…...

存储异常导致的Oracle重大生产故障

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...

C语言时间相关宏定义

在C语言中&#xff0c;预处理器提供了一些与时间相关的宏定义&#xff0c;用于在编译时获取日期、时间等信息。除了 __TIMESTAMP__ 和 __DATE__&#xff0c;还有以下相关的宏定义&#xff1a; __DATE__ 当前编译日期的字符串&#xff0c;格式为 "Mmm dd yyyy"&#x…...

Android Studio:Application 和 Activity的区别

Application 和 Activity 是 Android 中非常重要的两个组件&#xff0c;它们分别负责不同的生命周期管理和应用的不同层次的操作。 Application 是应用级别的生命周期管理&#xff0c;它在整个应用运行时只有一个实例&#xff0c;负责应用的全局初始化和资源管理。Activity 是…...

如何优化爬虫以提高搜索效率

在数据采集和网络爬虫领域&#xff0c;优化爬虫性能是提升数据采集效率的关键。随着网页结构的日益复杂和数据量的不断增长&#xff0c;高效的爬虫能够显著降低运行时间和资源成本。本文将详细介绍如何优化爬虫以提高搜索效率&#xff0c;包括选择合适的工具、优化代码逻辑、使…...

git撤销上一次的提交

1、撤销提交 如果需要撤销上一次的提交&#xff0c;只是提交到了本地&#xff0c;可以通过命令&#xff1a; // 撤销最近的提交&#xff08;保留修改&#xff09; git reset --soft HEAD~1 这个操作可以保留之前的提交和当前的修改。最近一次的提交到本地的修改的提交会回到…...

LLM学习笔记1——本地部署Meta-Llama-3.2-1B大模型

系列文章目录 参考博客 参考博客 文章目录 系列文章目录前言与调用一、部署要求二、实现步骤0.深度学习环境错误1&#xff0c;验证pytorch版本时提示以下问题&#xff1a;错误2&#xff0c;验证pytorch版本时提示以下问题&#xff1a;错误3&#xff0c;有时候还会提示你有一些…...

Nginx反代Ollama接口跨域、无法逐字输出问题

场景 本地部署deepseek模型&#xff0c;用的Ollama管理&#xff0c;内网穿透到公网&#xff0c;在通过nginx反代ollama接口。 问题描述 跨域问题 nginx转发时请求头中需要加入origin&#xff0c;并且origin还要和ollama接口同源&#xff08;协议、ip、端口一致&#xff09;。…...

大学资产管理系统中的下载功能设计与实现

大学资产管理系统是高校信息化建设的重要组成部分&#xff0c;它负责记录和管理学校内所有固定资产的信息。随着信息技术的发展&#xff0c;下载功能成为提高资产管理效率的关键环节之一。 系统架构的设计是实现下载功能的基础。一个良好的系统架构能够确保数据的高效传输和存储…...

股指入门:股指期货是什么意思?在哪里可以做股指期货交易?

股指期货是一种以股票指数为标的物的期货合约&#xff0c;也可以称为股票指数期货或期指。 股指期货是什么意思&#xff1f; 股指期货是一种金融衍生品&#xff0c;其标的资产是股票市场上的股指&#xff0c;例如标普500指数、道琼斯工业平均指数、上证50指数等。 股指期货允…...

< OS 有关 > 利用 google-drive-ocamlfuse 工具,在 Ubuntu 24 系统上 加载 Google DRIVE 网盘

Created by Dave On 8Feb.2025 起因&#xff1a; 想下载 StableDiffusion&#xff0c;清理系统文件时把 i/o 搞到 100%&#xff0c;已经删除到 apt 缓存&#xff0c;还差 89MB&#xff0c;只能另想办法。 在网上找能不能挂在 Google 网盘&#xff0c;百度网盘&#xff0c;或 …...

Golang的引用类型和指针

在Golang中&#xff0c;引用类型和指针是两个容易混淆的概念&#xff0c;但它们有本质的区别。理解它们的区别对于编写高效、正确的Go代码至关重要。 1. 引用类型 引用类型是Go语言中某些内置类型的统称&#xff0c;它们的值在传递时共享底层数据&#xff0c;而不是复制数据。…...

51单片机之冯·诺依曼结构

一、概述 8051系列单片机将作为控制应用最基本的内容集成在一个硅片上&#xff0c;其内部结构如图4-1所示。作为单一芯片的计算机&#xff0c;它的内部结构与一台计算机的主机非常相似。其中微处理器相当于计算机中的CPU&#xff0c;由运算器和控制器两个部分构成&#xff1b;…...

32. C 语言 安全函数( _s 尾缀)

本章目录 前言什么是安全函数&#xff1f;安全函数的特点主要的安全函数1. 字符串操作安全函数2. 格式化输出安全函数3. 内存操作安全函数4. 其他常用安全函数 安全函数实例示例 1&#xff1a;strcpy_s 和 strcat_s示例 2&#xff1a;memcpy_s示例 3&#xff1a;strtok_s 总结 …...

Android T(13) 源码分析 — BufferQueue 的分析

Android T(13) 源码分析 — BufferQueue 的分析 文章目录 Android T(13) 源码分析 — BufferQueue 的分析前言摘要一、Java 层的 BufferQueue 分析二、原生层的 BufferQueue 分析1、BLASTBufferQueue 的创建2、BLASTBufferQueue 的更新3、Surface 的创建 总结 前言 该系列文章…...

Vite+TS项目中配置路径别名

在使用 Vite 和 TypeScript 的项目中配置路径别名&#xff0c;可以简化模块导入路径&#xff0c;提高代码的可读性和维护性。以下是详细的步骤和示例代码&#xff1a; 1. 配置 Vite 别名 前置条件 下载types/node 下面引入的path会用到 npm install types/node --save-dev原…...

看盘细节系列 篇二:集合竞价的9点18分大单打到3%以下或以上,9点19分撤单

文章目录 系列文章现象原因分析时间点含义正常情况测试市场反应诱导跟风操纵股价意图系列文章 看盘细节系列 篇一:集合竞价尾盘突变 现象 集合竞价中 9 点 18 分通过一笔大单或连续几笔大单将股价打到 3% 以下或以上,9 点 19 分又迅速撤单。从而在分时图上留下一根长长的上…...

Java继承简介

继承的本质&#xff1a;是代码的复用&#xff0c;重复使用已经定义好的方法和域&#xff08;即全局变量&#xff09; 要掌握继承首先要了解Java方法的重载和重写 方法的重载和重写 方法的重载 当前方法名相同&#xff0c;但是参数类型不同&#xff0c;发生重载 类比数学函…...

redis之哨兵集群搭建

一&#xff1a;哨兵集群工作概览图 1.监控&#xff1a;sentinel通过心跳监控redis的master和slave实例是否正常工作 2.故障转移&#xff1a;假如master出现故障&#xff0c;sentinel会选举一个slave作为新的master&#xff0c;当故障实例恢复后身份会变成slave&#xff0c;会以…...

保姆级AI开发环境搭建

目录 windows下环境搭建1. Python环境搭建2. 下载vLLM2.1 安装CUDA2.2 安装Pytorch2.3 安装vllm 3. 部署Deepseek&#xff08;huggingface&#xff09;3.1 DeepSeek的优化建议 4. ollama快速部署Deepseek4.1 下载Ollama4.2 配置Ollma4.2 运行模型4.3 其他Ollama命令 linux下环境…...