正文
简单梳理下使用模块进行物体的规律排序. 这里先讨论下矩形位置分布.
准备工作
引擎版本: 4.21
新建一个 Emmitter ,渲染器改成 Mesh.发射改成 Burst, 生命周期长点.
如下, 其他的速度颜色模块都可以删掉.
首先是一维排列模块逻辑
实现一维排列只需要 距离间隔*生成序号 , 即可求得每个粒子所应该在的位置.
然后看看是二维排列模块逻辑
如果有过编程经验, 二维阵列, 最快速的方法嵌套一层循环即可实现。但是 Niagara 模块里面没有直接的 for 循环节点。还有另外一种办法实现二维排列,那就是 取模(取余) 运算。
我们假设要排列一个 5X8 的二维阵列(x,y),我们可以让 序号%5 作为 x 值,让 序号/5 的值向下取整作为 y 值。例如序号为 28 的粒子,28%5=3, 28/5=5.6 ,再向下取整为 5, 那么序号为 28 的粒子的位置为 (3,5);序号为 39 的例子,39%5=4, 39/5 向下取整为 7 , 位置为 (4,7)
- 排列效果, 可以打开数据显示, 在 windows 下面可以看到位置和序号
- 二维排列模块逻辑
接下来是三维排列模块逻辑
三维矩阵其实很简单,把前面 x 和 y 的值乘起来, 获得得值就是每一层的总数. 然后用序号除以这个总数然后向下取整即可获得 z 值的.例如 5X5X5 的矩阵, 序号 80 粒子的 z 值位置为 80/25 向下取整为 3 .
但是直接这样做虽然 z 值对了,但是由于 y 轴没有取模, 会是这样的排列
这是因为 y 值还是按照 index/x 取整得值
所以 y 需要再取一次模才行.
完整版如下
将算出来的 y 值与 x 再次取模, 这样 y 值就不会一直往下排列而是每 x 轮回一次 0~x 值.
我的总结:连线乱七八糟,实际就三行代码表示
x' = index % x; y' = floor(index / x) % x; z' = floor(index / (x * y));
之后可以给位置加一些随机值,或者是在 update 的时候更新位置.
End;