首页 > 其他分享 >Three.js 粒子系统教程构建炫酷的 3D 粒子效果

Three.js 粒子系统教程构建炫酷的 3D 粒子效果

时间:2024-10-30 14:16:20浏览次数:7  
标签:粒子系统 const scene THREE Three new 粒子 js

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

Three.js 是一个强大的 JavaScript 3D 库,广泛用于创建 Web 上的 3D 图形和动画。粒子系统是一种重要的特效工具,用于模拟自然现象,如烟雾、火焰、星星、爆炸等。在这篇教程中,我们将深入学习如何使用 Three.js 构建一个灵活的粒子系统。


1. Three.js 粒子系统简介

粒子系统由成千上万个微小的粒子组成,通过对这些粒子的属性(位置、大小、颜色等)进行实时更新,可以模拟出逼真的自然现象。Three.js 提供了 PointsBufferGeometryPointsMaterial 类来支持粒子系统的实现。通过灵活调整这些粒子的行为,可以实现丰富的动态视觉效果。

2. 初始化 Three.js 场景

在开始创建粒子系统之前,首先需要创建 Three.js 的场景、相机和渲染器。

import * as THREE from 'three';

// 创建场景
const scene = new THREE.Scene();

// 设置相机
const camera = new THREE.PerspectiveCamera(
  75,
  window.innerWidth / window.innerHeight,
  0.1,
  1000,
);
camera.position.z = 10;

// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 渲染循环
function animate() {
  requestAnimationFrame(animate);
  renderer.render(scene, camera);
}
animate();

3. 构建基础粒子系统

粒子系统的基本组成部分包括几何体、材质和粒子对象。我们可以通过 BufferGeometry 创建一个包含多个顶点的几何体,再用 PointsMaterial 设置材质,然后将几何体和材质组合到一个 Points 对象中,创建出粒子系统。

3.1 创建粒子几何体

首先定义粒子的数量和初始位置:

const particleCount = 5000;
const particlesGeometry = new THREE.BufferGeometry();
const positions = new Float32Array(particleCount * 3);

for (let i = 0; i < particleCount * 3; i++) {
  positions[i] = (Math.random() - 0.5) * 20; // 随机位置,构成 3D 空间中的一个粒子
}

particlesGeometry.setAttribute(
  'position',
  new THREE.BufferAttribute(positions, 3),
);

3.2 设置粒子材质

PointsMaterial 可用于设置粒子的外观属性,如颜色和大小:

const particleMaterial = new THREE.PointsMaterial({
  color: 0xffffff,
  size: 0.05,
  transparent: true,
  opacity: 0.8,
});

// 创建粒子系统并添加到场景
const particleSystem = new THREE.Points(particlesGeometry, particleMaterial);
scene.add(particleSystem);

4. 实现粒子动画

为了让粒子运动起来,我们可以在渲染循环中不断更新粒子的属性,比如位置或旋转。下面是一个简单的旋转效果:


function animateParticles() {
  particleSystem.rotation.y += 0.002;
  renderer.render(scene, camera);
  requestAnimationFrame(animateParticles);
}
animateParticles();

漂浮效果
让粒子缓慢漂浮,模拟出飘动的烟雾效果:

function animateParticles() {
  const positions = particlesGeometry.attributes.position.array;
  for (let i = 0; i < positions.length; i += 3) {
    positions[i + 1] -= 0.02; // 逐渐下降
    if (positions[i + 1] < -10) positions[i + 1] = 10; // 重置位置
  }
  particlesGeometry.attributes.position.needsUpdate = true;

  renderer.render(scene, camera);
  requestAnimationFrame(animateParticles);
}

5. 创建不同的粒子效果

5.1 烟雾效果

使用一张半透明的烟雾纹理,并在 PointsMaterial 中启用透明度以模拟烟雾效果:

const smokeTexture = new THREE.TextureLoader().load(
  'path_to_smoke_texture.png',
);
const smokeMaterial = new THREE.PointsMaterial({
  size: 2,
  map: smokeTexture,
  transparent: true,
  opacity: 0.3,
});

const smokeParticles = new THREE.Points(particlesGeometry, smokeMaterial);
scene.add(smokeParticles);

5.2 火焰效果

火焰效果可以通过高亮的橙色和快速的运动来实现:

const flameMaterial = new THREE.PointsMaterial({
  color: 0xff4500,
  size: 0.15,
  transparent: true,
  opacity: 0.9,
});

const flameParticles = new THREE.Points(particlesGeometry, flameMaterial);
scene.add(flameParticles);

5.3 星空效果

星空效果只需设置粒子为较小且分散的白色亮点,并让粒子缓慢旋转即可:

const starsMaterial = new THREE.PointsMaterial({
  color: 0xffffff,
  size: 0.1,
});

const starsParticles = new THREE.Points(particlesGeometry, starsMaterial);
scene.add(starsParticles);

function animateStars() {
  starsParticles.rotation.y += 0.001;
  renderer.render(scene, camera);
  requestAnimationFrame(animateStars);
}
animateStars();

6. 性能优化技巧

在创建粒子系统时,性能是一个重要考量。以下是一些优化建议:

  • 减少粒子数量:确保粒子的数量在合理范围内。
  • 减少材质计算:在场景中尽量减少高分辨率的材质贴图。
  • 使用低分辨率粒子贴图:如果使用纹理,优先选择低分辨率贴图。
  • 批处理粒子:将多个粒子对象合并为一个,减少绘制调用。
  • 动态调节粒子数量
  • 对于互动性较强的粒子系统,可以动态调节粒子数量,以便在需要时降低渲染压力。

7. 总结

Three.js 提供了丰富的工具来帮助我们构建粒子系统,通过本文的介绍,我们学习了从基础粒子系统构建到实现不同效果,以及如何优化粒子系统的性能。粒子系统是一种强大的视觉呈现方式,可以广泛应用于交互式网站、游戏和动画项目中。

在实际开发中,你可以根据项目需求自由调整粒子属性和动画效果,探索更多可能性,打造出炫酷的粒子效果。

标签:粒子系统,const,scene,THREE,Three,new,粒子,js
From: https://blog.csdn.net/qq_34820371/article/details/143359746

相关文章

  • threejs 实现灯光照射模型有阴影
    “three”:“^0.169.0”estudi_taller_carles_fontsere.glb:替换你的模型路径<template><divclass="threejs"></div></template><scriptsetup>import{onMounted}from"vue";import*asTHREEfrom"three"......
  • 基于node.js+vue基于android的医院导航系统后(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景在现代医疗体系中,医院的规模不断扩大,科室分布日益复杂,患者在就医过程中寻找科室、医生等目标往往面临诸多困难。关于医院导航问题的研究,现有研究主要以......
  • 基于node.js+vue基于Android的智慧社区物业服务系统后(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景随着城市化进程的加快,社区物业管理面临着越来越大的挑战。关于智慧社区物业服务系统的研究,现有研究主要集中在传统物业管理模式的改进上,专门针对基于And......
  • 基于node.js+vue基于B_S的停车管理系统的设计与实现(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景随着城市交通压力的增大,停车难问题日益凸显。关于停车管理系统的研究,现有研究主要集中在传统的停车场管理方式上,专门针对基于B/S架构的停车管理系统的研......
  • 基于node.js+vue基于Android的“养身坊”APP的设计后(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容选题背景随着人们生活水平的提高和健康意识的增强,养生保健逐渐成为大众关注的热点。然而,市面上的养生信息繁杂,质量参差不齐,缺乏一个系统化、专业化的平台来提供科学......
  • react.js中何时使用useCallback
    useMemo用于记住值,减少重新渲染组件所需的时间。useCallback用于记住函数,通常是为了防止组件的重新渲染举例子组件接收回调函数作为 props父组件引入子组件:constgetList=useCallback(()=>fetch(`http://example.com/api/${userId}`),[userId],);return(<buttonon......
  • How to use js to parse a url string to a url object All In One
    HowtousejstoparseaurlstringtoaurlobjectAllInOne如何利用js将url字符串解析为url对象demos//consturl=globalThis.window.location.href;//consturl=window.location.href;constautoConvertPageToRepo=(page=``)=>{if(!globalThis.wi......
  • latex workshop在vscode中的settings.json设置
    //latex"latex-workshop.latex.autoBuild.run":"never","latex-workshop.showContextMenu":true,"latex-workshop.intellisense.package.enabled":true,"latex-workshop.message.error.show":fals......
  • 前端开发者必学:mo.js动画库
    前端开发者必学:mo.js动画库前言在当今的网页设计中,动态效果和交互性是提升用户体验的关键因素。mo.js,一个轻量级的JavaScript动画库,为前端开发者提供了一种简单而强大的方法来创建引人注目的动画效果。本文将向您介绍mo.js的基本概念、特点、使用场景以及如何在Vue环境......
  • nw.js的nw.Menu()自定义菜单
    nw.js是一个基于Chromium和Node.js的开源框架,它允许开发者使用HTML5、CSS3和JavaScript来创建桌面应用程序。在nw.js中,nw.Menu是一个用于创建自定义菜单栏的类,它允许开发者将自定义菜单项添加到应用程序的菜单栏中。以下是nw.Menu的主要特性和用法:特性自......