目标
在《观察Niagara特效系统的核心概念:参数(FNiagaraVariable)》中,我观察了Niagara系统的核心概念:参数。现在我觉得是时候对一些具体的实例进行些学习了。
本篇和《学习Cascade粒子系统:观察内容示例所展示的特性》类似,简单浏览一下Niagara特效范例进行学习。
1.1 Simple Sprite Emitter
主要展示了Sprite(面片)
这种渲染器
其中“粒子大小随声明周期变大变小”的效果,是Scale Sprite Size
模块定义的行为,而其中Scale Factor
使用了动态输入:首先用Vector 2D From Float
将一个float转变为一个2d向量,然后用Sine
指定一个正弦的变化。
然后大小会“乘”上粒子的NormalizedAge(归一化的年龄)
1.2 Simple Mesh Emitter
主要展示了网格
这种渲染器。
1.3 Simple GPU Emitter
展示了GPU
计算粒子
1.4 Sprite Facing
这个例子的重点是控制粒子朝向中心。
Sphere Location
使得粒子在一个球面位置上出生。
接下来,有关“粒子朝向”的逻辑,是通过动态输入脚本对三个参数进行设置来指定的,
翻译成伪代码的话,就类似:
FacingCenter = 系统的中心 - 粒子.Position;
SpriteFacing = Rotate(FacingCenter,(60.0,60.0,60.0));
SpriteFacing = Lerp(FacingCenter,SpriteFacing,发射器.SineWave);
其中FacingCenter
是一个临时的参数,相当于是编程时处于一个局部作用域的变量。而SpriteFacing
负责决定最终粒子的朝向。
留意:最终是根据发射器.SineWave
进行插值的。如果对此改变,比如改为0,就会使朝向都变为FacingCenter
:
改为1,就会使朝向都变为FacingCenter
旋转(60.0,60.0,60.0)
的值:
1.5 Blend Attribute by Value
这个例子重点达成的效果是:粒子会根据距离进行属性的变化,比如“颜色”:
根据NormalizedDistanceFromCenter
对红色和蓝色进行插值。
2.1 Static Beams
展示了条带渲染器
。不过要注意条带需要的模块:
2.2 Dynamic Beams
相比上一个例子,起点、末点、切线 都在每一帧发生变化。
这是通过Rotate Around Point
模块和Update Beam
模块作用的:
2.3 Multiple Renderers
这个例子意思是:同一种数据可以驱动多种renderer,比如这个例子中一个粒子点的数据就驱动了:sprite渲染器
、网格渲染器
、条带渲染器
。
2.4 Location Events
这个例子分为三个发射器:
第一个发射器是一个大的白色粒子,负责引导后面两个发射器:条带渲染器的发射器;以及在周围小的白色粒子。
Generate Locations Event
将大的白色粒子的位置写入事件。
随后被后两个发射器接收。
2.5 Expressions
在这个例子中没有使用模块,而是使用表达式来控制粒子的行为:
2.6 Collision
这个例子展示了“碰撞的功能”。
对于CPU发射器,“碰撞”可以进行射线检测:
对于GPU发射器,“碰撞”可以通过“深度缓冲”或者“距离场”进行判断:
在这个例子中有三个发射器:
- 第【1】个发射器是大的白色粒子。在碰撞时会改变自己的颜色,另外也会生成事件。
- 第【2】个发射器是小的蓝色粒子。在碰撞时会停止(因为
Bounce(反弹)
的restitution(补偿参数)
设为了0) - 第【3】个发射器是小的橙色粒子。接收【1】号发射器生成的事件,在事件发生时生成粒子。
3.1 Static Mesh Sampling
这个例子展示了从模型上采样信息的功能。
主要是使用了Sample Static Mesh
这个模块:
而他会向用户空间
加入一个StaticMeshSampler
的参数,可以在界面中看到:
在其中可以设置:Actor是哪个,StaticMesh是哪个。
而Sample Static Mesh
这个模块则最终向自己的模块空间
(即SAMPLE STATIC MESH 空间
)加入如下的参数:
不过最终的位置、朝向、颜色,还做了些逻辑:
在最开始算一个球形的位置与方向,
然后以ClampedSineWave
作为系数,对:位置、法线、颜色 这三者进行插值:
3.2 Renderer Overrides
正如在《观察Niagara特效系统的核心概念:参数(FNiagaraVariable)》所讨论那样,“参数”的最终去向是喂给了renderer。例如对于Sprite(面片)
这种渲染器,默认状态下将使用这些参数:
然而这些参数的绑定是可以改变的。而这个例子所展示的就是这个功能:
“位置”原先被绑定为Particles.Position
,现在被改变为了Particles.RenderOffset
。而它是个新创建的参数,也有自己的更新逻辑(见上图)。
3.3 Skeletal Mesh Reproduction
虽然看起来像一个骨骼模型,不过仔细观察会发现其实是由多个密集的面片粒子组成的。而粒子的材质是模型的材质(光照模型为“Surface”,着色模型是“默认光照”):
“重建”这个骨骼模型,需要Initialize_MeshReproductionSprite
模块,和Update_MeshReproductionSprite
模块:
不同于静态模型,骨骼模型还需要每帧更新,因为它需要变化。
在Update_MeshReproductionSprite
模块中,这些参数被更新:
至于角色看起来被一个接近的粒子所变为“橙色的高光并离开角色表面”,则和第【2】个放射器有关:
具体来说:
- 第【2】个发射器的粒子将会生成一个“位置事件”
- 在第【1】个发射器接收这个“位置事件”,随后在
AccumulateNearbyParticleInfluences
模块中联系上InfluencerVelocity
这个参数。 - 然后在第【1】个发射器时,使用
InfluencerVelocity
这个参数作为系数,来在“模型表面的位置及状态”与“离开模型表面的位置及状态”之间插值。
3.4 Texture Sampling
这个采样贴图的功能是通过Sample Texture
模块实现的
在这个模块中采样了贴图的颜色放到了SampledColor
这个参数中。
随后生成粒子时将以此为颜色:
注意,在方格之内却在“UE4标志”这个图形之外的粒子并不是没有生成,而是由于颜色是全透明,所以看不到。
之后待讨论的问题
这一篇实际上只是从流程上分析每个例子使用什么样的功能达成效果,也没有自己从零重建一个相同的效果来确认自己分析的是正确的,因此很可能有疏漏之处,以后有机会待仔细确认。
另外,这一篇也没有讨论特别细。模块脚本中的很多节点还并没有确认实际功能,待研究。