利用 Three.js 实现 3D 粒子正方体效果

在这篇文章中,我将向大家展示如何使用 Three.js 创建一个带有粒子的 3D 正方体效果。通过这段代码,我们将能够在浏览器中渲染一个 3D 正方体形状,并且该正方体内部填充了大量粒子(可视化效果)。你可以通过鼠标控制视角,查看旋转的正方体。
实现效果视频如下:

这不是特效,代码实现的宇宙魔方的粒子世界

一、项目概述

我们使用了 Three.js,一个强大的 JavaScript 3D 图形库,来创建和渲染这个 3D 场景。这个项目展示了如何在 3D 空间中放置大量粒子,并且通过 OrbitControls 让用户可以旋转场景,查看 3D 物体的各个面。

二、主要功能

  1. 粒子系统:在正方体的每个位置放置一个粒子,模拟一个由数千个粒子构成的 3D 正方体。
  2. 自旋效果:粒子系统在场景中不断旋转,形成动态的视觉效果。
  3. 视角控制:使用 OrbitControls 实现鼠标控制的自由视角,用户可以查看粒子系统的不同角度。
  4. 响应式设计:支持浏览器窗口的大小调整,保证粒子系统和相机的比例始终正确。

三、实现步骤

3.1. 引入必要的库

首先,我们需要引入 Three.js 和 OrbitControls.js。Three.js 用于渲染 3D 场景,OrbitControls.js 用于实现鼠标控制的视角。

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/controls/OrbitControls.js"></script>

3.2. 设置场景、相机和渲染器

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);

这里我们创建了一个场景、一个透视相机和一个 WebGL 渲染器。相机的视场角为 75 度,渲染器会填充整个浏览器窗口。

3.3. 创建粒子系统

粒子系统由大量的点(粒子)构成。我们通过 BufferGeometry 来设置粒子的位置,并将其存储在 Float32Array 中。

const particleCount = 50000;
const particles = new THREE.BufferGeometry();
const particlePositions = new Float32Array(particleCount * 3);const size = 20;
const spacing = 1;
let index = 0;for (let x = -size / 2; x <= size / 2; x += spacing) {for (let y = -size / 2; y <= size / 2; y += spacing) {for (let z = -size / 2; z <= size / 2; z += spacing) {if (index < particleCount) {particlePositions[index * 3] = x;particlePositions[index * 3 + 1] = y;particlePositions[index * 3 + 2] = z;index++;}}}
}particles.setAttribute('position', new THREE.BufferAttribute(particlePositions, 3));

在上述代码中,我们使用三个嵌套的循环来生成正方体内部的每个粒子的坐标,并存入 particlePositions 数组。

3.4. 粒子材质

我们为粒子选择了一个简单的点材质(PointsMaterial),设置其颜色为白色,大小为 0.05,并启用了大小衰减效果。

const particleMaterial = new THREE.PointsMaterial({color: 0xffffff,size: 0.05,sizeAttenuation: true
});const particleSystem = new THREE.Points(particles, particleMaterial);
scene.add(particleSystem);

3.5. 相机位置与视角控制

为了让场景呈现出一个合适的视角,我们将相机的位置设置为 (x: -30, y: 20, z: 50)。通过 OrbitControls,我们能够实现鼠标控制视角的功能。

const controls = new THREE.OrbitControls(camera, renderer.domElement);
camera.position.z = 50;
camera.position.y = 20;
camera.position.x = -30;
camera.lookAt(0, 0, 0);

3.6. 动画与渲染

为了让粒子系统旋转并持续渲染,我们需要一个动画循环。每一帧中,我们会对粒子系统进行旋转,并更新相机的视角。

function animate() {requestAnimationFrame(animate);particleSystem.rotation.y += 0.003;controls.update();renderer.render(scene, camera);
}animate();

3.7. 处理窗口大小调整

为了让视图在窗口大小调整时仍然保持合适的比例,我们添加了 resize 事件监听器。

window.addEventListener('resize', () => {renderer.setSize(window.innerWidth, window.innerHeight);camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();
});

四、效果展示

当你运行这段代码时,浏览器会显示一个旋转的 3D 粒子正方体。通过鼠标,你可以自由旋转视角,观察不同角度下的粒子分布和正方体的形状。这个效果非常适合用于展示粒子系统或者创建动态的 3D 艺术效果。

五、总结

这篇教程展示了如何使用 Three.js 实现一个简单的粒子正方体效果。通过对粒子的控制、视角控制和窗口自适应等特性的结合,能够为用户提供一个生动且互动的 3D 体验。对于有兴趣深入学习 Three.js 的开发者,这个项目是一个很好的起点。

如果大家有任何问题或想法,欢迎在评论区留言讨论!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战

生成式人工智能的发展既带来了有益的生产力转型机会&#xff0c;也提供了被恶意利用的机会。 最近&#xff0c;Abnormal Security的研究人员发现了一个专门为网络犯罪创建的无审查AI聊天机器人——GhostGPT&#xff0c;是人工智能用于非法活动的新前沿&#xff0c;可以被用于网…

智能体0门槛开发

分享一个智能体开发流程。 2025 年啊&#xff0c;好多专家还有行业报告都觉得这是智能体&#xff08;AI Agent&#xff09;应用的头一年。相关的应用在商业、工业、消费等好些领域都到了关键的时候&#xff0c;这意味着从实验室走向大规模实际应用的重要转变。而且呢&#xff0…

计算机网络 (53)互联网使用的安全协议

一、SSL/TLS协议 概述&#xff1a; SSL&#xff08;Secure Sockets Layer&#xff09;安全套接层和TLS&#xff08;Transport Layer Security&#xff09;传输层安全协议是工作在OSI模型应用层的安全协议。SSL由Netscape于1994年开发&#xff0c;广泛应用于基于万维网的各种网络…

grafana新增email告警

选择一个面板 比如cpu 新增一个临界点表达式 input选A 就是A的值达到某个临界点 触发告警 我这边IS ABOVE0.15就是cpu大于0.15%就触发报警&#xff0c;这个值怎么填看指标的值显示 这里要设置一下报警条件 这边随便配置下 配置标签和通知&#xff0c;选择你的邮件 看下告警…

npm常见报错整理

npm install时报UNMET PEER DEPENDENCY 现象 npm install时报UNMET PEER DEPENDENCY,且执行npm install好几遍仍报这个。 原因 不是真的缺少某个包,而是安装的依赖版本不对,警告你应该安装某一个版本。 真的缺少某个包。 解决 看了下package.json文件,我的react是有的…

24_游戏启动逻辑梳理总结

首先这个项目从游戏根入口GameRoot.cs的初始化开始 分为 服务层初始化Svc.cs 与 业务系统层初始化Sys.cs 而服务层 分为 资源加载服务层ResSvc.cs 与 音乐播放服务层AudioSvc.cs 而在 资源加载服务层ResSvc.cs中 初始化了 名字的 配置文件 而音乐播放服务层AudioSvc.cs 暂时没…

UE求职Demo开发日志#8 强化前置条件完善,给物品加图标

1 强化前置条件完善 StrengthManager里实现一个Check前置的函数 bool CheckPreAllIsActive(int index)&#xff0c;所有的前置都已经激活就返回true&#xff0c;否则返回false 之后在强化的时候加入条件检查&#xff1a; 1.所有前置技能全部激活 2.本身没有强化过 最后测…

QT:tftp client 和 Server

1.TFTP简介 TFTP&#xff08;Trivial File Transfer Protocol,简单文件传输协议&#xff09;是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为69。 FTP是一个传输文件的简单协议&#xff0c;…

dm8在Linux环境安装精简步骤说明(2024年12月更新版dm8)

dm8在Linux环境安装详细步骤 - - 2025年1月之后dm8 环境介绍1 修改操作系统资源限制2 操作系统创建用户3 操作系统配置4 数据库安装5 初始化数据库6 实例参数优化7 登录数据库配置归档与备份8 配置审计9 创建用户10 屏蔽关键字与数据库兼容模式11 jdbc连接串配置12 更多达梦数据…

24年总结 -- 共赴心中所向往的未来

一、前言 我又回来了&#xff0c;前阵子忙着期末考试的东西&#xff0c;也是快半个月没更新了&#xff0c;刚好前几天报名了博客之星的评选&#xff0c;也很幸运的入围了&#xff0c;也借此机会来回顾一下关于2024年的个人成长、创作经历等。 二、个人 本人是一个双非学校的软…

动态规划一> 让字符串成为回文串的最少插入次数

题目&#xff1a; 解析&#xff1a; 状态表示状态转移方程&#xff1a; 初始化填表顺序返回值&#xff1a; 代码&#xff1a; public int minInsertions(String ss) {char[] s ss.toCharArray();int n s.length; int[][] dp new int[n][n]; for(int i n-1; i > 0;…

2025.1.21——八、[HarekazeCTF2019]Avatar Uploader 2(未完成) 代码审计|文件上传

题目来源&#xff1a;buuctf [HarekazeCTF2019]Avatar Uploader 2 一、打开靶机&#xff0c;整理信息 跟Avatar Uploader 1 题目长得一样&#xff0c;先上传相同文件看看情况&#xff0c;另外这道题还有源码&#xff0c;可以看看 二、解题思路 step 1&#xff1a;上传同类…

Elementor Pro 3.27 汉化版 2100套模板 安装教程 wordpress主题中文编辑器插件免费下载

插件下载地址 https://a5.org.cn/a5ziyuan/732506.html 转载请注明出处! Elementor Pro 是流行的 Elementor 的付费扩展 WordPress 页面构建器插件. 它为免费的 Elementor 插件添加了许多附加功能和增强功能&#xff0c;使其成为创建美丽的更强大的工具 WordPress 网站。 如果…

深入理解动态规划(dp)--(提前要对dfs有了解)

前言&#xff1a;对于动态规划&#xff1a;该算法思维是在dfs基础上演化发展来的&#xff0c;所以我不想讲的是看到一个题怎样直接用动态规划来解决&#xff0c;而是说先用dfs搜索&#xff0c;一步步优化&#xff0c;这个过程叫做动态规划。&#xff08;该文章教你怎样一步步的…

0基础跟德姆(dom)一起学AI 自然语言处理19-输出部分实现

1 输出部分介绍 输出部分包含: 线性层softmax层 2 线性层的作用 通过对上一步的线性变化得到指定维度的输出, 也就是转换维度的作用. 3 softmax层的作用 使最后一维的向量中的数字缩放到0-1的概率值域内, 并满足他们的和为1. 3.1 线性层和softmax层的代码分析 # 解码器类…

uart iic spi三种总线的用法

1、uart串口通信 这种连接方式抗干扰能力弱&#xff0c;旁边有干扰源就会对收发的电平数据造成干扰&#xff0c;进而导致数据失真 这种连接方式一般适用于一块板子上面的两个芯片之间进行数据传输 &#xff0c;属于异步全双工模式。 1.空闲位&#xff1a;当不进行数据收发时&am…

类与对象(上)

面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。 类的…

三元组抽取在实际应用中如何处理语义模糊性?

在实际应用中&#xff0c;三元组抽取面临语义模糊性的问题&#xff0c;这主要体现在输入文本的非规范描述、复杂句式以及多义性等方面。为了有效处理这种模糊性&#xff0c;研究者们提出了多种方法和技术&#xff0c;以下是一些关键策略&#xff1a; 基于深度学习的方法 深度学…

【线性代数】基础版本的高斯消元法

[精确算法] 高斯消元法求线性方程组 线性方程组 考虑线性方程组&#xff0c; 已知 A ∈ R n , n , b ∈ R n A\in \mathbb{R}^{n,n},b\in \mathbb{R}^n A∈Rn,n,b∈Rn&#xff0c; 求未知 x ∈ R n x\in \mathbb{R}^n x∈Rn A 1 , 1 x 1 A 1 , 2 x 2 ⋯ A 1 , n x n b 1…

智慧脚下生根,智能井盖监测终端引领城市安全新革命

在繁忙的都市生活中&#xff0c;我们往往只关注地面的繁华与喧嚣&#xff0c;却忽略了隐藏在地面之下的基础设施——井盖。这些看似不起眼的井盖&#xff0c;实则承担着排水、通讯、电力等重要功能&#xff0c;是城市安全运转的重要一环。然而&#xff0c;传统的井盖管理面临着…