maya制作冬天呵气粒子的模拟
- 2022-02-06
- 来源/作者: PS.ONEGREEN.ORG / 佚名
- 11 次浏览
这篇教程将带领你制作一个在寒冷的天气里从嘴里呼出白色的水蒸气的动画。这有一个场景,在这个场景里,有两个妇女正在一条城市的马路上一边走一边相互说着话,我们的任务是在这个90帧的动画里面,给这两个妇女添加从嘴中呼出的呵气,在这里我们假定你已经对maya有一定的了解。如图1。
我忽略了一些关于摄像机的设定,把序列图片导了进来,这个粒子场景需要一个320*240大小的一个渲染区域,在摄像机的透视图里面设置Film Gate为 35mm TV Projection。
一旦把这些动画的序列图片导进来之后,我们需要跟踪摄像机的运动,这是件一件很令人苦恼的工作,但为了得到好的效果确实很必要的。
首先创建一个方向性(direction)的粒子发射器,选择方向型的是为了在特定的位置形成一种漏斗状的,点发射(omni)器很难做到这点。把发射器调整到妇女的面前,设置这个粒子发射器的发射方向,使得粒子从面部喷射出来,这样的话,就把z轴作为主方向,稍微向x轴偏一点,设置Direction X = –0.3; Direction Y = 0; Direction Z = 1。
现在先把发射器的rate设置为0,这样可以使得发射器跟踪这个妇女的嘴,而没有粒子在周围干扰,为了操作的方便,创建一个locator,改变一下大小,使得它在屏幕上更容易看到,把它变成红色的,直接放到发射器的中间,在outliner中直接使用中键把发射器拖到locator下面,命名为Anim_breath_pack1,这个locator使得发射器很容易看到,很容易跟踪嘴的位置。
[NextPage]
下一步,让这个Locator/emitter的组合去跟踪第一个妇女的嘴,把它始终放到她的嘴的前部。
一旦追踪完成了,我们开始对粒子的rate进行动画来模拟她呼出的水蒸气,这里我们需要寻找的不仅是她什么时候呼出,而且怎么呼出,她是否正在说话吗?她是否正在叹气?她是否被一辆小的购物车碰到了。这展示了呼吸呼出了多少水蒸气,这直接代表了我们的粒子的rate应该怎么设置。
我通常通过设置一
些帧,在这些帧内使得发射器逐渐的开始发射粒子,来制作呼出的水蒸气。例如,她在6至17帧稍微呼出一些,我就要在第3帧设置rate为0,在10帧设置为100,在15帧设置为0。这样,再加上一些粒子渲染类型,和生命值的设置,就可以得到一个很好的模拟。就是用上面这个办法,先观察她什么时候呼出,然后相应的设置发射器的rate,在前面和后面都设置一些帧,呼出的水蒸气越大,rate越大。
为了使得这个方向型的粒子发射器看起来更象是呼出的水蒸气,我们需要设置一些属性。现在为止我们已经设置了发射器的方向directions,发射器的rate也进行了动画设置来符合真实的人物嘴呼出的水蒸气。
现在我们把spread设置为0.45,这将给我们一个顶角为45度的圆锥形发射器,不要太小,象个喷射的一小股蒸汽,也不要太大,象爆炸一样。
[NextPage]
下一步设置speed,我通常不设置speed这个参数动画,在这个特定的片段里,为speed设置关键帧动画,没有太大的必要,所以我们就设置为一个常量2.0。再把Speed Random设置为0.35,使得每个粒子的速度一些随机的不同,这使得呼出的水蒸气看起来更自然。
下面来处理一下粒子的外观,这里取决于很多因素,在粒子发射器的属性栏里和粒子属性栏里有很多属性可以编辑。
对于粒子的渲染类型particle render type我使用Cloud (s/w),说一下原因吧,顾名思义,它是软件渲染型的,相比硬件渲染型的,我更喜欢软件渲染的。另外一个常用的类型是sprite的,在这个特
定的情况下,我们使用Cloud (s/w)型的,我想这种类型个比sprite的更容易表现。另外通过threshold这个属性,可以调整粒子彼此之间的融合,得到比sprite更好的渲染效果。渲染起来Cloud (s/w)要比sprites慢。下面来看lifespan这个属性,这个属性代表了粒子在场景中存在多久,在越寒冷的气候里,你看到的呵气越明显,但持续时间也短,在中等寒冷的天气里,你看到的呵气将持续时间长一些,但也不是很明显,在温暖的天气里,你就根本看不到呵气。
对于lifespan我们就选择lifespanPP,控制每个粒子,为lifespanPP设置一个表达式来控制粒子的寿命有多长。
简单说两句,一个creation表达式是一行代码,当粒子一产生就影响。而runtime表达式是另外一种粒子表达式,将会在每一帧影响粒子的动画。在这里既然不需要每帧都变化,就选第一种,在lifespanPP栏上点右键,选择Creation Expression。出现表达式编辑器。
[NextPage]
在文本编辑框里面输入表达式,然后按Create创建表达式。(或者当一个表达式已经存在的话,按下Eidt)我的表达式写的是Anim_particleShape1.lifespanPP=rand(.9,1.6);这个表达式设置粒子的生命值为0.9到1.6之间的一个随机值,通过设置这个随机的生命值,可以使整个效果更真实一些。
下一步是设置粒子的大小,半径。我喜欢使用per particle控制每个粒子的大小,所以添加一个radiusPP属性, 在Attribute Editor的Add Dynamic Attributes标题下选General,点击 Particle 标签,选择radiusPP。
这就创建了一个属性来控制粒子物体中的每个粒子的半径,这个属性,我们将创建一个creation表达式和一个runtime 表达式。
当粒子产生以后,这个creation表达式将给粒子一个在一定范围内随机的半径值,这个runtime 表达式将允许粒子在以前的基础上增加半径,这将帮助呼出的气体消散在冷空气中。
在radiusPP属性上点击右键,选择Creation Expression打开表达式编辑框Expression Editor,在编辑器里输入表达式,为每个粒子创建一个从0.5到2随机的半径值。表达式如下:Anim_particleShape1.radiusPP=rand(.05,.2);按下Eidt按钮,再按编辑器中间的Runtime,转换到Runtime表达式编辑,这里创建表达式,可以使粒子随着时间增长,首先创建一个表达式来读取当前的粒子半径,然后将随着每一帧,粒子的半径在原
有的基础上增加0.01,表达式如下:Anim_particleShape1.radiusPP=Anim_particleShape1.radiusPP+.01;在这句组后加了一个“;”,这是一个mel的语法,这里的表达式使用的是mel的命令和语法,对于每句mel命令为了和下一句相分开,应该在结尾加以个分号,这里即使没有下一句,加一个分号也是个好主意。[NextPage]
下面来设置一下粒子的透明度,我们想这些粒子渐进渐出,所以我们连接一个ramp到OpacityPP的属性,这个ramp是个由黑到灰再到黑的一个渐变色。
在Add Dynamic Attributes这一栏里面选择Opacity,出来的对话框,里面选择Add Per Particle.,这样OpacityPP就出现在了属性编辑器里面,这一栏上右面点击右键,选择Create Ramp。就创建了一个如下图的ramp,这就使得粒子在刚产生的时候是不可见的,然后渐渐可见,再慢慢消散。
因为这是软件渲染的粒子类型,所以这个OpacityPP ramp不会影响这个最终的渲染,我们可以看到粒子的渐进渐出,通过playblasts预览或者透视窗口。这只是动画的回放,不是最终的渲染,真实的渐进渐出需要通过shader来实现。
好了,现在我们已经完成了大半了,动画已完成,现在渲染之前我要做的就是指定shader给粒子。在指定透明属性。在Multilister 里面(或者在 Hypershade 里面也可以),选择Edit>Create,再选择Particle Cloud。调整新创建的Particle Cloud,加一个灰色,density设置为0.744,在加一点incandescence。
通过控制Transparency属性可以设置粒子的渐进渐出,连接一个ramp到这个属性,在map按钮上单击,选择一个rmap纹理,象下图那样调整rmap得到最好的渐进渐出的效果,和正常状态下的透明效果,注意,天气越冷呵气越多,所以可以配合粒子发射器的rate调整这个Transparency属性。
最后开始测试渲染,同时调整shader设置和ramp已达到最好的效果。调整好后,不带背景渲染,然后调到合成软件中和背景合并起来,调整一下透明度和颜色,就完成了。