Three.js进阶之粒子系统(一)

news2025/6/10 4:27:22

一些特定模糊现象,经常使用粒子系统模拟,如火焰、爆炸等。Three.js提供了多种粒子系统,下面介绍粒子系统

一、Sprite粒子系统

使用场景:下雨、下雪、烟花

ce使用代码:

var material=new THRESS.SpriteMaterial();//创建材质
var sprite=new THRESS.Sprite(material); //创建粒子

通过改变材质参数,可以增加粒子系统的显示效果,SpriteMaterial材质参数属性与描述如下所示:

属性

属性描述
color粒子的颜色 
map粒子的纹理 
sizeAnnutation相机的远近是否影响粒子效果
opactivy透明度
transparent是否透明

二、Sprite使用示例

此示例是分布在球面范围的粒子逐渐朝着球心位置收缩,关键代码如下:

     function createSprites(){                     //创建粒子
               for (var x = -5; x < 5; x++) {            //创建10×10个粒子
                   for (var y = -5; y < 5; y++) {
                        var material = new THREE.SpriteMaterial({color:0xff0000*Math.
                        random()}); //创建粒子材质
                        var sprite = new THREE.Sprite(material);          //创建粒子
                        let ad = Math.PI / 180 * (360 * Math.random());   //设置球坐标的角度
                        let bd = Math.PI / 180 * (360 * Math.random());   //设置球坐标的角度
                        sprite.position.set(40 * Math.cos(ad)*Math.cos(bd), 40 *
                          //设置粒子的位置
                        Math.cos(ad)*Math.sin(bd), 40 * Math.sin(ad));
                        pointmove(0,0,0, sprite);                      //启动平移滑动
                        scene.add(sprite);                            //将粒子添加进场景中
            }}}
           function pointmove( mx, my, mz, point) {                  //平滑移动动画
              tween = new TWEEN.Tween( point.position ).to( {      //创建Tween动画对象
                   x: mx,                                          //设置移动目标点的x坐标
                   y: my,                                          //设置移动目标点的y坐标
                   z: mz }, 3000 )             //设置移动目标点的z坐标和动画时间
                   .easing( TWEEN.Easing.Linear.None).start();      //播放动画
              tween.repeat(Infinity);                              //设置动画播放方式为重复
           }

CreateSprite()为创建粒子的方法。在该方法中通过for循环创建了100个粒子,在创建每个粒子的时候,让粒子材质的颜色随机生成,粒子位置用球面坐标公式来创建,因此使所有粒子随机分布在一个球表面。
pointmove()行为粒子平移滑动的方法。此方法接收粒子平移最终位置点的x、y、z坐标参数和粒子对象参数,然后创建Tween动画对象,给出指定的参数(如移动目标是粒子对象),移动终点是该方法接收的3个坐标值。

三、PointCloud粒子系统

场景: 处理大量粒子,相当于粒子集合。

其具有材质CloudMaterial参数如下所示:

属性描述
colors粒子颜色
map粒子材质
size大小
sizeAnnutation相机远近是否影响 粒子
vertexColors粒子顶点颜色
opacivy透明度
transparent是否透明
blending融合模式
fog

四、SpriteCloud示例

示例效果为飞舞的雪花,关键代码如下:

function createParticles(size, transparent, opacity, vertexColors,
              sizeAttenuation, color) {//创建粒子系统
              var geom = new THREE.Geometry();                 //创建几何体
              var material = new THREE.PointCloudMaterial({   //创建粒子系统材质
                  size: size,                                   //设置所有粒子的尺寸
                  transparent: transparent,                    //所有粒子是否透明
                   opacity: opacity,                            //所有粒子的透明度
                   vertexColors: vertexColors,                  //所有粒子应用粒子系统颜色
                   sizeAttenuation: sizeAttenuation,            //所有粒子近大远小
                  color: color                                 //粒子系统颜色
               });
               var range = 500;                                 //粒子分布范围
             for (var i = 0; i < 15000; i++) {                //创建15000个粒子
                   var particle = new THREE.Vector3(Math.random() * range - range / 2,
                      Math.random() *
                 range - range / 2, Math.random() * range - range / 2); //随机生成粒子坐标
                 geom.vertices.push(particle);                //设置粒子位置坐标
                var color = new THREE.Color(0x00ff00);      //创建颜色值
                 color.setHSL(color.getHSL().h, color.getHSL().s, Math.random() *
                      color.getHSL().l);
                  geom.colors.push(color);                     //设置粒子颜色
           }
             cloud = new THREE.PointCloud(geom, material);   //创建粒子系统
             cloud.name = "particles";                        //命名粒子系统
              scene.add(cloud);                                //将粒子系统添加进场景
        }


        以上的代码为创建粒子系统的方法,将一个几何体对象设置为不同的位置和颜色,以绘制上万个几何体粒子,最后将几何体粒子添加进粒子系统中。这样可实现通过粒子系统来管理大量单个粒子的功能。

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

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

相关文章

Python 解释器安装全攻略(适用于 Linux / Windows / macOS)

目录 一、Windows安装Python解释器1.1 下载并安装Python解释1.2 测试安装是否成功1.3 设置pip的国内镜像------永久配置 二、macOS安装Python解释器三、Linux下安装Python解释器3.1 Rocky8.10/Rocky9.5安装Python解释器3.2 Ubuntu2204/Ubuntu2404安装Python解释器3.3 设置pip的…

Java多线程从入门到精通

一、基础概念 1.1 进程与线程 进程是指运行中的程序。 比如我们使用浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 线程是CPU调度的基本单位&#xff0c;每个线程执行的都是某一个进程的代码的某…

【芯片仿真中的X值:隐藏的陷阱与应对之道】

在芯片设计的世界里&#xff0c;X值&#xff08;不定态&#xff09;就像一个潜伏的幽灵。它可能让仿真测试顺利通过&#xff0c;却在芯片流片后引发灾难性后果。本文将揭开X值的本质&#xff0c;探讨其危害&#xff0c;并分享高效调试与预防的实战经验。    一、X值的本质与致…

python3GUI--基于PyQt5+DeepSort+YOLOv8智能人员入侵检测系统(详细图文介绍)

文章目录 一&#xff0e;前言二&#xff0e;技术介绍1.PyQt52.DeepSort3.卡尔曼滤波4.YOLOv85.SQLite36.多线程7.入侵人员检测8.ROI区域 三&#xff0e;核心功能1.登录注册1.登录2.注册 2.主界面1.主界面简介2.数据输入3.参数配置4.告警配置5.操作控制台6.核心内容显示区域7.检…

5. TypeScript 类型缩小

在 TypeScript 中&#xff0c;类型缩小&#xff08;Narrowing&#xff09;是指根据特定条件将变量的类型细化为更具体的过程。它帮助开发者编写更精确、更准确的代码&#xff0c;确保变量在运行时只以符合其类型的方式进行处理。 一、instanceof 缩小类型 TypeScript 中的 in…

【QT】qtdesigner中将控件提升为自定义控件后,css设置样式不生效(已解决,图文详情)

目录 0.背景 1.解决思路 2.详细代码 0.背景 实际项目中遇到的问题&#xff0c;描述如下&#xff1a; 我在qtdesigner用界面拖了一个QTableView控件&#xff0c;object name为【tableView_electrode】&#xff0c;然后【提升为】了自定义的类【Steer_Electrode_Table】&…

【Docker 02】Docker 安装

&#x1f308; 一、各版本的平台支持情况 ⭐ 1. Server 版本 Server 版本的 Docker 就只有个命令行&#xff0c;没有界面。 Platformx86_64 / amd64arm64 / aarch64arm(32 - bit)s390xCentOs√√Debian√√√Fedora√√Raspbian√RHEL√SLES√Ubuntu√√√√Binaries√√√ …

论文笔记:Large Language Models for Next Point-of-Interest Recommendation

SIGIR 2024 1 intro 传统的基于数值的POI推荐方法在处理上下文信息时存在两个主要限制 需要将异构的LBSN数据转换为数字&#xff0c;这可能导致上下文信息的固有含义丢失仅依赖于统计和人为设计来理解上下文信息&#xff0c;缺乏对上下文信息提供的语义概念的理解 ——>使用…

LeetCode 2894.分类求和并作差

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路一详解&#xff08;遍历 判断&#xff09;&#xff1a; 思路二详解&#xff08;数学规律/公式&#xff09;&#xff1a; 代码&#xff1a; Java思路一&#xff08;遍历 判断&a…

CCF 开源发展委员会 “开源高校行“ 暨红山开源 + OpenAtom openKylin 高校行活动在西安四所高校成功举办

点击蓝字 关注我们 CCF Opensource Development Committee CCF开源高校行 暨红山开源 openKylin 高校行 西安站 5 月 26 日至 28 日&#xff0c;CCF 开源发展委员会 "开源高校行" 暨红山开源 OpenAtom openKylin 高校行活动在西安四所高校&#xff08;西安交通大学…

RabbitMQ work模型

Work 模型是 RabbitMQ 最基础的消息处理模式&#xff0c;核心思想是 ​​多个消费者竞争消费同一个队列中的消息​​&#xff0c;适用于任务分发和负载均衡场景。同一个消息只会被一个消费者处理。 当一个消息队列绑定了多个消费者&#xff0c;每个消息消费的个数都是平摊的&a…

基于微信小程序的作业管理系统源码数据库文档

作业管理系统 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和微信小程序来完成对系统的…

CSS(2)

文章目录 Emmet语法快速生成HTML结构语法 Snipaste快速生成CSS样式语法快速格式化代码 快捷键&#xff08;VScode&#xff09;CSS 的复合选择器什么是复合选择器交集选择器后代选择器(重要)子选择器(重要&#xff09;并集选择器(重要&#xff09;**链接伪类选择器**focus伪类选…

【RabbitMQ】- Channel和Delivery Tag机制

在 RabbitMQ 的消费者代码中&#xff0c;Channel 和 tag 参数的存在是为了实现消息确认机制&#xff08;Acknowledgment&#xff09;和精细化的消息控制。 Channel 参数 作用 Channel 是 AMQP 协议的核心操作接口&#xff0c;通过它可以直接与 RabbitMQ 交互&#xff1a; 手…

NLP学习路线图(三十四): 命名实体识别(NER)

一、命名实体识别(NER)是什么? 命名实体识别(Named Entity Recognition, NER)是自然语言处理中的一项关键序列标注任务。其核心目标是从非结构化的文本中自动识别出特定类别的名词性短语,并将其归类到预定义的类别中。 核心目标:找到文本中提到的命名实体,并分类。 典…

【HTML】HTML 与 CSS 基础教程

作为 Java 工程师&#xff0c;掌握 HTML 和 CSS 也是需要的&#xff0c;它能让你高效与前端团队协作、调试页面元素&#xff0c;甚至独立完成简单页面开发。本文将用最简洁的方式带你掌握核心概念。 一、HTML&#xff0c;网页骨架搭建 核心概念&#xff1a;HTML通过标签定义内…

Windows开机自动启动中间件

WinSW&#xff08;Windows Service Wrapper 是一个开源的 Windows 服务包装器&#xff0c;它可以帮助你将应用程序打包成系统服务&#xff0c;并实现开机自启动的功能。 一、下载 WinSW 下载 WinSW-x64.exe v2.12.0 (⬇️ 更多版本下载) 和 sample-minimal.xml 二、配置 WinS…

【图片转AR场景】Tripo + Blender + Kivicube 实现图片转 AR 建模

总览 1.将 2D 图片转为立体建模 2. 3. 一、将 2D 图片转为立体建模 1.工具介绍 Tripo 网站 2.找图片 找的图片必须是看起来能够让 AI 有能力识别和推理的&#xff0c;因为现在的AI虽然可以补全但是能力还没有像人的想象力那么丰富。 比如上面这张图片&#xff0c;看起来虽…

LSTM-XGBoost多变量时序预测(Matlab完整源码和数据)

LSTM-XGBoost多变量时序预测&#xff08;Matlab完整源码和数据&#xff09; 目录 LSTM-XGBoost多变量时序预测&#xff08;Matlab完整源码和数据&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 普通的多变量时序已经用腻了&#xff0c;审稿人也看烦了&#…

C#学习12——预处理

一、预处理指令&#xff1a; 解释&#xff1a;是在编译前由预处理器执行的命令&#xff0c;用于控制编译过程。这些命令以 # 开头&#xff0c;每行只能有一个预处理指令&#xff0c;且不能包含在方法或类中。 个人理解&#xff1a;就是游戏里面的备战阶段&#xff08;不同对局…