第二节 多 点 目 标
这一节,我们就用粒子制作出《蝙蝠侠》片头中的蝙蝠扑向字体然后飞散开来动作。这个特效是使用粒子的多点目标完成的,我们先看看什么是多点目标吧:
新建一个场景,然后建造一个多边形的球体,再建造一个粒子发射器(使用默认属性),使用Goal命令,将球体变成粒子的目标体,看看结果是什么样子的?
是不是和你所想的不一样?粒子按照粒子产生的顺序,依次附着在相应的点上面了,这就是粒子的多点目标。
首先,要知道需要有多少只蝙蝠(在这里使用粒子代替了),这个数量应该和球体的点的数量一样多,所以就使用菜单Display →HeadsUpDisplay →polycount来显示多边形的信息:很容易知道一共是72个点。
所以在这里应该有72只蝙蝠(在这里是粒子),那么如何让发射器产生72个粒子呢?很简单,选中粒子,可以在通道盒里面找到MaxCount这个属性,它就是粒子的数量,现在是-1,意味着无限多,把它改为72,粒子就只有72个了,然后把粒子发射器推远一点,产生一种蝙蝠(粒子)从远处飞来的效果:
可以看到,粒子的数量只有72个了,但是粒子由于受到惯性的作用,来回往复的运动,这个不是我们想要的效果,所以找到Conserve将它设置为0(这个上一节有介绍),这样粒子在不受力的作用下就不会运动了。
但是由于惯性没有了,所以例子落在球体上的时候非常的平稳,这和蝙蝠的动作完全不同,应该是在落下之前很混乱的在球体上面运动的,所以我们为粒子增加动乱场(turblence),这样粒子就会混乱了。
由于惯性Conserve=0,所以粒子的动乱场(turblence)强度就应该大一点,这样粒子才会有抖动,因为没有了惯性,不受力就不动了。
粒子动乱了,可是最后蝙蝠还是要停下来的,怎么做呢?方法有两个,可以减小动乱场(turblence)的强度、还可以增加goalweigth的大小为1,在这里我们同时使用两种方法:接下来我们就用关键帧的方法制作蝙蝠飞向球体,然后再球体上面混乱的抖动,最后慢慢的停下来,落在球体上面。
首先在动乱时候为三个属性纪录关键帧。
接下来播放一段时间后,也就是让蝙蝠混乱一阵子以后,让它们落下来:将动乱场(turblence)的强度降低到0(粒子不受力将不再运动),将goalweigth增大到1(粒子将完全受物体吸引不受其他里的影响),同时将惯性Conserve调高到最大1。(把惯性Conserve提高的目的是为以后蝙蝠再次飞散做准备的)。然后依次纪录关键帧:
现在,播放动画,蝙蝠会疯狂的扑向球体,然后在球体上面混乱的抖动一段时间,落到球体上安静下来。
这个动画已经做好一半了,剩下的就是要让粒子由上至下的,再次飞散而去。请注意:这里是让粒子从上至下的飞散,所以需要:
1.粒子的惯性Conserve要等于1,完全可以受力扩散。
2.粒子要受动乱场(turblence)的影响;
3.需要控制每一个粒子的goalweigth。
那么,第一条我们已经有准备了,做好了。
第二条,我们可以设置关键帧将动乱场(turblence)的强度再次提高,因为粒子的goalweigth等于1的时候,粒子不受力的影响。
第三条呢?如何控制每个粒子的目标权重呢?当然是使用PerParticle粒子属性了,到PerParticleAttribute面板里面找一下:
我们发现在PerParticleAttribute面板里面多出来一个goalPP的粒子属性,他就是控制每一个粒子的目标权重的属性;
那么goalPP是怎么与goalweigth一起控制力子的受目标吸引的呢?在MAYA内部粒子受目标吸引的总权重等于goalPP乘以goalweigth,在这里两这得最大值都是1,最小值都是0。
当前情况下,粒子的goalweigth值是1,那么只要让goalPP等于0,那么粒子的总权重就是0了,粒子就会受动乱场(turblence)的影响而散开了。
下面我们就开始着手制作,首先用一帧的时间将动乱场(turblence)的大小提高到足够大的值,由于当前goalweigth值是1,所以粒子不会受力的影响。(www.xing528.com)
在这里,150帧的时候,turblence的值是0,到了151帧的时候立刻增加到200。
接下来,就开始解决从上到下goalPP从1到0的赋值工作,这个工作当然是使用表达式了;为了产生一个从上到下的值,我们使用一locator从上向下的移动来产生一个在Y轴上面移动而产生的从大到小的值:
随着时间的增加,locator的Y轴移动属性返回一个从大到小的值。
有了这个从大到小的值,接下来就是怎样用到粒子的goalPP的赋值工作里了,在这里我们先用语言将表达式的内容写出来:
当粒子的Y轴位置大于locator的Y轴位置时候,粒子的goalPP等于0,否则等于1。
继续细化一下:
if(当粒子的Y轴位置>=locator的Y轴位置)
{粒子的goalPP等于0;}
else
{粒子的goalPP等于1;};
在这里,我们使用了if(…){…;}else{…;};这个语句。这是标准的判断语句,当满足if后面括号里面的语句,就执行后面大括号里面的语句,否则执行else后面的大括号里面的语句。
下面就继续细化语句:
现在就剩下particleShape1.position的Y轴值没有翻译成标准表达式语句了,在这里,MAYA只能够接受“物体.属性”不能接受“物体.属性.属性”所以,“particleShape1.position.y”是不能被接受的。那么如何得到particleShape1.position的Y轴值呢?我们使用一个技巧:
vector $pos=particleShape1.position;//自定义一个矢量值将粒子的位置信息保存在里面。
于是我们就可以通过$pos.y得到粒子的Y轴信息了。
所以表达式就可以这样写:
else
{particleShape1.goalPP=1;};
将这段表写到粒子的RunTimeExpression里面去,这样粒子的Y轴位置高于locator的粒子,就会由于goalPP=0而受到动乱场(turblence)的影响而散开了。所以locator从上到下移动,粒子就会从上到下的散开。
《蝙蝠侠》的片头类似动作已经完成了,只是蝙蝠变成了粒子,以后我们会学习怎样把粒子变成蝙蝠:
蝙蝠飞向目标:
蝙蝠停落下来:
蝙蝠停下来:
蝙蝠飞散开来:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。