首页 百科知识 学习MAYA粒子特效:动画粒子贴图技巧

学习MAYA粒子特效:动画粒子贴图技巧

时间:2024-10-05 百科知识 版权反馈
【摘要】:这一节就学习如何为粒子进行动画贴图:在用户给Sprite指定图像之前,需要创建Lambert材质并将它指定给粒子物体。

学习MAYA粒子特效:动画粒子贴图技巧

第三节 动画粒子贴图

Sprite(精灵)粒子的最棒的地方就是能够为粒子的颜色贴动画贴图,并且能够单独控制每一个粒子的动画的速度,颜色等属性。

这一节就学习如何为粒子进行动画贴图:

在用户给Sprite指定图像之前,需要创建Lambert材质并将它指定给粒子物体。Lamber材质将用于控制纹理图像。Lamber材质的高光部分不受灯光镜面干涉的影响,所以,用于显示Sprite是最好的。

接下来创建一个文件纹理节点赋予材质的color(颜色)属性,最后在属性编辑器的FileAttributes部分,单击ImageName右侧的按钮,选择一个动画序列的第一帧,点击确认后,该图片就被加载成功了。

但现在还只是单张图片,接下来如图选择UseImageSequence:

默认的下面的ImageNumnber就变成可用了,但是默认的被添加了表达式:

file1.frameExtension=frame;

现在播放动画,动画序列会被一帧一帧的读入产生动画。

提示:在Maya7.0之前动画序列必须是File.type.number的,例如:fire.tga.001而不是fire.001.tga。

上面的知识只是得到了动画的贴图,用到粒子中还有很多地方需要改进的,所以下面用一个简单的例子《骇客帝国]》里面的随机数字下落来学习怎样为Sprite(精灵)粒子添加动画的贴图:

首先是制作一段0~9的数字循环的动画:

将它们输出成Tga动画序列:

这里使用了序列号置后的文件格式。

接下来在Maya中创建一个面片:

使面发射粒子,利用菜单命令Particles→EmitFromObject:

接下去选择粒子然后创建Uniform(统一场),使得粒子向下落:

于是在每一个WaireFrame的交界处都发射出了粒子并且向下落:

然后把粒子变成Sprite(精灵)粒子,同时把生命周期改成适当的数值:

粒子下落的动画基本形势已经出来了,就是有点整齐,并不是我们想要的。如果下落的速度不同(随机)就更好了,在这里粒子的下落是依靠动力场,所以只要让粒子的质量不同,那么粒子受相同的力的作用下,质量不同速度也就不同,所以下落的速度就不同了。

为粒子的质量(Mass)写一个简单的随机表达式:

创建表达式(CreationExpression):

particleShape1.mass=rand(0,1);//质量最大是1,最小是0

于是粒子的随机下落产生了:

在这里必须提一下的是:使粒子下落使用了Uniform(统一场),而不是重力场原因是如果使用重力,那么不论质量大小下落的速度都是一样的。著名的埃菲尔铁塔试验,相信大家都知道,所以我们使用了Uniform(统一场),使得粒子能够在重量不同的情况下获得不同的加速度(希望读者有物理学的概念,如果没有就记得:要产生不同的粒子速度,必须使用非重力场)。(www.xing528.com)

粒子的形态做好了,接下来就是为粒子贴图了:

简单的给一个Lambert材质,给一个纹理节点,然后加载图片序列的第一张,这样就有了单帧的图片:

要使得粒子的贴图序列动起来很简单,只需要选择UseImageSequence就可以了,默认的下面的ImageNumnber就变成可用了,但是默认的被添加了表达式:

现在播放动画,动画序列会被一帧一帧的读入产生动画,但是大于9帧以后就一直是第9帧的图片了:

之所以会这样,完全是因为默认的表达式产生的效果,所以我们还是手工控制frameExtension的值来得稳妥,所以我们干脆就用手工key帧的:

我们的目的是让粒子中的贴图循环播放,所以首先我们必须先选择UseInteractive Sequence Catching(使用图片序列缓存):

只要图片序列的缓存被创建了,图片序列才有循环的可能。

进行了上面的操作,图片序列在0~9帧是依次导入的,但是第9帧以后就不变了一直是第9帧,那是因为我么设置关键帧手工控制frameExtension的值就是到9停止的。

然而在粒子身上图片始终是0,并没有改变,这是因为我们为图片序列创建了缓存,一旦创建了缓存,粒子贴图的序列改变就不再受frameExtension的值控制了,而是spriteNumPP控制了,我们可以做个比较:

下面是Use Interactive Sequence Catching(使用图片序列缓存)没有选中的情况,粒子贴图变化情况:

粒子贴图在0~9帧里面,动画序列会被一帧一帧的读入产生动画,但是大于9帧以后就一直是第九帧的图片了。

这是UseInteractive Sequence Catching(使用图片序列缓存)选中的情况:

可以看到图片序列是9,但是粒子上的图片依然是0,并且不会改变,自始至终一直是0。

所以我们就可以使用spriteNumPP属性来控制粒子的贴图变化了,首先还是为粒子添加spriteNumPP粒子属性:

为了产生循环的例子贴图,我们就使用RunTimeExpression(运行表达式)来控制spriteNumPP粒子属性来返回一个循环在0~9的数值:

第一行很简单,每一帧spriteNumPP都增加0.5;

第二行的“%”表示取余数,也就是除以10取取余数,那么最大是9最小是0,所以就在0和9之间循环了。

把摄影机位置调整适当,然后看看效果:

效果基本上已经出来了,只是还有一个细节没有把握好,那就会是粒子的贴图循环都是一样的,都是出生的时候是0,然后开始循环:

要解决这个问题很简单,只需要为spriteNumPP增加一个Creation表达式就可以了:

particleShape1.spriteNumPP=trunc(rand(0,9));//在0到9之间返回随机数然后取整数(trunc函数的功能就是取整数)。

效果如下:

最终效果如下:

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

我要反馈