下图是一个简单的测试,在球上随即取一个粒子点,然后不断获取周围粒子并直接杀死,产生破裂效果。
如果保留杀死的粒子,那就是一种融化
操作:
1.根据id找出一个粒子
2.使用neighbor函数搜索这个粒子半径内粒子
3.这个半径值设置为全局属性,甚至是从某一个null上来获取,可以方便key帧
4.注意,只有同一个发射器或者发射器之间有关联,才能获取相邻粒子数 Bouns:使用这个属性还会有助于你制作一个合理的温度场。因为这也可以看做是一种定义流体边界的方法。 温度就是从外部像内部传递的。
3.3.3流体边界粒子
如何定义流体外部粒子,这很重要。因为融化就是一个典型的由表及里的过程,如果你定义好流体边界粒子,就可以非常容易做出融化。
真实做流体计算时有标记(Maker)粒子和水平集方法。像naiad中有boundary结点可以直接获取到边界层。
因此如果你要做融化,最关键的就是找好边界粒子。下面主要是realflow中的方法。
粒子法线Normal()
法线概念。就是粒子指向流体外部朝向。
越是流体内部的粒子法线值越小。最外部的比较大。如果能找到合适的法线值,典型的融化效果是很好看的。
它的缺点,就是不好缺点法线值。不同resolution值不一样,不同帧不一样。它应该是一个动态的值。 这需要费一点功夫去测试。
判断粒子的法线值,如果大于一定值就让它转移。这是比较方便也比较真实的一种条件。因为真实的融化就是那种一层层脱落感觉。
但如何在realflow中获取适当的法线值是一件不那么方便的事。
下图是使用默认cross模型,填充粒子。模拟到17帧,并且差不多条件融化到相近效果的 Normal值对比。
我没有找到什么规律,下在只是一些经验值。唯一可以确定的是,只要resolution一样,粒子最大normal值是一样的。所以你确认好一个resolution就不要随意更改了。
Resolution:1 <==> Normal:1.3 (这是测试值) Resolution:5 <==> Normal:0.75(稍微高一点的测试)
Resolution:10 <==> Normal:0.6(大部分效果有这个精度就差不多行了) Resolution:100 <==> Normal:0.28(比较高的精度了,对融化来讲粒子数这么多足够了。再多也没有视觉意义)
Bouns:
为了找出合适的Normal值。我写了一个小脚本,帮助自己就是找出粒子最大法线值,然后乘以0.678。差不多就是所需要的值。
上面脚本功能很简单,就是可以找出合适的Normal值。在测试融化前,只要运行一次就可以了,目的就是为了找出一个值。 当然你也可以利用脚本,自动给filter赋予值。 脚本思路:
1.遍历粒子,获取粒子的normal,然后取模,得到normal法线长度 2.把这个长度加到一个列表中,然后计算出最大的长度。 也就是处理最表面粒子的法线值。
最后我把这个最大值,乘以0.678差不多就是我需要的融化normal值了。 下面脚本,我加了一个null.position条件。这是为了速度考虑,因为只要搜集最表面的粒子就可以了。并不是搜集的粒子越多越好。
maxSample是为了限制列表的长度。同样也是为了计算速度考虑。 注意:最后得到值也只是一个参考数值,具体是多少还是需要自己测试