这个GIF动画5M,如果加载慢或者不动的话,可以点击查看大图

这个动画中,粒子本身会有粘体一样的流动效果,粒子之间还能碰撞,还能和外部物体进行碰撞。其实用到了不止CirclePacker的功能,但是也实在是不知道起什么名字了。

首先关于CirclePacker,最典型的样例就是色盲测试图,为了节省图床流量,我就不放图了,可以先去搜一下是什么样子的。

官方给的定义就是,在指定的区域内尽可能多的排列粒子,这些粒子还不会产生穿插。

先用一个简单的例子看一下它是怎么运作的。

首先创建一个xp系统,然后什么也不做,直接添加一个CirclePacker对象,将发射器拖入到对象的Emitter栏中。

就能看到一粒粒大小不一的小球逐渐填充满了这个发射器,并且互相之间没有穿插。

当你把发射器拖入到Emitter栏中的时候,CirclePacker对象会对XP系统自动做出一些改变,这里官方提出了四条:

  • 粒子的速度和速度变化会设置为0
  • 子帧发射会关闭
  • 发射的最大粒子数由Max.Particles参数控制
  • 粒子的显示类型会被设置为12个分段的填充圆环

其中子帧发射如果你用的到的话一定理解什么意思,不理解的话也无所谓,大部分情况下遇不到,而且也不是这篇笔记的主要内容。只是简单提一下,任何粒子系统都会遇到一种问题,就是发射出来的粒子会出现一层层的断层现象,尤其是动画。我们可以开启发射器中的Subframe Emit来矫正这个问题。不过说实话矫正效果一般般,在一些情况下还是会出现。

当然上面提到的四条,其实你也可以随时改变,尤其是发射粒子的控制方式,其实CirclePacker提供了Get Max.Radius From两种模式,默认是this object,改为Particle的话,我们还是可以用发射器来控制粒子的大小。这种方式好的一点是,默认由CirclePacker设置大小的话,粒子只能设置最大值和最小值,粒子的大小是随机在这个范围内变化的。

但是如果使用发射器的粒子大小的话,我们可以通过给发射器添加更多的分组来精确控制我们想要的大小。比如上面的动图中,只用到了一个发射器,但是给这个发射器7个分组,第一个设置粒子大小是30cm,剩下的设置为1cm。这样就出现了上面只有几个大型粒子,其余都是小粒子的效果。不然这些粒子大小只能是平均的设定在1~30cm之间。

那么我们现在有了让粒子这样大小分布的方法,接下来要解决的是粒子的位置分布。这个就好解决了。

只是给了一个平面,然后上一个噪波材质。通过材质的color通道控制粒子发射的位置而已。要注意的是发射模式需要改为Shot模式,不仅仅是因为我们需要粒子一开始就铺满整个平面,还有个原因是粒子一直发射的话,后面的物理碰撞时候会不停的抖动。

那么接一下要解决的就是粒子的物理碰撞问题了。

上面动图中,两个面数比较多的球,最后融成一个球的,是一个球体,加上了xp的碰撞标签,最后通过融球对象变成一个的。因为是多边形,所以对粒子的碰撞只需要通过添加xp碰撞标签就可以。

其余的球,则完全是粒子生成的,他们不仅互相有碰撞,碰撞的时候还会旋转翻滚,而且本身还会像水波一样摆动。

这个首先需要使用xp的PPCollisions来达成粒子之间互相碰撞的效果,而水波摆动,则需要加入湍流让粒子动起来。

加入xpTurbulence修改器的时候,默认的Turbulence模式是standard,但是我们要改为Curl模式,这个模式很有趣,正常的湍流,他只是会让粒子的运动变的随机,但是Curl的模式还会限制粒子的速度。在使用PPCollisions的时候,standard会让粒子之间的碰撞很强烈,直接会被撞飞,而Curl模式则能很好的让粒子之间既有碰撞,还能汇集在一起。但是要记得把Curl影响的Y轴关闭掉,因为我们不想让粒子在上下范围内有运动变化。当然具体什么时候开什么时候关,还得看需要什么效果了。

这个图中,就是典型的Curl效果。

就这样,我们完成了上面动图的效果。要是我有没说清楚的地方,可以在下面留言,共同完善。

(完)

Leave a Reply