来写一点mel扫盲教程,主要是针对初学Maya的人,如果你已经学了一个月以上的Maya,那你就可以学习这篇mel教程了。不一定要等到Maya掌握的非常熟练才去学mel,相反,如果你在初学Maya的时候就对mel有所了解,那对于将来更好的了解和掌握Maya会起到事半功倍的效果。
当然首先要提到的是mel的基本概念,如下:
mel是Maya Embedded Language(Maya内置语言)的缩写,是一种强大的命令和脚本语言,让你直接控制Maya的特征、进程和工作流程。
其次要提到的是应该抱怎样的态度:
有许多人认为mel比较难,我的看法是并不比游戏攻关难,在网上经常看到有人为攻一关花掉一个月时间,学mel如果能达到这个境界一定会很了不起。学mel的确可能会枯躁一些,因为找不到像CS那么多人给你去杀。
mel是个可大可小的东西,如果你不是搞程序开发的,应该尽可能的让mel给你节省时间,而不要在学习和编写mel程序上花太多时间,应尽量编写简单且实用的程序。不要因为盲目追求高深的技术而耽误了您泡MM的宝贵时间
我的教程也是针对这一点写的,如果你已经做好了准备,就和我一起进入mel的世界吧。
今天要讲的是命令组合。
打开Maya,在命令行(Command Line)输入"cone"并按回车,视图中创建了一个圆锥。
如果你没有看到命令行,用Display->UI Elements->Command Line来显示它。
你也许会问用命令行创建圆锥跟用菜单创建有什么差别。我来告诉你,只是形式上的差别,本质上菜单和命令行都是在执行mel命令,可以说你在Maya中的一举一动都是在执行mel命令。
现在打开mel编辑器(Script Editor),mel编辑器分两部分,上面是历史窗,下面是编辑窗。
历史窗显示你刚刚执行的命令和命令的结果或错误信息。
编辑窗可以输入命令,而且可以输入多行命令,但每个MEL 命令之后必须以分号结束。
选择mel编辑器的菜单Edit->Clear History,把历史窗清洁一下。
在编辑窗输入"cone -ax 0 1 0 -r 1;"并按Ctrl+Enter或数字键那边的Enter,视图中创建了正立的一个圆锥。再看历史窗,多了两行,第一行是刚刚执行过的命令,第二行是命令的返回值(Return Result)。我明天会着重讲返回值,今天先来解释一下标志(Flag)。
刚才那个"-ax"和"-r"就是"cone"命令的标志,一般一个标志分长短两种写法,比如"-r"和"-radius"就是同一个标志,写哪个都行。长标志看起来比较清楚,而短标志写起来比较方便。因此,对于你比较熟悉的标志,尽量用短标志,不熟悉的就用长标志。
改一下"cone"命令"-r"后面的数值,比如改成"cone -ax 0 1 0 -r 3"再执行,发现创建出的圆锥半径变大了,由此你可知道-r/-radius是控制圆锥半径的。
当然"cone"命令还有很多标志,要深入了解这个命令,最好的办法是看帮助文档,Maya为此专门提供了一个mel命令(就是help命令)来快速察看帮助。执行"help -doc cone",就可以打开cone命令的帮助文档。
要想看到所有mel命令的帮助,选择Maya菜单Help->MEL Command Reference...
Maya的帮助文档中一共收录了将近一千条mel命令,听起来很恐怖吧。不过没关系,要想在恶劣的环境下自在的生存,首先要学会对困难视而不见。看帮助时按分类(Categories)去看,只要翻翻你感兴趣的几个分类就行了,如果你都不感兴趣,就都不要看了,等用到了再去翻也不迟。
现在摆在你面前的一个严峻的问题就是你怎样从这近一千条mel命令找到你想要的那条命令。别怕,你虽然不熟悉mel,但你还不至于不熟悉Maya的菜单吧。选择Create->NURBS Primitives->Cone来创建一个圆锥,这时你会发现mel历史窗中多了一行命令,其中"cone -p 0 0 0 -ax 0 1 0 -ssw 0 -esw 360 -r 1 -hr 2 -d 3 -ut 0 -tol 0.01 -s 8 -nsp 1 -ch 1;"就是一个完整的创建圆锥的命令。在命令行执行一下这句命令,会发现可以得到跟菜单相同的结果。有了这种方法,就不用为你掌握的mel命令太少而犯愁了。
你也许已经意识到得到每一步操作的命令意味着什么了,就是可以把这些命令写在一起,然后一下子执行,就像Office里的宏和PhotoShop里的Actions一样。好,那就开始吧。
现在Maya虽然已经支持默认灯光渲染了,不过我们建模时经常还是会打一盏灯来观察一下效果。具体过程是先创建灯光,再把它移动到一个合适的位置,然后旋转一下角度,然后还要调整亮度。如果你经常要打灯光观察模型,你一定希望点一个按钮来完成这一切,我们的实例1就来解决这个问题吧。
------------------------------------------------------
实例1:摆放灯光
首先清洁一下mel历史窗准备记录命令。
选择Create->Lights->Directional Light创建一盏直射灯,把直射灯往左后方移动一下,再旋转一下使它的方向指向视图中心,Ctrl+a打开属性编辑器,把灯光的属性(Intensity)改为1.2。
这时再看看mel历史窗,多了类似如下几行:
defaultDirectionalLight(1, 1,1,1, "0", 0,0,0);
move -r -5.393374 -0.124913 3.360977 ;
rotate -r -os -33.086209 0 0 ;
rotate -r -os 0 -24.179269 0 ;
setAttr "directionalLightShape1.intensity" 1.2;
把这几行字都选中,用鼠标左键拖放到Shelf工具条上,会发现Shelf上多了一个mel图标。
新建一个文件,按一下这个mel图标,你会发现你成功了。
一般用户编写的常用的mel程序都是放在Shelf里的,因此你需要对Shelf了解一下。鼠标左键在Shelf左下角的三角形那里按下,在下拉菜单选择Shelf Editor...打开Shelf编辑器。
关于Shelf编辑器的我就不多讲了,你自己瞎按一会儿也会弄明白的。我要说的是既然你已经开始学mel了,要那么多乱七八糟的Shelf也没什么用,你可以只留一个General,其它的都删掉,然后新建一个Shelf,名为myTools。
注意我所说的这些操作都是在Shelf编辑器中进行的,不要跑到"你的文档\maya\5.0\prefs\shelves"那里去删Shelf,否则再启动Maya时那些Shelf会死而复生的。
更改Shelf图标也在Shelf编辑器中,你可以把那个难看的mel图标换成你喜欢的美女。
看看好莱坞人用的Maya工作界面,都是自己定制的Shelf,我们别的地方不如人家,这一点还是可以跟人家很像的。
现在来解释一下刚才的几句命令。凭你对英文的理解,其实也能猜到这几句的意思吧。
"defaultDirectionalLight"就是创建一盏直射灯。
"move"就是移动,"-r/-relative"是经常用到的,意思是相对于物体当前的位置。
例如"move -r 1 0 0;"是说把物体沿X轴移动一个格子,而"move 1 0 0;"是说把物体的"translateX"属性设为1,"translateY"和"translateY"属性设为0。
"rotate"用了两次,就是旋转了两次,看一下右边通道框里的旋转数值,你可以把这两句并作一句,就是"rotate -35.534708 -20.070585 13.771703;"。"-os"是指物体坐标轴,相对"-ws"于世界坐标轴而言的。要想让物体沿世界坐标轴旋转,双击旋转工具图标打开工具设置窗,把Rotate Mode由Local改为Global即可。
"setAttr"是设置属性,这可是一个关键性的命令,需要重视起来。
对于属性你一定不会陌生的,它是设动画的关键。属性可以在属性编辑器(Attribute Editor)和通道框(Channel Box)中修改,也可以用mel的"setAttr"直接修改。物体属性的写法是物体名+"."+属性名(object.attribute),属性名同mel标志一样有长短两种写法。选择通道的菜单Channels->Channel Names->...可以切换长短名的显示,平常看到的那个"Nice"名只是为了好看,在mel和表达式中都不中用。
了解属性对于我以后要讲到的表达式有决定性的意义,表达式就是通过对物体的属性与时间之间、属性与属性之间建立某种运算关系来控制动画的。
根据前面的说法,"move 1 0 0 nurbsCone1;"同样可以写成:
setAttr "nurbsCone1.translateX" 1;
setAttr "nurbsCone1.translateY" 0;
setAttr "nurbsCone1.translateZ" 0;
或:
setAttr "nurbsCone1.tx" 1;
setAttr "nurbsCone1.ty" 0;
setAttr "nurbsCone1.tz" 0;
最后让我们来编一个比较实用的mel命令组合吧。
------------------------------------------------------
多边形人头建模时,一般是先建一半脸,建好后再镜像,再圆滑一下。
你建一半脸的时候,很难想像出镜像圆滑后整张脸的样子吧。你现在学会了mel命令组合,可以实现点一个按钮来完成镜像和圆滑了,这样你可以在建模的过程中预览一下完成的效果。这样有用的程序后面还要继续完善下去,先给它起个形象的名字叫myFullMoon(月圆),版本订为1.0。
------------------------------------------------------
实例2:myFullMoon1.0
打开你的半边脸文件,为了在操作过程中减少不必要的麻烦,我们先来把模型规范化一下:
如果你的模型是右半脸,把它改成左半脸。要保证你能在前视图看到模型的正面脸,侧视图看到侧面脸,顶视图看到头顶。把模型放到视图中心线的左边。选中模型,选择Modify->Center Pivot,选择Modify->Freeze Transformations,选择Display->Component Display->Backfaces不显示背面,如图,记住你的模型宽度是几个格子。别忘了把mel历史窗打扫干净。
规范好了,就存一下盘。
选中模型,现在可以开始记录命令了。
选择菜单Edit Polygons->Extrude Face。
mel历史窗记录了四行命令,你要知道的是只有一行是对你有用的。想知道为什么?你把每行命令单独试试就知道了,只有
polyExtrudeFacet -ch 1 -kft 0 -pvx -3.926295877 -pvy -1.118658066 -pvz 4.649739981 -tx 0 -ty 0 -tz 0 -rx 0 -ry 0 -rz 0 -sx 1 -sy 1 -sz 1 -ran 0 -divisions 1 -off 0 -ltz 0 -ws 0 -ltx 0 -lty 0 -lrx 0 -lry 0 -lrz 0 -lsx 1 -lsy 1 -lsz 1 -ldx 1 -ldy 0 -ldz 0 -w 0 -gx 0 -gy -1 -gz 0 -att 0 -mx 0 -my 0 -mz 0 polySurface1.f[0:682];
这句可以挤出面。
现在要在通道框里改几个属性,Keep Face Tog属性改为on,Scale X为-1,Translate X为模型宽度的负值(我的是-7.5)。
历史窗多了三行有用的命令:
setAttr "polyExtrudeFace1.keepFacesTogether" on;
setAttr "polyExtrudeFace1.translateX" -7.5;
setAttr "polyExtrudeFace1.scaleX" -1;
现在你可以看出来模型面的法线反了,好,把它正过来。按F8回到物体选择模式,选择Edit Polygons->Normals->Reverse。
这回你该从这几行命令中看出有用的命令了:
polyNormal -normalMode 0 -ch 1 polySurface1.f[0:1449];
下一步是Polygons->Smooth,找到这句命令:
polySmooth -mth 0 -dv 1 -c 1 -kb 1 -ksb 1 -khe 0 -kt 1 -sl 1 -dpe 1 -ps 0.1 -ro 1 -ch 1 polySurface1.f[0:1449];
最后是取消模型的选择:
select -cl ;
好了,操作结束。来整理一下有用的命令吧,结果如下:
polyExtrudeFacet -ch 1 -kft 0 -pvx -3.926295877 -pvy -1.118658066 -pvz 4.649739981 -tx 0 -ty 0 -tz 0 -rx 0 -ry 0 -rz 0 -sx 1 -sy 1 -sz 1 -ran 0 -divisions 1 -off 0 -ltz 0 -ws 0 -ltx 0 -lty 0 -lrx 0 -lry 0 -lrz 0 -lsx 1 -lsy 1 -lsz 1 -ldx 1 -ldy 0 -ldz 0 -w 0 -gx 0 -gy -1 -gz 0 -att 0 -mx 0 -my 0 -mz 0 polySurface1.f[0:682];
setAttr "polyExtrudeFace1.keepFacesTogether" on;
setAttr "polyExtrudeFace1.translateX" -7.5;
setAttr "polyExtrudeFace1.scaleX" -1;
polyNormal -normalMode 0 -ch 1 polySurface1.f[0:1449];
polySmooth -mth 0 -dv 1 -c 1 -kb 1 -ksb 1 -khe 0 -kt 1 -sl 1 -dpe 1 -ps 0.1 -ro 1 -ch 1 polySurface1.f[0:1449];
select -cl ;
把这几行命令都选中,用鼠标左键拖放到Shelf工具条上,Shelf上出现mel图标。重新载入模型文件,按一下这个mel图标,你又一次成功了
对Maya熟悉一点的人会觉得那三个setAttr用的很愚蠢,因为完全可以在polyExtrudeFacet命令的标志中解决问题。
其实我们的第一步只是要求做到,第二步才是要求做好。以下是简化过的结果:
polyExtrudeFacet -ch 1 -kft 1 -pvx -3.926295877 -pvy -1.118658066 -pvz 4.649739981 -translateX -7.5 -ty 0 -tz 0 -rx 0 -ry 0 -rz 0 -scaleX -1 -sy 1 -sz 1 -ran 0 -divisions 1 -off 0 -ltz 0 -ws 0 -ltx 0 -lty 0 -lrx 0 -lry 0 -lrz 0 -lsx 1 -lsy 1 -lsz 1 -ldx 1 -ldy 0 -ldz 0 -w 0 -gx 0 -gy -1 -gz 0 -att 0 -mx 0 -my 0 -mz 0 polySurface1.f[0:682];
polyNormal -normalMode 0 -ch 1 polySurface1.f[0:1449];
polySmooth -mth 0 -dv 1 -c 1 -kb 1 -ksb 1 -khe 0 -kt 1 -sl 1 -dpe 1 -ps 0.1 -ro 1 -ch 1 polySurface1.f[0:1449];
select -cl ;
关于使用mel命令组合的方法,最后要提到一点,如果你执行命令时发觉mel历史窗没有变化,可以在mel编辑器勾选Script->Echo All Commands。一般我们不需要显示那么多命令,因为很多对我们没用,所以不选Echo All Commands。