使用 Three.js 创建几何体粒子效果

今天,带大家一起看下如何将几何体由粒子组成的效果。
在这里插入图片描述

通常情况下,Three.js 中的几何体材质会为每个面赋予一种颜色,这样的结果比较常见,如下图所示:

在这里插入图片描述

然而,通过将几何体由粒子组成,我们可以实现更加酷炫和独特的视觉效果,让几何体看起来更具科技感和未来感。

环境准备

  1. 通过 vite 搭建项目
  2. 安装 three.js
  3. 创建一个基础的 three.js 场景
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";

const canvas = document.querySelector("canvas");

const scene = new THREE.Scene();

const particlesMaterial = new THREE.PointsMaterial({
  size: 0.02, // 粒子大小
  sizeAttenuation: true, // 大小是否随着距离变化
});

const sizes = {
  width: window.innerWidth,
  height: window.innerHeight,
};

const camera = new THREE.PerspectiveCamera(
  75,
  sizes.width / sizes.height,
  0.1,
  100
);
camera.position.z = 5;
scene.add(camera);

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

const renderer = new THREE.WebGLRenderer({
  canvas: canvas,
});
renderer.setSize(sizes.width, sizes.height);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));

window.addEventListener("resize", () => {
  sizes.width = window.innerWidth;
  sizes.height = window.innerHeight;

  camera.aspect = sizes.width / sizes.height;
  camera.updateProjectionMatrix();

  renderer.setSize(sizes.width, sizes.height);
  renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
});

const clock = new THREE.Clock();

const animate = () => {
  const elapsedTime = clock.getElapsedTime(); // 获取时间, 用于动画

  controls.update();

  renderer.render(scene, camera);

  window.requestAnimationFrame(animate);
};

animate();

粒子效果

粒子效果的关键在于使用 THREE.PointsMaterial 来为几何体赋予粒子材质。PointsMaterial 可以让几何体的每个顶点显示为一个粒子,从而实现炫酷的视觉效果。

1. 球体粒子

球体粒子是最基础的几何体粒子效果之一。以下是创建球体粒子的代码:

const particlesGeometry = new THREE.SphereGeometry(1, 32, 32);
const particlesMaterial = new THREE.PointsMaterial({
  size: 0.02,
  sizeAttenuation: true,
});
const particles = new THREE.Points(particlesGeometry, particlesMaterial);
scene.add(particles);

上述代码使用了 SphereGeometry 创建一个标准球体,并通过 PointsMaterial 将其转化为粒子。

2. 立方体粒子

通过 BoxGeometry,我们可以轻松创建一个立方体粒子效果:

const cubeGeometry = new THREE.BoxGeometry(1, 1, 1, 10, 10, 10);
const cubeParticles = new THREE.Points(cubeGeometry, particlesMaterial);
scene.add(cubeParticles);

这里的 BoxGeometry 被分割为多个网格,以确保每个顶点都能够显示为一个粒子。

3. 圆环粒子

利用 TorusGeometry 生成一个带孔的圆环粒子:

const torusGeometry = new THREE.TorusGeometry(1, 0.2, 16, 100);
const torusParticles = new THREE.Points(torusGeometry, particlesMaterial);
scene.add(torusParticles);

4. 圆环结粒子

创建一个复杂的圆环结粒子,可以增加几何体的复杂性:

const knotGeometry = new THREE.TorusKnotGeometry(1, 0.2, 100, 16);
const knotParticles = new THREE.Points(knotGeometry, particlesMaterial);
scene.add(knotParticles);

5. 圆锥体粒子

最后一个案例是使用 ConeGeometry 创建的圆锥体粒子:

const coneGeometry = new THREE.ConeGeometry(1, 1, 18, 6, 1);
const coneParticles = new THREE.Points(coneGeometry, particlesMaterial);
scene.add(coneParticles);

代码

github

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

gitee

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

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

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

相关文章

shell指令

终端输入一个C源文件名(.c结尾)判断文件是否有内容,如果没有内容删除文件,如果有内容编译并执行改文件。 终端输入两个文件名,判断那个时间戳更新

使用ONVIF操纵大华摄像头

使用1台大华网络相机,DH-IPC-HFW3237M-I2,6毫米镜头,2百万像素,但是网口是百兆的。 大华的SDK感觉好难用。 写完了data matrix识别的0.1版本后,进行相机部分改进。 老规矩,先用python快速原型。 会出现一个…

Pandas-数据分组

文章目录 一. 分组聚合1. 分组聚合过程2. Pandas,Numpy内置的聚合方法3. 聚合函数① 使用Numpy库的mean函数② 自定义函数Ⅰ. 一个参数Ⅱ. 多个参数 ③ agg和 aggregateⅠ. 传入一个函数Ⅱ. 同时传入多个函数Ⅲ. 向agg/aggregate中传入字典 二. 分组转换1. 使用transform分组计…

云计算课程报告实验-WordCount算法实验 过程记录

内容描述 本实验指导书通过在华为鲲鹏上,编译运行WordCount程序。完成实验操作后,读者会掌握简单的程序编写,如WordCount中的getWords、countWords、treeMerge。 实验环境 华为鲲鹏云主机、openEuler 20.03操作系统;安装mpich-3…

【paddle】初次尝试

张量 张量是 paddlepaddle, torch, tensorflow 等 python 主流机器学习包中唯一通货变量,因此应当了解其基本的功能。 张量 paddle.Tensor 与 numpy.array 的转化 import paddle as paddle import matplotlib.pyplot as plt apaddle.to_t…

Frontend - 分页(针对 python / Django )

目录 一、同个文件内(方式一) 1. 前端 html 2. 定义分页界面 3. 获取分页数据 4.后端根据前端分页需求,整理分页数据 5.显示情况 6. JsonResponse 相关知识 二、不同文件内依旧有效(方式二,更优化)…

骑行解压:身心的奇妙之旅,VELO Angel Revo坐垫

在快节奏的都市生活中,骑行不仅是一种健康的生活方式,更是一种心灵的释放。从心理生理学的角度来看,骑行能够促使身体分泌内啡肽,带来愉悦感,同时,它还能转移注意力,缓解焦虑。在这场身心的奇妙…

HarmonyOS NEXT 实战之元服务:静态案例效果---教育培训服务

背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: import { authentication } …

使用JMeter对Linux生产服务器进行压力测试

安装 JMeter wget https://downloads.apache.org/jmeter/binaries/apache-jmeter-5.4.1.tgz tar -xzf apache-jmeter-5.4.1.tgz cd apache-jmeter-5.4.1创建 JMeter 脚本 设置中文 选择Options—>Choose Language—>选择其他语言(例如:Chinese&am…

【Web安全】文件写入漏洞 ASP 网页病毒模拟(文件写入漏洞+FilesystemObject)

【Web安全】文件写入漏洞 ASP 网页病毒模拟(文件写入漏洞FilesystemObject) 原理 文件写入漏洞 文件写入漏洞是指攻击者通过某种方式在服务器上创建或修改文件的漏洞。攻击者可以利用此漏洞在服务器上写入恶意代码或文件,从而实现进一步的…

微信小程序调用 WebAssembly 烹饪指南

我们都是在夜里崩溃过的俗人,所幸终会天亮。明天就是新的开始,我们会变得与昨天不同。 一、Rust 导出 wasm 参考 wasm-bindgen 官方指南 https://wasm.rust-lang.net.cn/wasm-bindgen/introduction.html wasm-bindgen,这是一个 Rust 库和 CLI…

整合版canal ha搭建--基于1.1.4版本

开启MySql Binlog(1)修改MySql配置文件(2)重启MySql服务,查看配置是否生效(3)配置起效果后,创建canal用户,并赋予权限安装canal-admin(1)解压 canal.admin-1…

药片(药丸)和胶囊识别数据集,使用yolo,pasical voc xml, coco json格式标注,可识别药片和胶囊两种标签,2445张原始图片

药片(药丸)和胶囊识别数据集,使用yolo,pasical voc xml, coco json格式标注,可识别药片和胶囊两种标签,2445张原始图片 数据集分割 训练组80% 1967图片 有效集13% 317图片 测试集7% 161图片 预处…

C 语言:注释的重要性及用法详解

目录 一、注释的作用 二、C 语言中的注释类型 三、注释的实践 四、注释的注意事项 五、总结 在 C 语言编程中,注释是一种非常重要的工具,它可以帮助程序员更好地理解代码、提高代码的可读性和可维护性。本文将详细介绍 C 语言中注释的用法和重要性。…

麒麟信安云在长沙某银行的应用入选“云建设与应用领航计划(2024)”,打造湖湘金融云化升级优质范本

12月26日,2024云计算产业和标准应用大会在北京成功召开。大会汇集政产学研用各方专家学者,共同探讨云计算产业发展方向和未来机遇,展示云计算标准化工作重要成果。 会上,云建设与应用领航计划(2024)建云用…

LeetCode - 初级算法 数组(存在重复元素)

存在重复元素 这篇文章讨论如何判断一个数组中是否存在重复元素。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定一个整数数组 nums,如果任一值在数组中出现至少两次,返回 true;如果数组中每个元素互不相同,返回 false。 示例: 输入: nums =…

C++笔记之尾后迭代器

C笔记之尾后迭代器 code review! 参考笔记 1.C笔记之尾后迭代器 2.C笔记之迭代器失效问题处理 在C中,尾后迭代器(通常称为 past-the-end iterator)是指指向容器中最后一个元素之后的位置的迭代器。它并不指向任何有效的元素,而是…

Gibbs现象(Gibbs Phenomenon)最初数学上的定义

Gibbs现象(Gibbs Phenomenon)是在处理周期性信号的傅里叶级数展开时出现的一种现象。当一个周期函数在不连续点附近被其傅里叶级数的部分和近似时,近似值会在不连续点处产生过冲(overshoot)和欠冲(undersho…

【时时三省】(C语言基础)动态内存函数realloc

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 realloc realloc函数的出现让动态内存管理更加灵活。 有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,…