这篇教程向maya学习者们介绍maya粒子替换功能,教程难度高等,其中用到较高级的mel命令coloratpoint,从而用贴图的亮度控制粒子替换的缩放效果。为了达到可以使用贴图的亮度要求,这里还使用了粒子目标功能,利用粒子目标的gaolu和gaolv属性作为读取贴图亮度的输入参数等等。先来看下效果预览:
具体的制作步骤如下: 新建一个场景,选择create->nurbsprimitives->plane(创建->曲面几何体->平面),创建一个nurbs平面,调整为长方形,x轴缩放为15,z轴缩放为10。(图01) 图01 选择particles->create emitter(粒子->创建发射器),创建一个独立的粒子发射器,发射器的发射数量为100,其它保持默认。(图02) 图02 选择粒子particle1,加选nurbs平面nurbsplane1,选择particles->goal(粒子->目标)后面得小方块,打开粒子目标选项盒,设置目标权重为1,点击create为粒子创建目标,播放效果如图。(图03) 图03
默认情况下粒子都是被目标物体吸附到物体的点上,这里需要将粒子整齐的排列到平面上,所以要为粒子添加goalu和gaolv属性,在粒子的属性编辑器里找到每粒子属性卷展栏(per particle array attributes)和下边的添加动态属性卷展栏(add dynamic attributes),点击general按钮,打开添加粒子动态属性窗口,在particle粒子标签找到gaolu和gaolv属性。(图04) 图04 点击添加粒子动态属性窗口下边的ok按钮,添加goalu和goalv属性。在每粒子属性卷展栏里找到新添加的属性。(图05) 图05 这里因为要粒子横向排列70,纵向排列50,一共需要70×50(3500)个粒子,所以把粒子的最大数量属性max count设置为3500。然后为粒子编写表达式,在每粒子属性卷展栏里找到新添加的属性,在其中一个右边的方框里点右键,在弹出菜单中选creation expression打开创建时表达式编辑窗口,为goalu和goalv编写表达式: goalu=particleid%70/69.0;
goalv=int(particleid/70)/49.0;(图06) 图06 表达式是根据粒子的id号属性为每个粒子计算出一个目标u和目标v的数值,从而使粒子整齐的排列在平面上。将时间滑块,设置为1到1000,播放动画到862帧的效果。(图07) 图07 选择粒子,选择solvers->initialstate->set for selected(解算器->初始化->初始化选择的物体),将粒子当前的状态初始化为开始的状态,使粒子在回到第一帧时还是有3500个粒子。(图08) 图08
选择create->polygon primitives->cube(创建->多边形几何体->方形),创建一个盒子,调整它的长宽高都为0.2,效果如下。(图09) 图09 选择新创建的盒子,选择particles->instancer(replacement)(粒子->粒子替换)后面的小方块,打开粒子替换选项盒,使用默认设置,点击create,创建粒子替换。(图10) 图10 选择小方盒子pcube1,按ctrl+h将其隐藏。接下来是创建一个2d贴图,可以是程序纹理,也可以是文件纹理,然后用mel命令读取贴图的亮度,最后用这个亮度值控制粒子替换的缩放。选择windows->rendering editors->hypershade(窗口->渲染编辑窗口->超级滤光器窗口)。(图11) 图11 创建一个noise程序纹理,设置noise1的depth max(最大深度)为1,frequence(频率)为5,noise type(扰乱的类型)为perlin noise。(图12) 图12
选择粒子,打开粒子属性编辑窗口,在添加动态属性卷展栏(add dynamic attributes)里,点击general按钮,打开添加粒子动态属性窗口,在new粒子标签添加新属性,名字:scl,数据类型:vector,属性类型:perparticle(array)。(图13) 图13 点击ok添加新属性scl,在新属性右边的方框里点击右键,在弹出菜单中选择runtime after dynamics,打开运行时动力场之后表达式编辑窗口,编写表达式: float $u=goalu;
float $v=goalv;
float $c[]=`coloratpoint -o a -u $u -v $v noise1`;
scl=<<1,1,(1+($c[0])*5)>>;(图14) 图14 应用新属性scl作为粒子替换的缩放控制属性,在粒子的属性编辑器里,找到instancer(geometryreplacement)粒子替换卷展栏,在scale的控制选项里选择自定义的属性scl。(图15) 图15 这时的被表达式读取的贴图还只是个单帧图片,并不是贴图序列,所以还没动画效果。(图16) 图16 可以给noise1程序纹理的time属性写一个表达式,使其有动画效果,使粒子替换产生波浪般起伏效果。在hypershade的textures贴图标签里,选择noise1节点,在noise1的属性编辑器里找到time属性,右键打开表达式编辑窗口,为其写表达式: noise1.time=time*0.5;(图17) 图17
这时播放,会看到动画效果。也可以使用贴图序列来控制粒子替换的缩放。笔者这里准备了一个贴图序列,现在就把这个贴图序列读取到maya中。在hypershade里,创建一个文件纹理。(图18) 图18 在文件纹理file1的属性编辑器里的image name后面的小按钮上点击,打开纹理浏览窗口。(图19) 图19 选择序列的第一个文件,点击open,打开文件纹理,然后在属性编辑器里勾选use image sequence,这时会为该文件纹理自动创建一个表达式。(图20) 图20 文件贴图已经就绪,现在只要修改粒子的表达式,使其读取新创建的文件纹理file1,而不读取程序纹理noise1就可以了。打开粒子表达式编辑窗口,修改表达式。(图21) 图21 注意:coloratpoint命令可以返回贴图的rgba(红、绿、蓝和亮度)四种颜色信息,如果表达o后面只有一个大写a,就是只返回亮度信息,如果是rgba就是会全部返回四个颜色信息,因为笔者使用的贴图序列的亮度信息不是很理想,所以这里就使用了贴图的红色信息。 修改完表达式,点击edit按钮,这时视图里的效果。(图22) 图22
在hypershade里,创建一个blinn材质球将其付给替换粒子的物体pcube1,修改材质球的属性。(图23) 图23 创建一盏聚光灯,强度设置为0.8,打开光线跟踪。(图24) 图24 再创建一盏补光和背景光,灯光强度分别为0.2和0.3。显示灯光效果。(图25) 图25 在全局渲染设置里设置产品级别,打开光线跟踪,渲染效果。(图26) 图26 这时观察渲染出来的图像会看出来是一个很朦胧的脸型,但感觉好像有点不舒服,因为头发眼睛和嘴都是是凹进去的,而不是凸出来的,这样的原因是因为我们读取的贴图的红色,二头发的颜色是很暗的颜色,很暗的颜色里面红色的数值很低(当然绿色和蓝色在很暗的颜色里也很低,这跟效果没关系,不过读者也可以尝试读取贴图的绿色和蓝色做为粒子替换缩放的控制数值)。如图所示是本例中读取的贴图的红色信息。(图27) 图27
最终的粒子替换的z轴的缩放就是根据这张贴图的红色数值来决定的,这就很容易看出,头发和眼睛的红色值很低,那样这些部位肯定就是凹下去了,解决的方法很多,可以用后期软件先处理贴图序列,也可在maya里使用程序节点提取红色信息,再翻转它,但这里还可以修改一下表达式来达到预期的效果。先选择粒子,在每粒子属性卷展栏里打开表达式编辑窗口,修改表达式。(图28) 图28 表达式里只是把原贴图的红色值用1减去,这样原来数值低的头发和眼睛的地方就是变为数值高的地方。同时也适当调整了缩放的倍数,把原来乘以的5倍改为乘以7.5倍,使凸起的效果更明显。(图29) 图29 效果基本完成。现在简单搭建一个环境。创建桌子、笔筒、书籍、带灯等物体。(图30) 图30 为各个道具物体付材质,加贴图。(图31) 图31 适当调整灯光。最后渲染完成效果。(图32) 本maya教程完。
|