Niagara Advance-官方用例学习
来自官方的Content Example -> Maps -> Niagara_Advanced_Particles
部分参考:
操作
脚本模块的重命名需要连续三次单击才能重命名
1.1 FillRenderTarget
UE5 Niagara_Render Target 2D笔记 - 知乎 (zhihu.com)
1.1-1.2 Simulation Stage 和 Grid2dCollection - 知乎 (zhihu.com)
整个发射器是下面这个样子,注意常规模拟阶段设置。其中Data Interface(数据接口,是所有中间数据结构的统称),用来从上到下转递数据的中间结构,即存储上一个模块的迭代结果,给下一个模块或者之后使用。
Fill Texture to RenderTarget模块如下:
注意节点内部的引脚连接:
注意修改渲染器的源模式:
系统BUG:每次写完暂存区脚本后,需要关闭整个粒子系统的文件,关之前会提示是否应用,之后再打开才能看见报错信息,并且也会显示暂存区脚本在系统总览的输入选项。
1.2 AdvectGrid
Niagara_Advanced 1.2 Advect Grid 2D Collection_niagara grid2d
1.1-1.2 Simulation Stage 和 Grid2dCollection - 知乎 (zhihu.com)
Grid2D Collection——是一段缓冲区数组,用来作属性的“缓冲”。Render Target 2D可以认为是一个2维的数组,数组内存着的是一个又一个对应位置的颜色数据。Grid2D Collection是它的超集,即Grid2D Collection也是这样一个数组,其内存着的可以是颜色数据,也可以是其他类型数据,这些数据可以供你模拟,变换等,但是如果希望输出(显示),还是得借助Render Target(所以才说Grid2D Collection是数据的缓冲区)。
StackContent——参考【UE4:Niagara的变量与HLSL - 知乎 (zhihu.com)】,说白了这就是个懒人命名空间,各个阶段都能用。当你有一些各层级实体都可能具备的一些属性,不想每个命名空间都分别创建这些同名变量,不想随着算法的迭代去调整到底哪个命名空间应该保留这个变量时,就可以使用StackContext命名空间。
1.1中的流程为:Texture -> RenderTarget2D。
1.2中只是多了一个步骤:Texture -> Grid2DCollection -> RenderTarget2D。
- Fill Grid with Texture阶段将Texture拿到的数据存到Grid2D Collection里,该阶段的常规模拟阶段设置中,Data Interface(数据接口,是所有中间数据结构的统称)必须是所利用的Grid2DCollection,否则StackContent所填充的数据并不是到Grid2DCollection。
- OperateGrid(示例中的Advect Grid阶段)对Grid里的数据做一些运算从而获得流动的效果。
- Fill Render Target with Grid阶段将Grid2D Collection里的数据写入Render Target里以最终显示出来。
问题与解决
UE 5.1中找不到对Grid2D Collection的num cell设置,网上的方案在5.1里也找不到:Grid2d collection no cellnums setting shown in ue5 niagara - Asset Creation / FX - Epic Developer Community Forums (unrealengine.com)
下面是官方用例的Grid2D Collection预览效果
我通过那个论坛提问了一下,果然回复我了,其实就是要下载插件:
然后在Emitter Update中添加模块,取消勾选”Only Library“就能搜到。
1.6 Distance Field Traversal
Niagara Advance 笔记 - 知乎 (zhihu.com)
1.6 Distance Field Traversal (一) - 知乎 (zhihu.com)
3.1 Color Copy by Cell
- UE5.1 Niagara Advance 案例理解分析 3.1 - 知乎 (zhihu.com)
- 3.1 Neighbor Grid 3D - 知乎 (zhihu.com)
- Spatial Hashing in Unreal’s Niagara with Neighbor Grid 3D – AliCormack
- UE4:Niagara中的Ribbon - 知乎 (zhihu.com)
- Niagara Neighbor Grid 3D 相关节点的解读 和原理(一) - 知乎 (zhihu.com)
整体效果与思路:利用neighbor grid3D实现粒子快速查询,使得大粒子在生成之后填入neighbor grid3D,之后生成的小粒子通过当前所在位置来查询neighbor grid3D存储的最近的大粒子索引,从而获得其颜色。
Neighbir Grid是先将空间划分为NNN个子空间(Cell)。其中:每个子空间有”Max Neighbor Per Cell“个单位存储一个Int数据(通常用于记录粒子Index),表示每个子空间所能存储信息的最大数量。
在Grid中并没有存储任何粒子的属性信息,,而只是用来“加速”的,最终他起到的作用就能够通过:粒子位置-在网格中的索引(NeighborIndex)-粒子的索引(Index)产生联系,给出从属粒子位置就能得到leader粒子的另外两个索引,而Attribute Reader正是通过粒子的Index读取粒子属性的,这样就能通过空间划分的方式来快速查找粒子进行属性相关计算。
下面解析实现方法:
- 整体的发射器由三部分构成:
- Visualize_Grid3D:neighbor grid 3D的条带渲染可视化
- GridWrite:neighbor grid 3D的信息写入,负责生成大粒子并写入neighbor grid 3D
- GridRead:负责生成小粒子并查询neighbor grid 3D来改变颜色
- FillNeighborGrid3D模块中的hlsl代码
1 |
|
- FindClosestNeighbor模块的hlsl代码
1 |
|
3.6 Position Based Dynamics
(待完善)
3.9 Boids
【Unreal从0到1】【第九章:粒子系统与物理引擎】9.4,Boid群集算法浅析 - 知乎 (zhihu.com)
集群行为模型-Boids
Flocks, herds and schools: A distributed behavioral model - Google 学术搜索
克雷格的Boids模型正是以“自下而上的控制”为核心,提出了一个在二维或三维空间上模拟集群行为的模型,该模型要求集群的个体遵守三条基本原则:
分离(seperation)
与邻域内的集群个体避免碰撞。对于一个集群个体来言,每一个在其邻域范围内的集群个体与它之间都有一个排斥力,这个排斥力是与它们之间的距离成反比的。每一个集群个体所受到的排斥力是它邻域范围内其它集群个体对它的排斥力的累加。
聚合(cohesion)
与邻域内的集群个体保持紧凑。集群个体需要获得其邻域内其它集群个体的位置信息,并计算出邻域内集群个体位置的平均值,由此产生一个作用于该邻域内所有集群个体的吸引力
对齐(alignment)
与邻域内的集群个体速度保持一致。为了能够实现速度一致,每个集群个体需要获得邻域内其它集群个体速度信息,计算出邻域内集群个体的平均速度。通过速度对齐,可以使得集群个体速度大小和方向与这个邻域内所有集群个体速度的平均值保持一致。
特化-鱼群模拟
The simulation of the movement of fish schools - ScienceDirect
模拟的基本假设是: (1)鱼的运动只受其最近邻的位置和方向的影响。(2)在考虑随机影响的情况下,利用概率分布计算每条鱼(经过一个时间步后)的新速度和转向角。(3)每条模型鱼的运动都基于相同的行为模式,即模型鱼群在没有领导者的情况下游动。
基本的行为模式是吸引、排斥和平行取向。我们的调查表明,鱼类如何混合其邻居的影响是非常重要的。如果一条鱼对其邻近鱼群的影响取平均值,则模型鱼群表现出真实鱼群的典型特征: 强凝聚力和高极化程度。如果一条鱼只对一个邻居作出反应,那么这个模型就创建了一个混乱的鱼群。
Boid Force模块:
1 |
|
注意:Transient
类型的变量仅在给定的堆栈上下文(例如Particle Update)中是局部的,并且每帧从头开始重新计算,它们的值不会从一帧持续到另一帧。这使得它们与Particle不同。这些变量保存在粒子有效载荷中,并从一帧到另一帧持续存在,这是以内存和性能为代价的。大致意思应该是保存从上一帧到这一帧的数据,具体还不太理解。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!