UE4/5Niagara粒子特效之Niagara_Particles官方案例:2.4->3.2

news2024/12/26 20:46:20

之前的案例

UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.1->1.4_多方通行8的博客-CSDN博客

UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3_多方通行8的博客-CSDN博客

2.4 Location Events

 这次的项目和之前又有很大的不同,它是由3个发射器组成的:

 创建事件处理器:

可以看到右边的两个发射器里面,都有一个事件处理器,在里面处理事件:

很多人不知道是如何创建的,这里便展示一下:

准备一个Empty的发射器,然后在属性那里,有一个“+阶段”,点击后,有一个事件处理器,创建即可。

可是创建出来的事件处理器还是空的,所以我们要在进行添加:

 

 添加之前,记得在其他发射器部分是需要有事件的,否则是无法进行添加的:

 分辨不同发射器是干什么的

对于这种有多个发射器的情况,只需要将某个发射器取消,就知道这个的功能是什么。

将右边取消勾选后,可以看到NS【Niagara System】里面的掉落小球效果消失了。

将左边取消勾选后,可以看到NS【Niagara System】里面的拖尾条带效果消失了。

 

 然后我们就可以知道第一个发射器的作用是向上发射球粒子,然后自然下降【类似喷泉的效果】:

这边就不做详细刨析了,想必能看到这的都明白Niagara的基础了。

第一个发射器

简单的讲解一下:

首先是发射器更新里面,其粒子生成的速度是1.333每秒。

然后在粒子生成里面,生成的范围是一个半径为8的圆形里面,然后在生成后会向上锥形添加250-400范围速度。

之后在粒子更新里面,添加了重力和解算器。

这也是我说什么这个发射器类似于喷泉的原因。

最后就是下面这张图,生成位置事件

第一个是模式,这里是可以进行设置的,这里面是Send Rate.

下面的30是每秒发送的事件数。【注释:这不是一个准确的数字,因为我们没有考虑到余数。

下面的打勾是允许发送这个事件,这样的话,它的每一次发送都会被有需要的发射器所接收。【这个如果为false,那么其他发射器就无法接收到这个事件】

下面我们可以看到它发送出去的一些属性。

 

 第二个发射器

前面就是根据生命周期更改颜色,但没有生成粒子。

打开事件处理器可以看见:

它接收到了第一个发射器发送的事件【源进行设置】

然后执行生成1个粒子。

Receive Location Event

接收位置事件,例如由“生成位置事件”模块生成的事件。可选地将事件负载直接写入接收粒子的属性。通过展开事件生成器上的高级属性并覆盖事件发送的默认数据,可以从GenerateL ocationEvent发送自定义数据。

可以看到有些是Apply【应用】,有些是Output【输出】。

比如生命周期Normalized Age是Output,所以用的是它自己的生命周期,如果使用的是Apply,那么用的就是第一个发射器粒子的生命周期,可以看看效果,NS的效果不一样的很明显。

 第三个发射器

第三个发射器的表现是类似于主发射器的球后面的头皮屑拖尾【很多2d的那种类似的星星拖尾效果】

所以我们看看:

初始化的大小是2.5-6随机的,而寿命是0.875-1.25之间,这也就是我们看到他像火芯一样快速消散的原因。

然后是添加速度,以一种线性的添加,速度是随机的3个-32到+32.

之后是重力,重力高达-250.

 

 接下来就是事件处理器:

可以看到是接收一次生成一个粒子【改为100还挺好看的】

之后是接收相关的属性。 

然后这里是生成的位置,在获取了球的位置之后,我们在这个位置的四周半径为1的位置进行随机生成粒子。

最后便是渲染器。

2.5 Expressions

表达式。

我们打开这个粒子特效可以发现,与我们之前写的时候不一样。

那是因为我们之前使用的是模块,类似于蓝图中的函数,然后将属性放到函数中去。

而这里则是对属性直接进行调整:

 

 这种是怎么做的呢?:

创建一个发射器,选择,然后左下角就会出现各种各样的属性,直接拖入即可。

 可能会发现我们创建了空的发射器后,怎么找不到一些属性,那是因为我们是可以自己去进行创建的:

 所以接下来我们来看看:

发射器更新

每秒生成1000个粒子

 一开始的初始化是NS【Niagara System】的位置。

而第二个ZOffset则开始不一样了,用的是自定义表达式:sin(Emitter.Age)*56

我们来看看这个表达式是什么意思:使用sin()函数计算发射器年龄(Emitter.Age)的正弦值,然后将正弦值乘以56。

这样子在一个属性的集内添加其他属性

 粒子生成 

集1

使用rand()函数生成一个三维随机向量,参数为float3(1.0, 1.0, 1.0),表示每个维度的取值范围为[-1, 1],将生成的随机向量乘以2,得到一个新的三维向量,然后从得到的这个三维向量中减去1,得到一个新的三维向量,对其进行归一化处理,使其长度变为1,得到一个单位向量。

集2

1. 属性Lifetime


   这个表达式表示粒子的寿命属性(Lifetime)是一个在[2.2, 3.7]范围内的随机值。


2. 属性Position


   这个表达式表示粒子的位置属性(Position)等于发射器的初始位置(Emitter.InitialPosition)加上一个随机三维向量(Particles.RandomVector)乘以一个在[0, 145.0f]范围内的随机值。



3. 属性SpriteSize

这个表达式表示粒子的精灵大小属性(SpriteSize)是一个在[0.5, 3.0f]范围内的随机值,因为是Vector2D from float,所以它是将两个浮点赋予一个向量2d。



4. 属性Velocity

cross(Particles.RandomVector, float3(0,8,0)) * (float3(0.0f, 0.0f, Emitter.ZOffset) * 0.2f) + (-1.0f * normalize(Emitter.InitialPosition - Particles.Position) * 20)
  首先,计算发射器的初始位置与粒子的当前位置之间的方向向量差(Emitter.InitialPosition - Particles.Position),并将其归一化。
   然后使用向量积函数(cross)计算粒子的随机向量(Particles.RandomVector)与float3(0, 8, 0)之间的向量积。
   将上面的两个向量积相加,并乘以(float3(0.0f, 0.0f, Emitter.ZOffset) * 0.2f),最后将结果乘以-1.0f。

 粒子更新

集1

是ue5的Niagara系统:
Color:意思很简单,获取的是Particles.NormalizedAge是否小于0.333,是,值则变成float4(1,0.1,0.1,1),不是则判断是不是小于0.575?是,值为float4(0.1,1,0.1,1),不是,值为float4(0.1,0.1,1,1)

Particles.NormalizedAge < 0.333 ? float4(1,0.1,0.1,1) : Particles.NormalizedAge < 0.575 ? float4(0.1,1,0.1,1) : float4(0.1,0.1,1,1)


Position:

这个表达式通过在z轴方向上根据sin(Engine.Time)的值进行偏移,来改变粒子的位置。

Particles.Position + float3(0, 0, ( sin(Engine.Time) * 0.3f ))

SpriteSize:

使用的是Multiply Vector2函数,即A*B

A是SpriteSize,即粒子的大小。

B是(1.0f - abs(Particles.NormalizedAge * 2.0f -1.0f)) * 2.0f

即先计算:Particles.NormalizedAge 乘以 2.0 后再减去 1.0得到的值,这个值做一个绝对值【架设为TempA】,然后用 1减去TempA【架设为TempB】。
最后将TempB乘以 2.0。
PhysicsForce:

Particles.RandomVector:这个部分表示粒子的随机向量。它可能是一个在某个范围内随机生成的向量。
Particles.Position - Emitter.InitialPosition:这个部分计算了粒子位置与发射器初始位置之间的向量差。它表示了粒子与发射器之间的距离。
length(Particles.Position - Emitter.InitialPosition):这个部分计算了向量差的长度,即粒子与发射器之间的距离。
(length(Particles.Position - Emitter.InitialPosition)*0.25):这个部分将粒子与发射器之间的距离乘以0.25,得到一个新的值。
Particles.RandomVector * (length(Particles.Position - Emitter.InitialPosition)*0.25):这个表达式将粒子的随机向量与上一步计算得到的新值相乘。
1-Particles.RandomVector * (length(Particles.Position - Emitter.InitialPosition)*0.25):这个部分将结果减去粒子的随机向量。

1-Particles.RandomVector * (length(Particles.Position - Emitter.InitialPosition)*0.25)

 集2

1. Particles.Position.z:这个部分表示粒子位置的z坐标。
2. Emitter.InitialPosition.z - Emitter.ZOffset:这个部分计算了发射器初始位置的z坐标减去一个偏移值,得到一个新的z坐标。
3. Particles.Position.z > Emitter.InitialPosition.z - Emitter.ZOffset:这个部分判断粒子位置的z坐标是否大于发射器初始位置的z坐标减去偏移值。
4. Particles.Position:如果上一步的判断为真,即粒子位置的z坐标大于发射器初始位置的z坐标减去偏移值,就返回粒子的位置。
5. float3(Particles.Position.x, Particles.Position.y, Emitter.InitialPosition.z -Emitter.ZOffset):如果上一步的判断为假,即粒子位置的z坐标不大于发射器初始位置的z坐标减去偏移值,就返回一个新的向量,其中x和y坐标与粒子位置相同,但z坐标为发射器初始位置的z坐标减去偏移值。

Particles.Position.z > Emitter.InitialPosition.z - Emitter.ZOffset ? Particles.Position : float3(Particles.Position.x, Particles.Position.y, Emitter.InitialPosition.z -Emitter.ZOffset)

 2.6 Collision

打开可以看见里面是有3个发射器,第一个就是NS中喷射的大球,第二个是喷射的小球,第三个是在产生碰撞时候生成的小球。

 第一个发射器

生成速度是3.5个每秒。

初始化的生命周期为7秒,大小为14.

按锥形添加速度250-750之间,角度是35°。

圆形,半径为10的范围内生成。

重力在z轴是-980

使用碰撞:相关的系数设置都和其名字一样。

 发送碰撞事件:

碰撞事件之间的延迟是0.05,而粒子速度如果小于100,则无法发送事件。

 最后就是颜色的变化了。

上面和之前的一样,不一样的是通过是否碰撞的bool来决定颜色的值是0还是1.

 第二个发射器

第二个发射器和第一个基本相同,不同的只有初始化时候的大小,以及没有发送碰撞事件。

 第三个发射器:

上面是一样的,3-4秒的生命周期,锥形的添加速度,大小的更新是用了自定义表达式:1.0f-Particles.NormalizedAge。

重力是-980.

这个发射器没有直接生成粒子,而是在事件处理器中进行生成。

生成之后继承了一些相关的碰撞法线之类的。

 3.1 Static Mesh Sampling 

 这个粒子特效使用的是采样到的静态网格体。

 通过外部进行采样,在CPU的时候【笔者是失败的,而有些人可以,笔者也不知道为什么】: 

不过转为GPU模拟即可:

 3.2 Renderer Overrides 

打开NS:

生成速度是1.4每秒。

 在这里我们可以看到是按照圆形进行生成的,不过,如果将下方的集关闭,那么只有mesh是按照圆形生成的,而Sprite不是,原因也很简单,在集和渲染器那里。

 

 Vortex Force和drag都是力的使用,就不多说了。

看看这个集:RenderOffset,这是一个创建的变量,属性为位置。

可以看到是粒子的位置+z轴的20,即mesh所在的位置+z轴20.

可是就这样,它是如何把这个粒子的位置传递的呢? 

在Sprite渲染器我们可以看见:

它的位置绑定被更改了,改为了我们计算的RenderOffset。 

 

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

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

相关文章

VS2022解决Protobuf compiler version 23.4 doesn‘t match library version 4.23.4

在使用Visual Studio 2022MinGWCMake作为开发环境时&#xff0c;如果项目中使用了Protobuf&#xff0c;则在CMake运行时&#xff0c;可能会出现Protobuf compiler version 23.4 doesnt match library version 4.23.4的问题&#xff1a; 1> [CMake] CMake Warning at C:/Pro…

一体全栈、开箱即用!麒麟信安与灵雀云携手打造“操作系统+云平台”联合解决方案

近日麒麟信安与北京凌云雀科技有限公司&#xff08;以下简称“灵雀云”&#xff09;开展生态合作&#xff0c;共同完成了灵雀云企业级全栈云原生平台ACPV3与麒麟信安操作系统V3等系列产品的兼容性认证测试。基于双方产品兼容性良好、稳定运行、性能表现卓越&#xff0c;麒麟信安…

书单模板空白图怎么做?分享个简单的方法

在当今数字化时代&#xff0c;越来越多的人开始将书单制作成具有视觉效果的视频&#xff0c;以此来吸引更多的读者。本文将介绍如何制作书单模板的空白图以及一些制作书单视频的方法。 制作书单模板空白图 书单模板空白图是一种用于书单视频制作的基础模板&#xff0c;通过制作…

不负众望~历时4年修炼,这本册子终于成书了(文末赠书)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 精进Spring Boot首选读物 “小册”变“大书”&#xff0c;彻底弄懂Spring Boot 全方位配套资源…

【实战】十一、看板页面及任务组页面开发(三) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十五)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

Docker容器:docker数据管理、镜像的创建及dockerfile案例

文章目录 一、docker数据管理1.为何需要docker数据管理2.数据管理类型3.数据卷4.数据卷容器5.容器的互联 二.docker镜像的三种创建方法1.基于现有镜像创建1.1 启动镜像1.2 生成新镜像 2.基于本地模板创建2.1 OPENVZ 下载模板2.2 导入容器生成镜像 3.基于dockerfile创建3.1 dock…

基于Jenkins构建生产CICD环境、jenkins安装

目录 Jenkins简介 安装配置Jenkins Jenkins简介 Jenkins是一个用Java编写的开源的持续集成工具。在与Oracle发生争执后&#xff0c;项目从Hudson项目独立。官方网站&#xff1a;https://jenkins.io/。 Jenkins提供了软件开发的持续集成服务。它运行在Servlet容器中&#xff…

Web 3.0 安全风险,您需要了解这些内容

随着技术的不断发展&#xff0c;Web 3.0 正在逐渐成为现实&#xff0c;为我们带来了许多新的机遇和挑战。然而&#xff0c;与任何新技术一样&#xff0c;Web 3.0 也伴随着一系列安全风险&#xff0c;这些风险需要被认真对待。在这篇文章中&#xff0c;我们将探讨一些与Web 3.0 …

【excel密码】如何禁止移动、删除excel工作表?

想要工作表不被他人移动、删除等操作&#xff0c;该如何设置&#xff1f;今天分享如何设置才能够禁止excel工作表移动、删除。 打开excel工作表&#xff0c;点击工具栏中的审阅 – 保护工作簿 点击保护工作簿之后&#xff0c;会有弹框出现&#xff0c;输入想要设置的excel密码…

新的后端渲染:服务器驱动UI

通过API发送UI是一种彻底的新方法&#xff0c;将改变传统的UI开发。 一项正在改变我们对用户界面 (UI) 的看法的技术是通过 API 发送 UI&#xff0c;也称为服务器驱动UI。这种方法提供了新水平的活力和灵活性&#xff0c;正在改变 UI 开发的传统范例。 服务器驱动 UI 不仅仅是…

Web 事务管理

Web在执行的过程中需要保证一致性&#xff0c;从而需要引入事务来对SQL事件进行事务的管理。具体而言可以参考这篇博客MySQL事务(transaction)。 具体而言&#xff0c;我们获得一个这样的需求&#xff0c;删除一个部门&#xff0c;在删除部门的过程中需要删除部门下的所有员工…

无人机航管应答机 ping200XR

产品概述 ping200XR是一个完整的系统&#xff0c;旨在满足航管应答器和自动相关监视广播(ADS-B)的要求&#xff0c;在管制空域操作无人航空系统(UAS)。该系统完全可配置为模式A&#xff0c;模式C&#xff0c;模式S转发器和扩展ADS-B发射机的任何组合。ping200XR包括一个精度超…

几个Web自动化测试框架的比较:Cypress、Selenium和Playwright

介绍&#xff1a;Web自动化测试框架对于确保Web应用程序的质量和可靠性至关重要。它们帮助开发人员和测试人员自动执行重复性任务&#xff0c;跨多个浏览器和平台执行测试&#xff0c;并在开发早期发现问题。 以下仅代表作者观点&#xff1a; 本文探讨来3种流行的Web自动化测…

怎么把视频转换成mp4格式?分享几种视频格式转换方法

将视频格式转换成MP4格式的好处包括&#xff1a;更广泛的兼容性&#xff0c;因为MP4是一种通用格式&#xff0c;大多数设备和平台都支持&#xff1b;更小的文件大小&#xff0c;因为MP4使用高效的压缩算法&#xff0c;可以将视频文件压缩到更小的大小&#xff1b;更好的视频质量…

Linux常用命令——diff3命令

在线Linux命令查询工具 diff3 比较3个文件不同的地方 补充说明 diff3命令用于比较3个文件&#xff0c;将3个文件的不同的地方显示到标准输出。 语法 diff3(选项)(参数)选项 -a&#xff1a;把所有的文件都当做文本文件按照行为单位进行比较&#xff0c;即给定的文件不是文…

element-ui中二次封装一个带select的form组件

带select的form组件 样式 代码 <template><el-form-item label"是否有" class"append" prop"tag"><el-form-itemprop"isShare"><el-select v-model"query.tag"><el-option v-for"(item, …

Shell编程基础02

0目录 1.case语法 2.grep 3.sed 4.awk 5.linux安装mysql 1.case语法 创建一个txt文档 执行 查询用户名 case 用法 写一个计算器脚本 加入函数 补充查看进程命名 2.find grep命令 Find 查询当前目录下 以sh结尾的文件 Grep 查询义开头的 或者加入正则表达…

AIGC 施展“物理魔法”,3D视觉突破“精度极限”

点击关注 文&#xff5c;姚悦&#xff0c;编&#xff5c;王一粟 “没有艺术&#xff0c;全是物理&#xff01;物理让你快乐&#xff0c;不是吗&#xff1f;” 近日&#xff0c;在世界计算机图形会议 SIGGRAPH 2023 上&#xff0c;英伟达创始人、CEO 黄仁勋宣布&#xff0c;将…

小型便携式气象站的功能特点

小型便携式气象站是一种&#xff0c;集多种传感器和自动化功能于一体的气象观测设备&#xff0c;具有便携性和自动化的特点。能够自动测量和记录各项气象参数&#xff0c;为人们提供实时气象数据。 小型便携式气象站的功能特点如下&#xff1a; 1.小型便携式气象站轻便便携&a…

秒懂算法│博弈论

博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论。博弈论是研究互动决策的理论。博弈可以分析自己与对手的利弊关系,从而确立自己在博弈中的优势,因此有不少博弈理论,可以帮助对弈者分析局势,从而采取相应策略,最终达到取胜的目的。…