Niagara内容示例 2.5 Expressions

在这里插入图片描述

粒子效果

粒子有多种不同的颜色,以某种规律在上下起伏,可以看出受到了某种类似潮汐力的作用。充满了很多的随机性。

Niagara蓝图部分

我最讨厌的蓝图来了…各种参数传递与计算,却没有很明确的过程说明,简直就像是中学时候写理科题目只摆公式和结果,完全不写推导过程,或者是现在的只码代码,不写注释的一些同事们。不过对这个例子,我还是会仔细得将中间的过程分析出来,以便看清它里面到底发生了什么。

在这里插入图片描述

效果实现分析

下面就是数学课了:

在Emitter下新建两个新属性:InitialPosition和ZOffset。InitialPosition获取Simulation Position即粒子系统的位置。ZOffset公式:
sin ⁡ ( E m i t t e r . A g e ) ∗ 56 \sin(Emitter.Age)*56 sin(Emitter.Age)56
大概可以得到一个从-56到56之间的值,当然具体还是取决于Emitter.Age。

在这里插入图片描述

那么Emitter.Age到底是什么呢?它的值一般都是0到10。简单来说,可以直接在Timeline上找到。如图,当前帧在2.23s,它即是当前的Emitter.Age,最大和最小分别是10s和0。

在这里插入图片描述

进入Particle Spawn,又迎来了茫茫多的公式,我们一个一个看。

新建属性: RandomVector ,即获取一个随机的单位向量的方法。
n o r m a l i z e ( ( ( ( r a n d ( f l o a t 3 ( 1.0 , 1.0 , 1.0 ) ) ) ) ∗ 2 ) − 1 ) normalize(((( rand(float3(1.0,1.0,1.0) ))) * 2 ) -1 ) normalize((((rand(float3(1.0,1.0,1.0))))2)1)
已有粒子属性: Lifetime,2.2到3.7的随机数
r a n d ( 1.5 f ) + 2.2 f rand(1.5f) + 2.2f rand(1.5f)+2.2f
​ Position,位于以初始位置为圆心,半径为145的球体内,随机一点
E m i t t e r . I n i t i a l P o s i t i o n + P a r t i c l e s . R a n d o m V e c t o r ∗ r a n d ( 145.0 f ) Emitter.InitialPosition + Particles.RandomVector *rand(145.0f) Emitter.InitialPosition+Particles.RandomVectorrand(145.0f)
​ SpriteRotation,0到360度的随机
r a n d ( 1.0 f ) ∗ 360 rand(1.0f)*360 rand(1.0f)360
​ SpriteSize,边长为0.5到3之间的正方形
v e c 2 ( r a n d ( 2.5 f ) + 0.5 f ) vec2(rand(2.5f) + 0.5f) vec2(rand(2.5f)+0.5f)
​ Velocity,第一行其实就是生成随机向上或者是向下的速度,加上第二行的粒子相对初始位置的方向向量放大20倍,相对于是增加了两个维度的运动。
$$
cross(Particles.RandomVector, float3(0,8,0)) * (float3(0.0f, 0.0f, Emitter.ZOffset) *0.2f) \

  • (-1.0f * normalize(Emitter.InitialPosition - Particles.Position)*20)
    $$
    在这里插入图片描述

Particle Update部分

Color,当粒子在前三分之一生命时,颜色为(1,0.1,0.1,1),即红色;之后在1/3到0.575之间时,黄色;其余为蓝色。
P a r t i c l e s . N o r m a l i z e d A g e < 0.333 ? f l o a t 4 ( 1 , 0.1 , 0.1 , 1 ) : P a r t i c l e s . N o r m a l i z e d A g e < 0.575 ? f l o a t 4 ( 0.1 , 1 , 0.1 , 1 ) : f l o a t 4 ( 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) 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轴上的波动性
P a r t i c l e s . P o s i t i o n + f l o a t 3 ( 0 , 0 , ( s i n ( E n g i n e . T i m e ) ∗ 0.3 f ) ) Particles.Position + float3(0, 0, ( sin(Engine.Time) * 0.3f )) Particles.Position+float3(0,0,(sin(Engine.Time)0.3f))
SpriteSize,如图在原有粒子大小的基础上,随着生命的流逝,大小缩放先曾后减。
P a r t i c l e . I n i t i a l . S p r i t e S i z e ∗ ( 1.0 f − a b s ( P a r t i c l e s . N o r m a l i z e d A g e ∗ 2.0 f − 1.0 f ) ) ∗ 2.0 f Particle.Initial.SpriteSize * (1.0f - abs(Particles.NormalizedAge * 2.0f -1.0f)) * 2.0f Particle.Initial.SpriteSize(1.0fabs(Particles.NormalizedAge2.0f1.0f))2.0f
在这里插入图片描述

PhysicsForce,给与粒子上一点点随机方向的力,大小和粒子距离原点位置的大小有关。
1 − P a r t i c l e s . R a n d o m V e c t o r ∗ ( l e n g t h ( P a r t i c l e s . P o s i t i o n − E m i t t e r . I n i t i a l P o s i t i o n ) ∗ 0.25 ) 1-Particles.RandomVector * (length(Particles.Position - Emitter.InitialPosition)*0.25) 1Particles.RandomVector(length(Particles.PositionEmitter.InitialPosition)0.25)
Position,最后又在位置上做了一点限制,即对于z值小于原点位置大小和ZOffset的差值的那些粒子,需要将他们的z值调整为这个差值的大小。
P a r t i c l e s . P o s i t i o n . z > E m i t t e r . I n i t i a l P o s i t i o n . z − E m i t t e r . Z O f f s e t ? P a r t i c l e s . P o s i t i o n : f l o a t 3 ( P a r t i c l e s . P o s i t i o n . x , P a r t i c l e s . P o s i t i o n . y , E m i t t e r . I n i t i a l P o s i t i o n . z − E m i t t e r . Z O f f s e t ) Particles.Position.z > Emitter.InitialPosition.z - Emitter.ZOffset ? \\Particles.Position : \\float3(Particles.Position.x, Particles.Position.y, \\Emitter.InitialPosition.z -Emitter.ZOffset) Particles.Position.z>Emitter.InitialPosition.zEmitter.ZOffset?Particles.Position:float3(Particles.Position.x,Particles.Position.y,Emitter.InitialPosition.zEmitter.ZOffset)

在这里插入图片描述

总结

这些Expressions也就是HLSL的代码片段,在某些情况下可以很快的帮我们达到某种效果,但是其缺点就是当大量使用时很容易导致混乱,其实就是当我们在编辑器内编写代码而不加注释的感觉。可能在马上要出的虚幻5中会有专门的脚本语言来进行编程,我们拭目以待。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Claude的羽毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值