首页 百科知识 用MAYA粒子特效实现粒子逐渐增大效果

用MAYA粒子特效实现粒子逐渐增大效果

时间:2024-10-05 百科知识 版权反馈
【摘要】:第二句则是实现粒子逐渐增大的效果的语句,使用了linstep()函数,这个函数永远返回一个范围在0~1的数值。然后将粒子的属性SurfaceSha

用MAYA粒子特效实现粒子逐渐增大效果

第三节 粒 子 云

Cloud粒子的名称是:“云”,那么自然是做云使用的,那么这一节就来试着制作通常大片中都会出现的空中乌云环绕某一个建筑物的效果。

当然了,首先是在场景里面创建一个简单的锥体来代表一个建筑物(本来是想做一个东方明珠的,但是太麻烦了,就用这个代替了:-),接着制作一个Nurbs的圆圈:

这个圆圈是用来发射粒子的,也就是乌云的发射器,所以我们为这个线圈制作动画:在第0帧的时候很小,在200帧的时候变得很大:

我们希望制作这个乌云的整个产生的过程。

整个乌云的产生过程是:在锥形的顶端产生,并且逐渐变大(圆形),变大的同时还在不停的旋转、翻滚。

所以接下来就是先让这个线圈发射粒子,只有粒子出现了才有作下去的必要。

选中线圈,是用菜单命令Particles→EmitFromObject:

这样一个粒子组成的圆圈就会从小到大的在圆锥的顶部形成了:

粒子的基本形态已经出来了,接下来就是开始制作粒子云雾效果了。

首先当然是把粒子的渲染属性变成Cloud类型的:

接下来开始控制粒子的形态,首先当然是粒子的大小:我们希望粒子出现的时候小一点,然后逐渐的变大,并且最终每一个粒子是不一样大小的。

为了达到这个目的,当然是要控制粒子的RadiusPP属性了,所以先为粒子添加RadiusPP属性:

要产生逐渐增大的效果两种很多种方法:使用Ramp控制RadiusPP属性;使用表达式控制RadiusPP属性。

在这里使用Ramp控制RadiusPP属性并不合适,因为最终我们希望粒子的大小是不一样的,并且希望粒子变大的速度也是不一样的,所以只有使用表达式了。由于变大的速度不一样和粒子最终的大小都不一样,所以为粒子增加了两个自定义的属性分别是:scalePP(控制粒子变大的速度);diferent_radiuPP(控制粒子最终的大小)。

添加好了两个粒子属性以后就是使用表达式控制radiusPP属性的变化了:

首先在Creation表达式里面我们添加以下代码:

particleShape1.scalePP=rand(0.1,0.5);//设置每一个粒子产生的时候scalePP的值

particleShape1.radiusPP=0;//设置每一个粒子产生的时候radiusPP的值

particleShape1.diferent_radiuPP=rand(0,.5);//设置每一个粒子产生的时候diferent_radiuPP的值

这些代码很简单,就是将这三个属性进行初始化值。

接下去在Runtime表达式里面,我们添加以下代码:

particleShape1.scalePP+=0.15;//每一帧scalePP的值都增加0.15

particleShape1.radiusPP=linstep(0,4,particleShape1.scalePP)*particleShape1.diferent_ radiuPP;//粒子的radiusPP随着scalePP的增大逐渐靠近diferent_radiuPP的值。

这两句代码的第一句很简单,就是一个递加的计算。

第二句则是实现粒子逐渐增大的效果的语句,使用了linstep()函数,这个函数永远返回一个范围在0~1的数值。

用在这里:linstep(0,4,particleShape1.scalePP)返回值随着scalePP的值从0逐渐向4靠近,返回0~1的值;scalePP的值大于等于4返回值都不会变,等于1。所以当scalePP的值逐渐从0增加到4的过程,这个函数返回一个从0逐渐到1的数值,直到scalePP的值大于4,这个函数就等于1。

接下去用这个值乘以diferent_radiuPP的值,那么radiusPP就得到了一个随着scalePP逐渐增大,返回从0到diferent_radiuPP的值了。

最终的效果就是:粒子产生的时候大小为0,然后逐渐增大到diferent_radiuPP的大小:

实现了粒子大小变换以后,开始控制粒子的运动:粒子云是旋转的变大并且在圆锥的顶部逐渐打开一个圆洞的(好像每一个类似的特效都是这样的,也不知道是为什么),那么就需要使用力场来制作了。所以选择使用体积场(VolumeAxis),首先选中粒子,然后使用菜单命令Fiels→VolumeAxis:

将整个力场放大到足够装进整个粒子为止:

由于体积场(VolumeAxis)只是对处于体积场中的粒子物体产生作用,所以必须将体积场的体积变大,包括所有的粒子可能达到的位置。

现在播放动画,会发现粒子会由于旋转产生离心力而向外扩散,这个效果是我们希望出现的,但是扩散得太厉害了,完全超过了我们需要的程度:

离心力太大了,必须减小离心力的作用,所以我们减小粒子的Conserve值的大小:(www.xing528.com)

再次播放动画,粒子的动画状态已经很令人满意了:

虽然已经很不错了但是还有一个细节没有处理,那就是现在每一个粒子的受力几乎都是均等的,所以运动的也很有次序,我们希望每一个粒子的受力大小都不一样,那样粒子的运动速度就都不一样,这样更加随机一点。

要实现这个效果也很简单,只需控制每一个粒子的质量(Mass)就可以了,所以为粒子的质量(Mass)添加一个Creation表达式:

那么粒子由于质量不同,受相同的力,那么运动的速度就会不同了。

以下是不使用表达式和使用表达式的效果的对比:

到此为止,粒子的运动状态制作好了,最后就剩下控制粒子云材质了。

所以为粒子添加新的体积材质ParticleCloud:

在粒子上面使用鼠标右键单击:

在添加粒子云材质以后,属性编辑器会显示如下的内容:

由于Cloud粒子除了体积材质(VolumeMaterial)以外,还会需要使用表面材质(SurfaceMaterial)来产生材质阴影,所以将一个Lambert材质赋予表面材质:

现在进行对画面进行渲染,产生的画面非常的不理想:

画面显得很平,没有立体感,尤其是云雾没有那种表面的阴影和凹凸的感觉,在没有进行贴图前提下,我们先把粒子云的材质感觉调出来。

先在场景里添加一盏环境灯(AmbientLight)。

然后将粒子的属性SurfaceShading调整为1:

再次渲染,粒子云材质不见了,取而代之的是表面材质(SurfaceMaterial),并且是一个一个的小球:

这个表面材质就是我们乌云的阴影和凹凸的来源了,我们增加筏值使小球产生融合,目的是让阴影更加柔和:

再次渲染会发现粒子云体积材质(VolumeMaterial)也体现出来了:

两种材质材质的效果混合在一起产生了更加好的效果。

接下去就是对材质的颜色的调整了:

首先把表面材质(SurfaceMaterial)的颜色调整为蓝色(可能用蓝色作为阴影比较酷吧):表面材质(SurfaceMaterial)的颜色调整:

接下去,为粒子的体积材质(VolumeMaterial)进行贴图,参数设置如下:

在进行最后渲染测试之前,对场景里的粒子设置新的灯光系统。

首先,删除环境光创建一个简单的DirectLight用来照亮锥体就可以(打断这个灯与其他物体的连接让它只是照射锥体);

使用菜单命令Light/Shading→MakeLightLinks建立灯光关联。

接下来创建一个SpotLight用来只照亮粒子(按键盘上的7键可以交互式调整灯光),放置位置和参数设置如下:

渲染测试,一直调整到满意为止(通常还没有调整好就放弃了):

如果调整到满意的效果了,在进入正式渲染之前还有一个细节没有处理,那就是材质动画:粒子云的体积材质的颜色信息使用的是Cloud程序文理,采用的是三维文理放置节点。如果材质坐标不动,那么即使粒子动了,材质也是静止不动的,所以必须让材质随着粒子的运动一起运动。

这里使用的表达式相当简单:

place3dTexture6.translateY=time;

place3dTexture6.rotateY=frame;

就是让材质沿着粒子旋转的方向旋转,并且向上升高在Y轴方向上产生材质动画。

最终效果如下:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈