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

threejs实现烟花效果

大家好!我是 [数擎 AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步!
开发领域:前端开发 | AI 应用 | Web3D | 元宇宙
技术栈:JavaScript、React、ThreeJs、WebGL、Go
经验经验:6 年+ 前端开发经验,专注于图形渲染和 AI 技术

找工作,就上智简未来

又是一年岁末,又是辞旧迎新的时刻。寒冬虽冷,但人们心中的那份期待和喜悦,让整个世界变得格外温暖。烟花,作为新年的象征之一,总是在夜空中为我们带来光彩夺目的祝福。

用代码点亮新年

今年,我尝试用代码模拟烟花绽放的画面,融入一些对新年的期待与祝福。烟花不仅是视觉上的震撼,它也能在技术中被表现得充满活力与艺术感。以下是一段基于 Three.js 的烟花效果代码片段,送给所有热爱编程的人们:

import * as THREE from 'three';// Vertex Shader
const vertexShader = `
varying vec2 vUv;void main() {vUv = uv;gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`;// Fragment Shader
const fragmentShader = `
#define PI      3.141592653589793
#define TWO_PI   6.283185307179586uniform float iTime;
uniform vec2 iResolution;varying vec2 vUv;float star5SDF(vec2 p, float r, float m) {const vec2 k1 = vec2(0.809016994375, -0.587785252292);const vec2 k2 = vec2(-k1.x, k1.y);p.x = abs(p.x);p -= 2.0 * max(dot(k1, p), 0.0) * k1;p -= 2.0 * max(dot(k2, p), 0.0) * k2;p.x = abs(p.x);p.y -= r;vec2 ab = m * vec2(-k1.y, k1.x) - vec2(0, r);float h = clamp(dot(p, ab) / dot(ab, ab), 0.0, 1.0);return length(p - ab * h) * sign(p.y * ab.x - p.x * ab.y);
}float hash1(float p) {p = fract(p * .1031 * 9811.164); p *= p + 33.33; p *= p + p;return fract(p);
}vec2 hash21(float p) {vec3 p3 = fract(vec3(p) * vec3(.1031, .1030, .0973) * 1023.468);p3 += dot(p3, p3.yzx + 33.33);return fract((p3.xx + p3.yz) * p3.zy);
}vec3 colorRibbon(float t) {return abs(mod(vec3(0., 1., 2.) / 3.0 + t, 1.0) - 0.5) * 4.0 - 0.5;
}vec2 getHeartPosition(float t) {return vec2(16.0 * sin(t) * sin(t) * sin(t),-(13.0 * cos(t) - 5.0 * cos(2.0 * t) - 2.0 * cos(3.0 * t) - cos(4.0 * t)));
}void main() {float t = iTime * 0.50;vec2 uv = vUv * 2.0 - 1.0;uv.x *= iResolution.x / iResolution.y;vec3 color = vec3(0.0);const float jmax = 10.0;const float imax = 20.0;for (float j = 0.0; j < jmax; j++) {float ja = j / jmax;t -= hash1(ja * 33.669);float t1 = floor(t);float t1f = fract(t);float t2fa = min(0.3, t1f) / 0.3;float t2fb = max(t1f * (step(0.3, t1f)) - 0.3, 0.0) / 0.7;float flasht = t2fb * (step(0.1, t2fb) - step(0.0, t2fb)) * 10.0;vec2 layer1_pos = hash21(t1 * j);vec3 col = colorRibbon(hash1(layer1_pos.y));for (float i = 0.0; i < imax; i++) {float ia = i / imax;vec2 layer2_pos = getHeartPosition(ia * TWO_PI) * t2fb * -0.028;layer2_pos -= vec2(1.0 - layer1_pos.x * 2.0,1.0 - max(layer1_pos.y + 0.75, 0.75) * t2fa);float blink = step(1.0, mod(i, 2.0));float sdf = star5SDF(uv - layer2_pos, 0.05, 0.09) + 0.05;color += col * smoothstep(-0.016,flasht * 3.6 + 4.5 + sin(t2fb * 30.0) * blink,(0.02 / sdf));}}gl_FragColor = vec4(color, 1.0);
}
`;// Three.js Scene Setup
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 2;const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// Uniforms
const uniforms = {iTime: { value: 0.0 },iResolution: { value: new THREE.Vector2(window.innerWidth, window.innerHeight) },
};// Shader Material
const material = new THREE.ShaderMaterial({uniforms: uniforms,vertexShader: vertexShader,fragmentShader: fragmentShader,
});const geometry = new THREE.PlaneGeometry(2, 2);
const plane = new THREE.Mesh(geometry, material);
scene.add(plane);// Animation Loop
function animate() {uniforms.iTime.value += 0.01;renderer.render(scene, camera);requestAnimationFrame(animate);
}// Resize Listener
window.addEventListener('resize', () => {renderer.setSize(window.innerWidth, window.innerHeight);uniforms.iResolution.value.set(window.innerWidth, window.innerHeight);camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();
});animate();

在这段代码中,烟花的效果随着时间流逝不断变化,绽放出丰富的色彩,就像我们对未来的期待一样,无限可能。

对你的新年祝福

烟花再美,最重要的还是与亲人、朋友一同分享的瞬间。新年是回顾过往、展望未来的时刻。愿你在新的一年里:

身体健康,平安喜乐。
工作顺利,勇敢追梦。
家庭幸福,爱与温暖常伴。
无论过去一年经历了什么,愿烟花的绽放点亮你的内心,也点燃你的希望。新年快乐,愿你拥有一个充满惊喜和幸福的 2025 年!

相关文章:

threejs实现烟花效果

大家好&#xff01;我是 [数擎 AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;前端开发 | A…...

ThinkPad E480安装Ubuntu 18.04无线网卡驱动

个人博客地址&#xff1a;ThinkPad E480安装Ubuntu 18.04无线网卡驱动 | 一张假钞的真实世界 遗憾的是虽然下面的方法可以解决&#xff0c;但是内核升级后需要重新安装。 基本信息 Ubuntu 18.04ThinkPad E480使用下面的命令查看 Linux 内核&#xff1a; $ uname -r 5.0.0-3…...

React Router v6配置路由守卫

首先准备好以下页面 登录页&#xff1a;用户可以在此页面登录。 受保护页&#xff1a;只有登录的用户可以访问&#xff0c;否则会重定向到登录页。 公共页面&#xff1a;不需要鉴权&#xff0c;任何人都可以访问。 1. 安装依赖 首先&#xff0c;我们需要安装 react-router-do…...

研发的立足之本到底是啥?

0 你的问题&#xff0c;我知道&#xff01; 本文深入T型图“竖线”的立足之本&#xff1a;专业技术 技术赋能业务能力。研发在学习投入精力最多&#xff0c;也误区最多。 某粉丝感发展遇到瓶颈&#xff0c;项目都会做&#xff0c;但觉无提升&#xff0c;想跳槽。于是&#x…...

react中如何获取dom元素

实现代码 const inputRef useRef(null) inputRef.current.focus()...

JavaScript系列(49)--游戏引擎实现详解

JavaScript游戏引擎实现详解 &#x1f3ae; 今天&#xff0c;让我们深入探讨JavaScript的游戏引擎实现。游戏引擎是一个复杂的系统&#xff0c;它需要处理渲染、物理、音频、输入等多个方面&#xff0c;让我们一步步实现一个基础但功能完整的游戏引擎。 游戏引擎基础概念 &am…...

20【变量的深度理解】

一说起变量&#xff0c;懂点编程的都知道&#xff0c;但是在理解上可能还不够深 变量就是存储空间&#xff0c;电脑上的存储空间有永久&#xff08;硬盘&#xff09;和临时&#xff08;内存条&#xff09;两种&#xff0c;永久数据重启电脑后依旧存在&#xff0c;临时数据只…...

19.Word:小马-校园科技文化节❗【36】

目录 题目​ NO1.2.3 NO4.5.6 NO7.8.9 NO10.11.12索引 题目 NO1.2.3 布局→纸张大小→页边距&#xff1a;上下左右插入→封面&#xff1a;镶边→将文档开头的“黑客技术”文本移入到封面的“标题”控件中&#xff0c;删除其他控件 NO4.5.6 标题→原文原文→标题 正文→手…...

DeepSeek回答量化策略对超短线资金的影响

其实最近很长一段时间我在盘中的感受就是量化策略的触发信号都是超短线选手经常用到的,比如多个题材相互卡位,近期小红书-消费,好想你,来伊份 跟 算力 电光科技,机器人 金奥博 冀凯股份 五洲新春 建设工业 ,这些票的波动其实都是被量化策略锚定了,做成了策略异动。特别…...

2.3.1 基本数据类型

ST&#xff08;Structured Text&#xff09;语言支持多种基本数据类型&#xff0c;用于定义变量、常量以及函数参数等。这些数据类型涵盖了布尔值、整数、浮点数、字符和字符串等常见类型。以下是ST语言中基本数据类型的详细说明&#xff1a; 布尔类型&#xff08;BOOL&#xf…...

探秘 TCP TLP:从背景到实现

回家的路上还讨论了个关于 TCP TLP 的问题&#xff0c;闲着无事缕一缕。本文内容参考自 Tail Loss Probe (TLP): An Algorithm for Fast Recovery of Tail Losses 以及 Linux 内核源码。 TLP&#xff0c;先说缘由。自 TCP 引入 Fast retrans 机制就是为了尽力避免 RTO&#xf…...

解锁豆瓣高清海报:深度爬虫与requests进阶之路

前瞻 PosterBandit 这个脚本能够根据用户指定的日期&#xff0c;爬取你看过的影视最高清的海报&#xff0c;并自动拼接成指定大小的长图。 你是否发现直接从豆瓣爬取下来的海报清晰度很低&#xff1f; 使用 .pic .nbg img CSS 选择器&#xff0c;在 我看过的影视 界面找到图片…...

无耳科技 Solon v3.0.7 发布(2025农历新年版)

Solon 框架&#xff01; Solon 框架由杭州无耳科技有限公司&#xff08;下属 Noear 团队&#xff09;开发并开源。是新一代&#xff0c;面向全场景的 Java 企业级应用开发框架。从零开始构建&#xff08;非 java-ee 架构&#xff09;&#xff0c;有灵活的接口规范与开放生态。…...

常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)

1.FFmpeg FFmpeg是一个非常强大的开源多媒体处理框架&#xff0c;它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架&#xff01; 官方网址&#xff1a;https://ffmpeg.org/ FFmpeg 的主要特点和功能&#xff1a; 编解码器支持: FFmpe…...

本地部署Deepseek R1

最近Deepseek R1模型也是彻底火出圈了&#xff0c; 但是线上使用经常会受到各种限制&#xff0c;有时候还会连不上&#xff0c;这里我尝试本地部署了Deepseek 的开源R1模型&#xff0c;具体的操作如下&#xff1a; 首先登陆ollama平台&#xff0c;Ollama.ollama平台是一个开源…...

深入解析 .NET 命名管道技术, 通过 Sharp4Tokenvator 实现本地权限提升

01. 管道访问配置 在 .NET 中通常使用 PipeSecurity 类为管道设置访问控制规则&#xff0c;用于管理命名管道的访问控制列表&#xff08;ACL&#xff09;。通过这个类&#xff0c;可以为命名管道配置精细化的安全权限&#xff0c;从而控制哪些用户或用户组能够访问管道&#x…...

Cesium ArcGisMapServerImageryProvider API 介绍

作为一名GIS研究生&#xff0c;WebGIS 技术无疑是我们必学的核心之一。说到WebGIS&#xff0c;要提的就是 Cesium —— 这个让3D地球可视化变得简单又强大的工具。为了帮助大家更好地理解和使用 Cesium&#xff0c;我决定把我自己在学习 Cesium 文档过程中的一些心得和收获分享…...

登录授权流程

发起一个网络请求需要&#xff1a;1.请求地址 2.请求方式 3.请求参数 在检查中找到request method&#xff0c;在postman中设置同样的请求方式将登录的url接口复制到postman中&#xff08;json类型数据&#xff09;在payload中选择view parsed&#xff0c;将其填入Body-raw中 …...

Python设计模式 - 组合模式

定义 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象&#xff0c;从而简化了客户端代码。 组合模式有透明组合…...

【深度学习】图像分类数据集

图像分类数据集 MNIST数据集是图像分类中广泛使用的数据集之一&#xff0c;但作为基准数据集过于简单。 我们将使用类似但更复杂的Fashion-MNIST数据集。 %matplotlib inline import torch import torchvision from torch.utils import data from torchvision import transfo…...

【四川乡镇界面】图层shp格式arcgis数据乡镇名称和编码2020年wgs84无偏移内容测评

本文将详细解析标题和描述中提到的IT知识点&#xff0c;主要涉及GIS&#xff08;Geographic Information System&#xff0c;地理信息系统&#xff09;技术&#xff0c;以及与之相关的文件格式和坐标系统。 我们要了解的是"shp"格式&#xff0c;这是一种广泛用于存储…...

ubuntu解决普通用户无法进入root

项目场景&#xff1a; 在RK3566上移植Ubuntu20.04之后普通用户无法进入管理员模式 问题描述 在普通用户使用sudo su试图进入管理员模式的时候报错 解决方案&#xff1a; 1.使用 cat /etc/passwd 查看所有用户.最后一行是 若无用户&#xff0c;则使用 sudo useradd -r -m -s /…...

数据结构选讲 (更新中)

参考 smWCDay7 数据结构选讲2 by yyc 。 可能会补充的&#xff1a; AT_cf17_final_j TreeMST 的 F2 Boruvka算法 目录 AT_cf17_final_j Tree MST AT_cf17_final_j Tree MST link 题意 给定一棵 n n n 个点的树&#xff0c;点有点权 w i w_i wi​&#xff0c;边有边权。建立…...

freeswtch目录下modules.conf各个模块的介绍【freeswitch版本1.6.8】

应用模块&#xff08;applications&#xff09; mod_abstraction&#xff1a; 为其他模块提供抽象层&#xff0c;有助于简化模块开发&#xff0c;让开发者能在统一框架下开发新功能&#xff0c;减少与底层系统的直接交互&#xff0c;提高代码可移植性和可维护性。 mod_av&#…...

第3章 基于三电平空间矢量的中点电位平衡策略

0 前言 在NPC型三电平逆变器的直流侧串联有两组参数规格完全一致的电解电容,由于三电平特殊的中点钳位结构,在进行SVPWM控制时,在一个完整开关周期内,直流侧电容C1、C2充放电不均匀,各自存储的总电荷不同,电容电压便不均等,存在一定的偏差。在不进行控制的情况下,系统无…...

网络工程师 (8)存储管理

一、页式存储基本原理 &#xff08;一&#xff09;内存划分 页式存储首先将内存物理空间划分成大小相等的存储块&#xff0c;这些块通常被称为“页帧”或“物理页”。每个页帧的大小是固定的&#xff0c;例如常见的页帧大小有4KB、8KB等&#xff0c;这个大小由操作系统决定。同…...

Shell特殊位置变量以及常用内置变量总结

目录 1. 特殊的状态变量 1.1 $?&#xff08;上一个命令的退出状态&#xff09; 1.2 $$&#xff08;当前进程的 PID&#xff09; 1.3 $!&#xff08;后台进程的 PID&#xff09; 1.4 $_&#xff08;上一条命令的最后一个参数&#xff09; 2.常用shell内置变量 2.1 echo&…...

实验一---典型环节及其阶跃响应---自动控制原理实验课

一 实验目的 1.掌握典型环节阶跃响应分析的基本原理和一般方法。 2. 掌握MATLAB编程分析阶跃响应方法。 二 实验仪器 1. 计算机 2. MATLAB软件 三 实验内容及步骤 利用MATLAB中Simulink模块构建下述典型一阶系统的模拟电路并测量其在阶跃响应。 1.比例环节的模拟电路 提…...

基于 WEB 开发的在线考试系统设计与实现

标题:基于 WEB 开发的在线考试系统设计与实现 内容:1.摘要 基于 WEB 开发的在线考试系统旨在提供一个便捷、高效、公平的考试环境。本文详细介绍了该系统的设计与实现过程&#xff0c;包括系统架构、功能模块、数据库设计等方面。通过实际应用&#xff0c;证明了该系统具有良好…...

【linux】linux缺少tar命令/-bash: tar:未找到命令

问题&#xff1a; -bash: tar&#xff1a;未找到命令 原因 这错误信息"-bash: tar:未找到命令"表示系统无法找到tar命令。tar命令是一个Linux/Unix系统下的打包压缩工具&#xff0c;它用于将多个文件合并为一个文件。如果系统报错找不到tar命令&#xff0c;可能是…...