Skip to main content

如果sactter的物体发生了形变,那么scatter的点每帧也会发生变化。那么如何固定住scatter的点呢?

对于拓扑结构不会变的点,也就是模型不会增加减少面的情况,官方文档给出的方式是这样的:

需要在scatter的output attribute面板中勾选Prim Num Attribute和Prim UVW Attribute。先不管具体的原理是什么,这个方式其实很不好用。首先scatter一定要关掉Relax Iterations,不然还是每一帧会跳。但是即便关掉了,在crag挥动锤子的时候,点也会发生变化。

所以需要用另一种方式。

在这套节点中,timeshift要设定为1,使一个动态的模型固定在一帧,然后进行撒点。

最后将撒的点连进pointwrangle的第一个输入点,将固定住的模型连入第二个输入点,将动态模型连入第三个输入点。

pointwrangle的代码如下:

[/crayon]

xyzdist函数不需要赋值,它会返回prim和uv两个变量的值,所以我们要先定义两个空的内置变量prim和uv,用来承接返回的值。xyzdist的作用是在1号输入端中找到离0号输入端最近的那个点,并且返回那个点的primnum和uv值。

那么在这里就是寻找在固定模型上离scatter的点最近的那个点了。因为固定模型和动态模型的本身是一个模型,所以它的primnum和uv也是一样的。

我们就可以利用primuv函数,根据primnum和uv去寻找动态模型上的点,并将点的位置赋予scatter出来的点,这样scatter的点就会一直定住不动了,因为模型的拓扑结构和uv是固定不变的。即便scatter开启了Relax Iterations也一样。这很重要,因为有的时候我们就是希望撒点的位置是均匀一些的。

那么对于拓扑结构改变的物体又应该如何保持scatter的点不变呢?官方也给了一个解决办法:

将Generate模式改为In Texture Space。那么scatter将会在一个单位长度的二维方块内进行撒点,然后三维模型从这个二维方块内找寻点附着上去。因此只要模型的uv坐标不发生变化,撒点就会一直保持一致。

但是在一些情况下,也会发生错误,尤其是uv比较复杂,或者点正好在uv的边界的时候。

这个模式下,Density Scale用来控制撒点的数量。

(完)

Leave a Reply