【转载】基于 Niagara 排列 Mesh (一维/二维/三维)

303 阅读2分钟

原文链接:《04.排列 Mesh (一维/二维/三维)》 | 作者:帆起

正文

简单梳理下使用模块进行物体的规律排序. 这里先讨论下矩形位置分布.

准备工作

引擎版本: 4.21

新建一个 Emmitter ,渲染器改成 Mesh.发射改成 Burst, 生命周期长点.

如下, 其他的速度颜色模块都可以删掉.

image.png

首先是一维排列模块逻辑

image.png

实现一维排列只需要 距离间隔*生成序号 , 即可求得每个粒子所应该在的位置.

然后看看是二维排列模块逻辑

如果有过编程经验, 二维阵列, 最快速的方法嵌套一层循环即可实现。但是 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 下面可以看到位置和序号

image.png

  • 二维排列模块逻辑

image.png

接下来是三维排列模块逻辑

三维矩阵其实很简单,把前面 x 和 y 的值乘起来, 获得得值就是每一层的总数. 然后用序号除以这个总数然后向下取整即可获得 z 值的.例如 5X5X5 的矩阵, 序号 80 粒子的 z 值位置为 80/25 向下取整为 3 .

image.png

但是直接这样做虽然 z 值对了,但是由于 y 轴没有取模, 会是这样的排列

这是因为 y 值还是按照 index/x 取整得值

所以 y 需要再取一次模才行.

完整版如下

image.png

将算出来的 y 值与 x 再次取模, 这样 y 值就不会一直往下排列而是每 x 轮回一次 0~x 值.

我的总结:连线乱七八糟,实际就三行代码表示

x' = index % x;
y' = floor(index / x) % x;
z' = floor(index / (x * y));

之后可以给位置加一些随机值,或者是在 update 的时候更新位置.

End;