这篇教程像的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)