粒子系统——作业与练习

2023-10-26

粒子光环制作

参考 http://i-remember.fr/en 这类网站,使用粒子流编程控制制作一些效果, 如“粒子光环”

在本次作业中,我使用粒子系统制作了一个彩虹效果的烟花。

基本步骤

首先,新建一个空对象Halo,并添加子对象,然后加入粒子系统:

然后新建脚本Halo,在脚本中完成具体粒子效果的实现。


    private ParticleSystem particleSys;  // 粒子系统
    private ParticleSystem.Particle[] particleArr;  // 粒子数组  
    private ParticleInfo[] particles; // 粒子位置数组
    public Gradient colorGradient; // 粒子颜色改变器
    public int count = 10000;       // 粒子数量  
    public float size = 0.03f;      // 粒子大小  
    public float minRadius = 5.0f;  // 最小半径  
    public float maxRadius = 12.0f; // 最大半径  
    public bool clockwise = true;   // 顺时针|逆时针  
    public float speed = 2f;        // 速度  
    public float pingPong = 0.02f;  // 游离范围

首先在Halo中声明需要用到的相关变量,包括了粒子系统、数组、位置数组以及粒子的数量、大小和半径范围等参数。

    public class ParticleInfo
    {
        public float radius = 0f, angle = 0f, time = 0f;
        public ParticleInfo(float x, float y, float z)
        {
            radius = x;
            angle = y;
            time = z;
        }
    }

ParticleInfo类定义了每个粒子的半径、角度和时间,方便之后的处理。

    void RandomlySpread()
    {
        for (int i = 0; i < count; i ++)
        {
            // 随机粒子距离中心的半径
            float midR = (maxRadius + minRadius) / 2;
            float minRate = Random.Range(1, midR / minRadius);
            float maxRate = Random.Range(midR / maxRadius, 1);
            float R = Random.Range(minRadius * minRate, maxRadius * maxRate);

            // 随机每个粒子的角度  
            float angle = Random.Range(0, 360);
            float theta = angle / 180 * Mathf.PI;

            // 随机每个粒子的游离起始时间  
            float time = Random.Range(0.0f, 360.0f);
            particles[i] = new ParticleInfo(R, angle, time);
            particleArr[i].position = new Vector3(particles[i].radius * Mathf.Cos(theta), 0f, particles[i].radius * Mathf.Sin(theta));
        }
        particleSys.SetParticles(particleArr, particleArr.Length);
    }

RandomlySpread函数用来赋予每个粒子一个初始的位置,在一定范围内随机生成每个粒子的位置、角度游离时间。我们希望粒子总体集中在平均半径附近,这样看起来比较美观。

    // Start is called before the first frame update
    void Start()
    {
        //initialize
        particleArr = new ParticleSystem.Particle[count];
        particles = new ParticleInfo[count];

        // 初始化粒子系统
        particleSys = this.GetComponent<ParticleSystem>();
        particleSys.startSpeed = 0;            // 粒子位置由程序控制
        particleSys.startSize = size;          // 设置粒子大小
        particleSys.loop = false;
        particleSys.maxParticles = count;      // 设置最大粒子量
        particleSys.Emit(count);               // 发射粒子
        particleSys.GetParticles(particleArr);

        RandomlySpread();   // 初始化各粒子位置

    }

Start中初始化粒子数组和粒子系统,并初始化粒子的位置(调用RandomlySpread函数)。

    void Update()
    {
        for (int i = 0; i < count; i++)
        {
            if (clockwise) 
                particles[i].angle -= (i % tier + 1) * (speed / particles[i].radius / tier);
            else          
                particles[i].angle += (i % tier + 1) * (speed / particles[i].radius / tier);

            particles[i].angle = (360.0f + particles[i].angle) % 360.0f;
            float theta = particles[i].angle / 180 * Mathf.PI;
            float x = 10 * Mathf.Sin(8 * theta) * Mathf.Cos(theta);
            float y = 10 * Mathf.Sin(8 * theta) * Mathf.Sin(theta);
            particleArr[i].position = new Vector3(x, 0f, y + Random.Range(-1f, 1f));

            // 粒子在半径方向上游离  
            particles[i].time += Time.deltaTime;
            particles[i].radius += Mathf.PingPong(particles[i].time / minRadius / maxRadius, pingPong) - pingPong / 2.0f;

            //改变粒子透明度
            particleArr[i].color = colorGradient.Evaluate(Random.value);

        }

        particleSys.SetParticles(particleArr, particleArr.Length);
    }

Update函数用来更新粒子的位置,首先通过设置一个差分层变量tier将粒子系统分为十层,每一层角度的增量都不相同,这就使得粒子系统的运动更加美观。clockwise决定旋转的方向。由于总体是圆形,所以要保证粒子的角度在0-360度之间。此外,还有一个PingPong函数,使得粒子在一个半径范围内来回地波动。
为了使粒子系统呈现烟花的形状。我在这里使用了玫瑰线函数,该函数图像及参数方程如下:
r = 10
x = rsin(10t)cos(t)
y = r
sin(10*t)*sin(t)

可以通过调整数值来改变叶片的数量。

通过将粒子数组的position设置为该函数来使得粒子系统呈现烟花状:

            float theta = particles[i].angle / 180 * Mathf.PI;
            float x = 10 * Mathf.Sin(8 * theta) * Mathf.Cos(theta);
            float y = 10 * Mathf.Sin(8 * theta) * Mathf.Sin(theta);
            particleArr[i].position = new Vector3(x, 0f, y + Random.Range(-1f, 1f));

最后,创建三个粒子系统,并分别加上红黄蓝三种颜色,将它们叠加在一起,最后就可以看到一个彩虹色的烟花了:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

粒子系统——作业与练习 的相关文章

  • 使用 DirectX 或 OpenGL 显示 100 个浮动立方体

    我想使用显示 100 个浮动立方体DirectX or OpenGL 我正在寻找一些示例源代码或该技术的描述 我无法正确显示多个立方体 我在网上搜索了一系列很好的教程 尽管他们谈论了如何做3D基元 我找不到有关如何进行大量操作的信息3D原语
  • 矩形相交

    是否有任何已知的方法来计算两个矩形之间的相交矩形 我的意思是 如果矩形 A 由 x1 y2 x2 y2 定义 B 由 x3 y3 x4 y4 定义 那么如何计算相交矩形 C x5 y5 x6 y6 的坐标 Thanks 相交多边形的一般问题
  • 给定一个 4x4 齐次矩阵,我如何获得 3D 世界坐标?

    所以我有一个正在旋转然后再次平移和旋转的对象 我将这些翻译的矩阵存储为对象成员 现在 当我进行对象拾取时 我需要知道该对象的 3D 世界坐标 目前我已经能够像这样获得物体的位置 coords 0 finalMatrix 12 坐标 1 最终
  • 受约束景观的程序生成

    我想实现地形的程序生成 经过彻底的研究后 我得出的结论是 应该使用梯度 相干 噪声生成算法之一来实现 例如 Perlin 噪声算法 然而 我不希望生成是完全随机的 我想应用一些限制 例如哪里应该是山脉 或者哪里应该是低地等 问题 例如 我有
  • 计算 3D(或 n 维)质心的最佳方法是什么?

    作为工作项目的一部分 我必须计算 3D 空间中一组点的质心 现在我正在以一种看似简单但天真的方式来做这件事 通过取每组点的平均值 如下所示 centroid average x average y average z where x y a
  • 如何在 OpenGL 中创建廉价的阴影? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有两个模型 A 和 B 以及一个灯 L 我希望模型 A 在模型 B 上投射阴影 我暂时不想考虑阴影体
  • CSS3“曲面”3D 变换/透视帮助

    我正在尝试为我的网站创建一种有观点的人群 它实际上是一个充满平面图像的 ul 我想创建一种 弯曲 的感觉 就像圆形的人群一样 它向内并且向内明显变小 并向末端弯曲 海报圈的例子是我能找到的最接近的http www webkit org bl
  • 将点云转换为深度/多通道图像

    我有一个通过使用立体相机扫描平面生成的点云 我已经生成了法线 fpfh 等特征 并使用这些信息我想对点云中的区域进行分类 为了能够使用更传统的 CNN 方法 我想将此点云转换为 opencv 中的多通道图像 我将点云折叠到 XY 平面 并与
  • SceneKit 修改 3D 对象并导出文件

    在我的应用程序中 我使用 SceneKit Framework 在 SCNView 中显示 3D 对象 并导出修改后的文件 并进行一些小的更改 如颜色 温度等 但在将其导出到文档文件夹后 我得到了原始文件 在这里我可以显示 3D 对象并对其
  • 在 Unity 3D 中使用触摸输入在地形上移动相机

    我是 Unity 新手 我正在尝试弄清楚如何使用触摸输入在地图 地形上移动相机 摄像机将以 90 0 0 的旋转角度俯视地形 地形位于第 8 层 我用键盘移动它没有问题 现在我尝试移动到触摸 如果你想在 iOS 上保持预期的使用情况 那就非
  • 基于 Q3DScatter 的自定义图表,QCustom3DItem 运行缓慢

    我想制作一个带条形的 3D 图表 条形颜色取决于其大小 两个都Qt 条形图和散点图类型 https doc qt io qt 5 qtdatavisualization overview html接近我正在寻找的东西 我最终创建了一个基于的
  • 如何使用更少的包绘制二元正态分布的表面和轮廓

    我将绘制二元正态分布的 3D 曲面及其轮廓 可以是任何二元正态分布 我想用persp and contour在我的画中 我在网上搜索了一下 但发现了很多方法 大多数人都使用过一些软件包 但我想以使用更少的软件包甚至不安装任何软件包的方式来执
  • 如何在SceneKit中实现逼真的景深效果?

    我正在尝试渲染具有真实景深效果的帧 我已经尝试过景深属性camera节点 但它不会产生可用的结果 是否可以切换到景深效果的最大渲染质量 性能不是一个因素 我只需要渲染一帧 用户可以等待它 SceneKit 中逼真的景深效果 在SceneKi
  • 一次性渲染阴影

    考虑到阴影投射的成本 我想知道对于动态定位的静态对象 例如 程序城市 是否有一个功能或可能 实验性的方法可以在 Three js 中仅渲染一次阴影贴图 甚至在 webgl 中 因此 结果可以在静态对象的下一帧中免费使用 仅当物体移动时才会进
  • 光线追踪三角形

    我正在用java编写一个光线追踪器 并且我能够追踪球体 但我相信我追踪三角形的方式有问题 据我了解 这是基本算法 首先确定射线是否与plane三角形已打开 剪裁所有点 使它们与三角形位于同一平面上 因此xy以平面为例 根据沿着新平面向任意方
  • 判断一个点是否在多面体内部

    我试图确定某个特定点是否位于多面体内部 在我当前的实现中 我正在研究的方法采用我们正在寻找多面体面的数组 在本例中为三角形 但稍后可能是其他多边形 的点 我一直在尝试根据这里找到的信息进行工作 http softsurfer com Arc
  • 简单的线框格式?

    我正在寻找一种用于线框模型的简单文件格式 我知道 VRML u3D 等 但这些对于我的需求来说似乎很重要 我的标准是 必须有明确的规格 要么是开放的 要么是非常完善 记录的 我只需要 想要 简单的模型 顶点和边 我不想处理面孔或物体 如果格
  • 我应该如何格式化 .dat 文件以便制作 3D 矢量图?

    我正在为大学做这个编程任务 我们必须写一个c 计算 3D 空间中某些线圈的磁场矢量的程序 我已经成功编写了这个程序 并且我认为它运行得很好 不过 我想添加一个特殊的东西 这是我的试卷 所以它必须特别好 我想绘制出向量 我习惯打电话gnupl
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 如何在 React Native 中渲染自定义 3D 对象

    我已经成功使用 Three js expo Three 和 expo gl 在 React Native 中配置了红色立方体的 3D 渲染 但我想让用户渲染他们自己可能拥有的自定义 3D 对象 obj 或 mtl 扩展名 但我不确定如何让他

随机推荐

  • Qt中qss样式表

    qss样式表是用于设置QT程序UI界面中控件的背景图片 大小 字体颜色 字体类型 按钮状态变化等属性 美化UI界面 实现界面和程序的分离 可以快速切换皮肤 1 基本语法 selector attribute value 说明 selecto
  • Java生成exe执行文件

    一 准备工作 下载可将jar包转换的工具EXE4J工具 下载地址为 https www ej technologies com download exe4j files 下载完成 直接点击下一步安装 直到安装完成 导出项目jar包 按以下步
  • javaFile类知识点总结

    1 File类 Java io File类是文件和目录路径名的抽象表示 主要用于文件和目录的创建 查找 删除等操作 File中的静态成员变量 pathSeparator与系统有关的路径分隔符 File pathSeparator 代表路径分
  • android系统删除apk的广播,研究androidapk安装卸载等产生的系统广播

    想更加清楚的了解 android 系统在安装 卸载时产生的系统广播 于是写了一个 demo 来做监听 BroadReceiver 配置如下 html 这里有一点要注意 需配置 否则收不到广播 1 当你第一次安装某个应用的时候 java 10
  • 干货

    SpringCloud的从整体架构上看 相对来说是完整的 庞大的 它不仅仅是一个基础性架构工具 它为微服务架构提供了一个 全家桶 的套餐 每一个模块关注各自的职能 并且能够很好地配合与协作 能够帮助入门者快速搭建起一套微服务架构的服务 内容
  • MyBatis之使用JSONObject代替JavaBean优雅返回多表查询结果

    项目中需要返回多个表的查询结果 比如user表中的用户信息和user个人的所在班的班级信息 目前我们有user实体类和class实体类 一般情况下如果是单表查询 比如查询user信息 那么查询的返回值就是一个user对象或一个user对象列
  • Qt_Qt报错multiple target patterns

    去看看pro文件中的路径是否有问题
  • ARM7的三级流水线过程

    看到汇编中很多关于程序返回与中断返回时处理地址都很特别 仔细想想原来是流水线作用的效果 所以 决定总结学习下ARM流水线 ARM7处理器采用3级流水线来增加处理器指令流的速度 能提供0 9MIPS MHz的指令处理速度 PS MIPS Mi
  • Android RxJava第一弹之原理详解、使用详解、常用场景(基于Rxjava2.0)

    Android RxJava第一弹之原理详解 使用详解 常用场景 基于Rxjava2 0 Android RxJava第二弹之RxJava封装库 RxJava Animation RxJava Glide Android RxJava第三弹
  • C语言数据结构复杂度

    文章目录 前言 什么是数据结构 什么是算法 算法效率 算法的复杂度 时间复杂度 时间复杂度的概念 大O的渐进表示法 常见时间复杂度计算举例 空间复杂度 常见复杂度对比 前言 从这篇博客开始为数据结构与算法的相关内容 数据结构比较难 博主建议
  • Leecode初级算法字符串——验证回文串

    给定一个字符串 验证它是否是回文串 只考虑字母和数字字符 可以忽略字母的大小写 说明 本题中 我们将空字符串定义为有效的回文串 示例 1 输入 A man a plan a canal Panama 输出 true 解释 amanaplan
  • tcp三次握手

    在TCP IP协议中 TCP协议提供可靠的连接服务 采用三次握手建立一个连接 第一次握手 建立连接时 客户端发送syn包 syn j 到服务器 并进入SYN SEND状态 等待服务器确认 第二次握手 服务器收到syn包 必须确认客户的SYN
  • Ubuntu18.04安装教程

    Ubuntu18 04安装教程 一 准备工作 1 下载 Ubuntu 镜像 2 制作U盘启动盘 3 给 Ubuntu 分配硬盘空间 二 安装 Ubuntu18 04 1 设置启动项 2 正式安装 1 选择语言 2 键盘布局 3 无线连网 4
  • Python 字典10种意想不到的用途

    Python 字典10种意想不到的用途 1 switch case语句 2 记忆化 3 稀疏矩阵 4 图表 5 状态机 6 计数频率 7 XML HTML 解析 8 配置文件 9 缓存 API 响应 10 编码和解码数据 源码 参考 Pyt
  • GIS gentools jar包使用

    package ghgf import java io File import java io IOException import java io Serializable import java net MalformedURLExce
  • 随机梯度下降求解svm(MATLAB)

    本文转载自 http blog csdn net orangehdc article details 38682501 随机梯度下降法 Stochastic Gradient Descent 求解以下的线性SVM模型 w的梯度为 传统的梯度
  • VTK学习之vtkProp

    vtkProp 渲染场景中数据的可视表达 Visible Depictions 是由vtkProp的子类负责 也就是说 数据想要进行可视化显示 需要一个转换过程 这个过程就是转换为vtkProp 这样才能进行渲染展示出来 而vtkProp子
  • 【Inception-v3模型】迁移学习 实战训练 花朵种类识别

    参考博客 TensorFlow 迁移学习 使用Inception v3 非常感谢这个博主的这篇博客 我这篇博客的框架来自于这位博主 然后我针对评论区的问题以及自己的实践增加了一些内容以及解答 github 代码 知识储备 迁移学习是将一个数
  • 虚拟化的主流技术介绍

    虚拟化 是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机 在一台计算机上同时运行多个逻辑计算机 每个逻辑计算机上可以运行不同的操作系统 并且应用程序都可以相互独立的空间内运行而互不影响 显著提高计算机的工作效率 虚拟化实现了用软件的方法重
  • 粒子系统——作业与练习

    粒子光环制作 参考 http i remember fr en 这类网站 使用粒子流编程控制制作一些效果 如 粒子光环 在本次作业中 我使用粒子系统制作了一个彩虹效果的烟花 基本步骤 首先 新建一个空对象Halo 并添加子对象 然后加入粒子