利用 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.mzph.cn/bicheng/69028.shtml

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

相关文章

DRF开发避坑指南01

在当今快速发展的Web开发领域&#xff0c;Django REST Framework&#xff08;DRF&#xff09;以其强大的功能和灵活性成为了众多开发者的首选。然而&#xff0c;错误的使用方法不仅会导致项目进度延误&#xff0c;还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大…

ES设置证书和创建用户,kibana连接es

1、启动好es 2、进入es容器 docker exec -it es /bin/bash 3、生成ca证书 ./bin/elasticsearch-certutil ca 注&#xff1a;两个红方框位置直接回车 4、生成cert证书 ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 注&#xff1a;前两个红框直接回车&am…

一位前端小白的2024总结

目录 简要 一、迷茫点的解决 &#xff08;1&#xff09;前端领域该怎么学&#xff1f; &#xff08;2&#xff09;旧技术还需要学吗&#xff1f; &#xff08;3&#xff09;我该学些什么&#xff1f; 二、折磨点的解决 &#xff08;1&#xff09;学技术成果回报太慢怎么…

python爬虫 爬取站长素材 (图片)(自学6)

安装 &#xff1a;lxml 地址 &#xff1a; Installing lxml pip install lxml 或者 sudo pip install lxml 下面开始 写代码 下载 站长素材的图片 import urllib.requestfrom lxml import etreeimport osdef create_request(page):if(page 1):url "https://sc.chinaz.…

《OpenCV》——图像透视转换

图像透视转换简介 在 OpenCV 里&#xff0c;图像透视转换属于重要的几何变换&#xff0c;也被叫做投影变换。下面从原理、实现步骤、相关函数和应用场景几个方面为你详细介绍。 原理 实现步骤 选取对应点&#xff1a;要在源图像和目标图像上分别找出至少四个对应的点。这些对…

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

第十五届的题目在规定时间内做出了前5道&#xff0c;还有2道找时间再磨一磨。现在把做的一些思路总结如下&#xff1a; 题1&#xff1a;握手问题 问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 50人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例…

2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程

本文目录 一、查看驱动版本1.1 查看显卡驱动1.2 显卡驱动和CUDA对应版本1.3 Pytorch和Python对应的版本1.4 Pytorch和CUDA对应的版本 二、安装CUDA三、安装cuDANN四、安装pytorch五、验证是否安装成功 一、查看驱动版本 1.1 查看显卡驱动 输入命令nvidia-smi可以查看对应的驱…

unity插件Excel转换Proto插件-ExcelToProtobufferTool

unity插件Excel转换Proto插件-ExcelToProtobufferTool **ExcelToProtobufTool 插件文档****1. 插件概述****2. 默认配置类&#xff1a;DefaultIProtoPathConfig****属性说明** **3. 自定义配置类****定义规则****示例代码** **4. 使用方式****4.1 默认路径****4.2 自定义路径**…

Web3 与数据隐私:如何让用户掌控个人信息

随着数字化时代的快速发展&#xff0c;互联网已经渗透到我们生活的方方面面&#xff0c;个人数据的收集与使用也变得越来越普遍。与此同时&#xff0c;数据隐私问题逐渐成为全球关注的焦点。传统的互联网平台通常将用户的数据存储在中心化的服务器上&#xff0c;这意味着平台拥…

SQL Server 建立每日自动log备份的维护计划

SQLServer数据库可以使用维护计划完成数据库的自动备份&#xff0c;下面以在SQL Server 2012为例说明具体配置方法。 1.启动SQL Server Management Studio&#xff0c;在【对象资源管理器】窗格中选择数据库实例&#xff0c;然后依次选择【管理】→【维护计划】选项&#xff0…

C++—21、C++ 中构造函数Constructors

一、什么是构造函数&#xff1f; 构造函数是一个特殊的方法&#xff0c;它在类每次实例化创建对象的时侯自动调用&#xff0c;用于初始化对象。 构造函数的名字必须与类名完全相同&#xff0c;并且没有返回类型&#xff0c;甚至连void也没有。 构造函数的目的是确保对象在创…

Tensor 基本操作1 unsqueeze, squeeze, softmax | PyTorch 深度学习实战

本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 目录 创建 Tensor常用操作unsqueezesqueezeSoftmax代码1代码2代码3 argmaxitem 创建 Tensor 使用 Torch 接口创建 Tensor import torch参考&#xff1a;https://pytorch.org/tutorials/beginn…

C# HTTP/HTTPS 请求测试小工具

这是一个使用 C# 语言开发的实用小工具&#xff0c;旨在帮助用户轻松测试 HTTP 和 HTTPS 请求。 该工具可以发送各种 HTTP 和 HTTPS 请求&#xff0c;包括但不限于 GET、POST、PUT、DELETE 等常见的请求类型。通过简洁明了的界面或命令行操作&#xff0c;用户可以方便地输入目…

Kyligence AI 数据智能体:首批亮相神州数码 DC·AI 生态创新中心!

近日&#xff0c;跬智信息&#xff08;Kyligence&#xff09;长期合作伙伴神州数码&#xff0c;其 DCAI 生态创新中心正式启幕。 作为首批生态伙伴&#xff0c;Kyligence AI 数据智能体也正式入驻&#xff0c;在这里首次亮相。 Kyligence 是国内最早推出 AI 用数产品的厂商&a…

Vue基础(2)

19、组件之间传递数据 组件与组件之间不是完全独立的&#xff0c;而是有交集的&#xff0c;那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props ComponentA.vue <template><!-- 使用ComponentB组件&#xff0c;并传递title属性 --><h3>…

STM32_SD卡的SDIO通信_基础读写

本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、SD卡 速读…

【深度学习】2.视觉问题与得分函数

计算机视觉任务 可以通过神经网络搜索是什么类别的动物。 图像实际就是含有数值的三维矩阵。 像素值从0-255可以表示亮度递增的参数。数字越大&#xff0c;像素点越亮。 最后的3表示三个颜色通道&#xff0c;常见的如JPG、RGB等。 现实场景容易发生各种遮蔽现象。 计算机判断…

JVM面试题解,垃圾回收之“分代回收理论”剖析

一、什么是分代回收 我们会把堆内存中的对象间隔一段时间做一次GC&#xff08;即垃圾回收&#xff09;&#xff0c;但是堆内存很大一块&#xff0c;内存布局分为新生代和老年代、其对象的特点不一样&#xff0c;所以回收的策略也应该各不相同 对于“刚出生”的新对象&#xf…

单片机-STM32 IIC通信(OLED屏幕)(十一)

一、屏幕的分类 1、LED屏幕&#xff1a; 由无数个发光的LED灯珠按照一定的顺序排列而成&#xff0c;当需要显示内容的时候&#xff0c;点亮相关的LED灯即可&#xff0c;市场占有率很高&#xff0c;主要是用于户外&#xff0c;广告屏幕&#xff0c;成本低。 LED屏是一种用发光…

Windows cmd常用命令

文章目录 Windows cmd常用命令一、引言二、文件和目录操作1、查看和切换目录2、文件和目录的创建与删除 三、系统信息与网络配置1、系统信息2、网络配置 四、使用示例五、总结 Windows cmd常用命令 一、引言 Windows 命令提示符&#xff08;cmd&#xff09;是一个强大的工具&a…