Skip to main content

这个小效果是上课时老师讲的,当时没能跟着听下来,回头又看了下课程录屏才算是差不多弄懂了。

因为只是一个小效果,所以还是以技术实现为主,美感其次。我会把这个工程上传到百度云供下载,最好的方式是边看着工程边看笔记。

开始吧!

首先呢,就是要给模型进行破碎。因为到现在为止还只是刚接触了一天多的粒子,所以破碎这个部分就暂且不细调整,先破碎开就好。

破碎使用的是VoronoiFracture,左边输入点连接要破碎的模型,右边输入点连接用来破碎的点,通常是模型上直接撒点。不过这里我为了能让撒点的范围有疏密变化,使用wrangle写了一个density属性,然后在scatter中通过density属性来控制模型表面上的撒点疏密。有一些效果,但是不知道是不是因为撒的点太多,效果不是很明显。

这里撒点不需要创建内表面,也就是需要取消勾选破碎节点上的Create Interior Surfaces。这里破碎完按经验来说应该先做一个file cache缓存出去,但是我这里只是简单做了下效果,也为了其他人打开工程不会因为缓存丢失报错,所以就没有加。

接下来就是一个rest节点,其实本意是用来做材质上的一些效果添加的,因为这次没有涉及材质,所以就先忽略不计吧。

然后就需要把破碎的点pack打包一下,这里用的assemble进行打包。可以查看seemble节点的信息,所有的面按着piece属性进行打包,piece号相同的面就会都被视为一个点。

后面我们通过以这些点发射粒子,再返回来用粒子形态来copy每一个面,就完成了物体表面粒子消散的效果。

下面又使用wrangle定义了variant属性,这个属性是为了最后copy to point来使用的,默认情况下,每个点都会copy一个完整的模型,但是当点有了variant的属性时,每个点都只会copy跟自己variant属性数值相同的面。注意这里所说的点,已经是打包后的点,每个点都代表了一个破碎后的碎块了。

再接下来左边的wrangle定义了@P=0,这样每个破碎的面位置都会归于原点,而当使用copy to point的时候,破碎面的位置会继承点的位置。所以这里归零,类似于将一个子位移归零。当然距离使用copy to point后还有很多的操作要做。

右边的add则是将面去掉,只保留点,方便后面进行粒子pop操作。

右边这里是一个常规的颜色传递效果,后面我们用这个颜色的变化来筛选出哪些点需要发射粒子。

这个常规搭配的核心在于solver节点,理论上也很简单。

这里的input2是红色的小球,Prev_Frame是模型的上一帧状态。

使用上一帧状态的数据,让小球的红色属性进行传递。此时我们虽然使用了上一帧的数据,但是这个节点还是作用于当前帧的。也就是说根据模型上一帧的颜色情况进行了传递,传递的区域作用于当前帧。

然后删除非红色的区域,那么此时剩下的就是当前帧被传递的红色区域了。

然后使用当前帧传递的红色区域,再去传递一次上一帧状态的模型。那么上一帧如果区域已经是红色的了,就会再向外传递一圈。

进入到第二帧的时候,刚刚传递的效果就已经变成了上一帧的效果。如此循环,就实现了颜色自我传递的效果。

出来后再进行一次颜色传递,是为了让刚刚的颜色传递动画传递给刚刚打包好的那几个点。为什么不直接使用打包的点进行solver颜色传递呢?那是因为打包的点毕竟还是太少了,颜色传递不那么准确和容易控制。

接着往下走又左右分了两个wrangle,左边是删除红色点,保留黑色点。右边则相反。那么又使用timeshift节点,相当于取上一帧的点颜色情况,去和现在帧的红色比较,如果一个点上一帧颜色和现在帧的颜色不同,那么就说明,这个点是在这一帧变红的,我们就实现了仅保留当前转变为红色的点,进行粒子发射。

粒子setup也很简单,发射源改为All Points,这样所有当前帧的红色点都会发射一次粒子。这些粒子向上升起变化。我们再把粒子和之前保留的黑色点merge在一起。粒子飘散的效果就实现了。

发现了吗?虽然我们使用了pop进行了粒子dop解算,但是实际上我们打包的点依然一个不少。还是原来的那些点。从表现上来说,就是之前打包的那些点有了一个动态效果。要思考下原因,这个对于实现这个效果还是很关键的。

下面要做的是将之前打包的每个碎片都作为一个copy物体,copy到每个点上。记得我们最早定义了一个variant属性,这里就起作用了。注意查看copytopoints节点上勾选的Piece Attribute参数。

而最右边的粒子则是为了美化完整效果做的,利用当前帧变红的点继续发射更多的粒子,让效果更好看一些。

好,就酱,说完啦,开始玩《黑帝斯》啦!

(完)

One Comment

Leave a Reply