粒子效果
从向着一个方向生成条带,条带沿着某个轴在旋转,类似于舞蹈演员表演的条带舞。
Niagara蓝图部分
蓝图中文字介绍少了很多…不过起码说清了一件事,就是Ribbon Renderer条带渲染器不支持GPU,只能在CPU粒子的情况下运行。从结构上来看,和之前的Static Beam也没有太大差别(实际上是有的,主要体现在Update Beam,后面会分析到),可见“动态”二字更多的是反映到了参数的获取和传递上。
效果实现分析
首先来看看Beam Emitter Setup。之前没有细看,遗漏了一个重要的布尔值——Absolute Beam Start,字面上好像啥都看不出来,让我们去看看代码里是什么。双击模块进入Niagara Module Script。
这里截取我们要讨论的那部分。可见布尔值为true时,直接使用我们之前定的Beam Start位置,否则的话会进行一个本地空间到Simulation空间(可以简单理解为世界空间)的转换。
上面Beam End位置的值那么大是因为本次模拟使用的不是本地空间。
随后就是Beam Start Tangent和End Tangent,都是定义为x轴(Niagara System)(图中红色轴),然后用一个float量来调控其曲率。
终于到了Particle Spawn阶段,注意到这里使用了Initialize Ribbon来做初始化,其效果等同于Initialize Particle + Beam Width,即既定义Lifetime又定义了Ribbon的宽度。
Particle Update里,首当其冲的就是Update Beam。有了它,我们每帧可以去读BeamStart、BeamEnd等一系列参数的数据,并实时调整到条带上。否则话,当我们实时修改这些数据时,是相当于立马重新生成一条条带,而不是在已有条带上进行调整。
实时调整粒子位置——Rotate Around Point。主要作用就是读粒子的位置,然后再写入。
Rotation Phase来调控旋转的量,Rotation Rate则是旋转的方向和速率。在Setup里,可以进一步配置旋转的属性(Radius旋转半径,Rotation Center旋转中心,X Axis和Y Axis定义旋转所在的那个平面等等),其中Radius内部现在填写的不是一个不同的参数,而是一个HLSL代码片段(公式):
(1.0f-(abs((Particles.RibbonLinkOrder)-0.5f)*2.0f))*50.0f
不够直观,绘制成图像。可见,希望的效果是中间偏移大,两端偏移值小的效果。
OK,分析完成,其他剩余的就是之前就见过的模块,颜色,力和速度的解算器等等。
总结
本例的难度明显增加,技术点的密度明显增加,比如:HLSL表达式,本地空间,世界空间,Niagara模块脚本,帧更新数据的更新等等,其中尤其以几个空间的转换最容易把人绕晕。需要读者有比较好的数学和图像学功底。我在看本例的时候也花费了比前面几例更多的时间,相对来说思考得更为细致,目的是希望能够把东西想得更加透彻,解释得更加明白。