使用 Three.js 创建动态粒子效果

今天,带大家使用粒子实现一个粒子飞毯的效果,我们先来看一下效果。
请添加图片描述

实现

初始化场景

首先创建一个场景,所有 3D 对象都会被添加到这个场景中。

const scene = new THREE.Scene();

相机和渲染器

配置相机和渲染器来捕捉和显示场景。

相机
  • 使用 PerspectiveCamera 提供广角视图。
渲染器
  • 创建 WebGLRenderer 渲染器,将画布设置为全屏。
const camera = new THREE.PerspectiveCamera(
  75,
  window.innerWidth / window.innerHeight,
  0.1,
  100
);
camera.position.z = 13;

const renderer = new THREE.WebGLRenderer({
  canvas: document.querySelector("canvas"),
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));

添加粒子

我们将创建一个由数十万个小粒子组成的云,这些粒子可以模拟星空或任何动态环境效果。粒子的创建涉及两个主要组成部分:几何体和材质。

我们使用 BufferGeometry 来存储粒子的位置信息。每个粒子是通过三个坐标(x, y, z)定义的,所以对于 count 个粒子,我们需要一个长度为 count * 3 的数组来存储它们的位置。

const particlesGeometry = new THREE.BufferGeometry();
const count = 500000; // 粒子数量
const positions = new Float32Array(count * 3); // 存储位置的数组
const colors = new Float32Array(count * 3); // 存储颜色的数组

for (let i = 0; i < count * 3; i += 3) {
  positions[i] = (Math.random() - 0.5) * 10; // x位置
  positions[i + 1] = (Math.random() - 0.5) * 10; // y位置
  positions[i + 2] = (Math.random() - 0.5) * 10; // z位置

  colors[i] = Math.random(); // r颜色
  colors[i + 1] = Math.random(); // g颜色
  colors[i + 2] = Math.random(); // b颜色
}

这里的随机数 Math.random() - 0.5 范围为 -0.50.5,乘以 10 来扩展粒子云的空间分布。

粒子材质

粒子材质决定了粒子的视觉效果,如大小、颜色和透明度。我们使用 PointsMaterial 并启用 vertexColors 使每个粒子可以有独立的颜色。

vertexColors: 允许每个粒子使用与其关联的顶点颜色,从而实现每个粒子拥有不同颜色的效果。

注意这里,我们使用了 load 一个透明贴图,这样可以让粒子看起来更加自然。
在这里插入图片描述

const particlesMaterial = new THREE.PointsMaterial({
  size: 0.02, // 粒子大小
  alphaMap: textureLoader.load("/point.png"), // 粒子透明贴图
  transparent: true, // 开启透明度
  vertexColors: true, // 使用顶点颜色
});

上面的几个属性,我们在更加详细的介绍一下

  • size:定义了每个粒子点的屏幕上渲染的大小,单位为像素。它控制了粒子的基本尺寸,但实际视觉大小还会受到 sizeAttenuation 属性的影响,后者决定了粒子大小是否随着与摄像机的距离而变化。如果 sizeAttenuation 设置为 true(默认值),粒子大小将随距离变小,模拟现实世界中远处对象看起来更小的透视效果。
  • alphaMap:为每个粒子指定一个纹理贴图,该贴图的透明度(alpha 通道)将被用来影响粒子的透明度。这个功能使得粒子可以具有不均匀的透明度,从而创造更加自然或复杂的视觉效果,如模拟星星或发光粒子等。使用纹理的灰度值来决定相应区域的透明度。
  • 用于开启材质的透明处理。在使用 alphaMap 或者在材质颜色中指定 alpha 值小于 1 的情况下,需要将此属性设置为 true 以确保 Three.js 正确处理透明度。没有启用 transparent 时,即使材质具有透明纹理或颜色值,也会被渲染为完全不透明。
  • vertexColors:用于开启顶点颜色处理。当设置为 true 时,粒子的颜色将由顶点颜色决定,而不是整个粒子使用单一颜色。这使得每个粒子可以具有不同的颜色,从而实现更加丰富多彩的效果。

控制器

使用 OrbitControls 允许用户通过鼠标来旋转和缩放视图。

const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;

动画循环

创建动画循环来实时更新粒子位置和渲染场景。

更新粒子位置

我们在这里使用简单的三角函数来模拟粒子的垂直移动,创建类似波浪的效果。通过三角函数 Math.sin,我们可以为每个粒子创建一个周期性变化的动画效果,使其在 y 轴方向上波动。

const tick = () => {
  const elapsedTime = clock.getElapsedTime(); // 获取从开始到现在的时间

  // 使粒子在y轴方向上根据时间变化
  for (let i = 0; i < count; i++) {
    const i3 = i * 3;
    const x = positions[i3]; // 获取粒子当前x位置
    positions[i3 + 1] = Math.sin(elapsedTime + x) * 0.3; // 根据时间和x位置计算新的y位置
  }

  particlesGeometry.attributes.position.needsUpdate = true; // 通知Three.js位置数据已更新
};

这里,Math.sin(elapsedTime + x) 的使用将每个粒子的动画周期与其 x 位置关联起来,创建更自然的波动效果。乘以 0.3 是为了控制波动的幅度,不让粒子移动得太极端。

渲染场景

在每次动画循环的最后,我们调用 renderer.render 方法来绘制更新后的场景:

renderer.render(scene, camera);
window.requestAnimationFrame(tick); // 请求下一帧继续动画

代码

github

https://github.com/calmound/threejs-demo/tree/main/feitan

gitee

https://gitee.com/calmound/threejs-demo/tree/main/feitan

学习threejs:www.threejs3d.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World 2025/1/3 14:06 百度&#xff1a;android studio helloworld android studio hello world kotlin helloword kotlin 串口 no run configurations added android studio no run configurations added 1、…

c#使用SevenZipSharp实现压缩文件和目录

封装了一个类&#xff0c;方便使用SevenZipSharp&#xff0c;支持加入进度显示事件。 双重加密压缩工具范例&#xff1a; using SevenZip; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.…

Ubuntu 20.04安装gcc

一、安装GCC 1.更新包列表 user596785154:~$ sudo apt update2.安装gcc user596785154:~$ sudo apt install gcc3.验证安装 user596785154:~$ gcc --version二 编译C文件 1.新建workspace文件夹 user596785154:~$ mkdir workspace2.进入workspace文件夹 user596785154:~…

网络协议安全的攻击手法

1.使用SYN Flood泛洪攻击&#xff1a; SYN Flood(半开放攻击)是最经典的ddos攻击之一&#xff0c;他利用了TCP协议的三次握手机制&#xff0c;攻击者通常利用工具或控制僵尸主机向服务器发送海量的变源端口的TCP SYN报文&#xff0c;服务器响应了这些报文后就会生成大量的半连…

晨辉面试抽签和评分管理系统之一:考生信息管理和编排

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

鸿蒙的APP真机调试以及发布

目录&#xff1a; 1、创建好鸿蒙项目2、创建AGC项目3、实现自动签名3.1、手动方式创建签名文件和密码 4、运行项目5、无线真机调试 1、创建好鸿蒙项目 2、创建AGC项目 &#xff08;1&#xff09;在File->Project Structure->Project->Signing Configs中进行登录。(未…

H7-TOOL固件2.27发布,新增加40多款芯片脱机烧录,含多款车轨芯片,发布LUA API手册,CAN助手增加负载率,错误状态信息检测

H7-TOOL详细介绍&#xff08;含操作手册&#xff09;&#xff1a;H7-TOOL开发工具&#xff0c;1拖4/16脱机烧录&#xff0c;高速DAPLINK&#xff0c;RTOS Trace&#xff0c;CAN/串口助手, 示波器, RTT等&#xff0c;支持WiFi&#xff0c;以太网&#xff0c;高速USB和手持 - H7-…

SpringMVC(一)配置

目录 引入 第一章&#xff1a;Java web的发展历史 一、Model I和Model II 1.Model I开发模式 2.Model II开发模式 二. MVC模式 第二章&#xff1a;SpringMVC的入门案例 搭建SpringMVC的入门程序 1.创建新项目 2.等待加载导入坐标 3.处理xml文件和其他 导入tomcat 运…

Linux驱动开发 gpio_get_value读取输出io的电平返回值一直为0的问题

当时gpio子系统进行读取时返回必定是0 因此&#xff0c;首先必须使用platform驱动来管理gpio和pinctrl子系统&#xff0c;然后如果按照正点原子所教的设备树引脚设置为0x10B0则会导致读取到的电平值为0。 解决方法&#xff1a; 将设备树中的引脚设置为 pinctrl_gpioled: gpio…

uniapp-vue3 实现, 一款带有丝滑动画效果的单选框组件,支持微信小程序、H5等多端

采用 uniapp-vue3 实现, 是一款带有丝滑动画效果的单选框组件&#xff0c;提供点状、条状的动画过渡效果&#xff0c;支持多项自定义配置&#xff0c;适配 web、H5、微信小程序&#xff08;其他平台小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&…

Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s

前言&#xff1a;纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 官方文档…

倾斜摄影相机在不动产确权登记和权籍调查中的应用

一、项目背景 1.1 项目背景 为贯彻落实中央、国务院关于实施乡村振兴战略、关于“扎实推进房地一体的农村集体建设用地和宅基地使用权确权登记颁证&#xff0c;完善农民闲置宅基地和闲置农房政策&#xff0c;探索宅基地所有权、资格权、使用权‘三权分置’”的要求&#xff0…

计算机网络 (22)网际协议IP

一、IP协议的基本定义 IP协议是Internet Protocol的缩写&#xff0c;即因特网协议。它是TCP/IP协议簇中最核心的协议&#xff0c;负责在网络中传送数据包&#xff0c;并提供寻址和路由功能。IP协议为每个连接在因特网上的主机&#xff08;或路由器&#xff09;分配一个唯一的IP…

网络安全测评技术与标准

18.1 概况 1&#xff09;概念 &#xff1a;指参照一定的标准规范要求&#xff0c;通过一系列的技术和管理方法&#xff0c;获取评估对象的网络安全状况信息&#xff0c;对其给出相应的网络安全情况综合判定。 网络安全测评对象通常包括信息系统的组成要素或信息系统自身。 2…

5个不同类型的mysql数据库安装

各种社区版本下载官方地址&#xff1a;MySQL :: MySQL Community Downloads 一、在线YUM仓库&#xff08;Linux&#xff09; 选择 MySQL Yum Repository 选择对应版本下载仓库安装包&#xff08;No thanks, just start my download.&#xff09; 下载方法1&#xff1a;下载到本…

Lua开发环境如何安装?保姆级教程

大家好&#xff0c;我是袁庭新。Lua开发环境如何安装搭建&#xff1f;这套篇文章帮你搞定&#xff5e; CentOS 7系统默认已经安装了Lua语言环境&#xff0c;因此可直接运行Lua代码。可以使用以下命令查看当前系统中默认自带的Lua版本。 # 查看系统默认自带的Lua版本 [rootloc…

Linux 系统搭建网络传输环境汇总

Ubuntu 系统搭建 TFTP 服务器 1. 创建 /home/username/workspace/tftp 目录并赋予最大权限&#xff0c;username 是自己用户名 sudo mkdir -p /home/username/workspace/tftp sudo chmod 777 /home/username/workspace/tftp 2. 安装 tftp-hpa&#xff08; 客户端软件包&#x…

深度学习中CUDA环境安装教程

首先说明&#xff0c;本人是小白&#xff0c;一次安装&#xff0c;可能有不对的地方&#xff0c;望包含。 安装CUDA 因为我们是深度学习&#xff0c;很多时候要用到gpu进行训练&#xff0c;所以我们需要一种方式加快训练速度。 通俗地说&#xff0c;CUDA是一种协助“CPU任务分…

基于word2vec的推荐系统

基于word2vec的推荐系统 可用于推荐商品&#xff0c;图书&#xff0c;电影&#xff0c;课程&#xff0c;旅游景点&#xff0c;音乐… 效果 网址点我跳转 一、word2vec简介 Word2Vec是一种词向量表示方法&#xff0c;是在自然语言处理领域&#xff08;NLP&#xff09;的神经…

多目标优化算法——基于聚类的不规则Pareto前沿多目标优化自适应进化算法(CA-MOEA)

基于聚类的不规则Pareto前沿多目标优化自适应进化算法&#xff08;CA-MOEA&#xff09; 一、算法简介 简介&#xff1a; 现有的多目标进化算法&#xff08;moea&#xff09;在具有规则Pareto前沿且Pareto最优解在目标空间上连续分布的多目标优化问题&#xff08;MOPs&#xff…