mel语初解之一-基础和界面篇

本文主要是针对初学Maya的人,如果你已经学了一个月以上的Maya,那你就可以学习这篇mel教程了。

我来写一点mel扫盲教程,主要是针对初学Maya的人,如果你已经学了一个月以上的Maya,那你就可以学习这篇mel教程了。不一定要等到Maya掌握的非常熟练才去学mel,相反,如果你在初学Maya的时候就对mel有所了解,那对于将来更好的了解和掌握Maya会起到事半功倍的效果。

当然首先要提到的是mel的基本概念,如下:
mel是Maya Embedded Language(Maya内置语言)的缩写,是一种强大的命令和脚本语言,让你直接控制Maya的特征、进程和工作流程。

其次要提到的是应该抱怎样的态度:
有许多人认为mel比较难,我的看法是并不比游戏攻关难,在网上经常看到有人为攻一关花掉一个月时间,学mel如果能达到这个境界一定会很了不起。学mel的确可能会枯躁一些,因为找不到像CS那么多人给你去杀。
mel是个可大可小的东西,如果你不是搞程序开发的,应该尽可能的让mel给你节省时间,而不要在学习和编写mel程序上花太多时间,应尽量编写简单且实用的程序。我的教程也是针对这一点写的,如果你已经做好了准备,就和我一起进入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。

通过myFullMoon1.0我们可以把一半脸变成整张脸,但如果你发现这张脸不够美观想回到半脸状态修改怎么办?我告诉你,按z键撤消上一步操作。这应该不是你不知道的,但你可能因旋转相机观察而已经操作了很多步无法撤回了,还存了盘。

如果你没删构造历史,那你就是幸运的。介绍一个命令--"delete",就是你按键盘delete键所执行的命令。执行"delete polySurface1",瞧,把你那个整张脸模型都删去了吧。如果你真的都删去了,赶快撤消这一步,因为这不是你我想做的事。我们来编一个恢复成半张脸的程序myHalfMoon。

实例3:myHalfMoon
你一定猜到我这回要用函数了,对,把下面的几句代码执行一下:
global proc myHalfMoon()
{
delete polySmoothFace1;
delete polyNormal1;
delete polyExtrudeFace1;
}

执行完了,好像不起作用,因为你还不知道它的作用。你不知道你在不知不觉中已经定义了一个mel命令,命令的名称就是"myHalfMoon"。试试吧,选中模型,在命令行输入"myHalfMoon",按回车,命令就起作用了。现在如果说myHalfMoon就是个mel函数,你应该觉得比天书容易理解一点了吧。
------------------------------------------------------
[注]
关于Maya中的函数概念问题,按以前的说法,说myHalfMoon是函数是不严谨的。
"A function is a procedure with a return value. " [Maya 4.5 Help docs]
函数是带有返回值的程序。

这样myHalfMoon只能应称之为程序(procedure),带有返回值的程序才叫函数(Functions)。不过这样反而带来麻烦,我很高兴看到Maya5.0已经改变了这种说法。

"User defined functions are called procedures. " [Maya 5.0 Help docs] 用户定义的函数称之为程序(procedure)。以前的定义不见了,言下之意函数的定义跟返回值没什么关系了。

这下子可能给你带来了更多的疑问,我先回答几个吧。

问:Maya中的mel命令都是通过mel函数编出来的吗?
答:不是。有900多个Maya内置命令,这些命令是寄生在Maya模块文件(WinNT版的模块文件就是dll文件或mll文件),是已经编译好的汇编指令组合。内置命令命令一般都带有标志(Flag),而mel函数命令没有标志。mel函数命令通常被称为“脚本命令”(Script Command),内置命令则直接称“命令”(Command)。

问:怎样才能知道一个命令是不是脚本命令?
答:用whatIs命令。
例如:"whatIs myHalfMoon;",结果中出现"Mel procedure"(mel程序)字样,说明是脚本命令。

问:返回值是个什么东东?
答:以后会讲到的。

相信你一定掌握了把myFullMoon也变成函数的本领了吧,如果还没掌握我可要怀疑你的智商了。不过呢,反正我的教程也是白痴级的,我就把它说白了吧:
------------------------------------------------------
实例4:myFullMoon2.0
把Shelf上那个myFullMoon图标用鼠标中键拖放到mel编辑窗,把mel代码洒到编辑窗里。然后把这些代码写到"global proc myFullMoon(){ }"的大括号里,如下:
global proc myFullMoon(){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 ;}

我不得不在一开始就强调格式问题,你的代码虽然没错,但代码不只是给机器用的,还要给人看。以下是改过格式的代码:

global proc myFullMoon(){
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文件,注意文件名必须是"myFullMoon.mel"(脚本命令名 + ".mel"),然后把这个文件放到"我的文档\e:\My Documents\maya\4.5(5.0)\scripts"目录中。这样当你每次启动Maya时,"myFullMoon"命令就能像Maya的其它命令一样工作了。

把Shelf上以前的mel图标删掉(就是把mel图标用鼠标中键拖进Shelf最右边的小垃圾桶里)。把"myFullMoon"这几个字拖到Shelf上重新建立图标。图标上加几个字(mFM),如图。以后升级"myFullMoon"的时候图标命令依旧,只要改"myFullMoon.mel"文件就行了。

教程未完,请看下一页!

学习 · 提示

  • 打开ps,跟着教程做一遍,做完的图要到这里交作业:提交作业
  • 教程有看不懂的地方,可以到论坛发帖提问:ps新手求助
  • 加官方微信,随时随地,想学就能学:ps_bbs,或扫右侧二维码!
  • 关注我们微博:@photoshop教程论坛
  • 想学更多的同学,可以订阅我们邮件,每天都有新教程发给你:http://t.cn/Rzm5o8Y
PS教程自学网 欢迎投稿教程:http://i.16xx8.com

收藏到:
19215人学习过
    梦醒say 说: 辛苦
    说: 不够详细
    随便你的一切 说: 要视频
    用xin珍惜 说: 辛苦了
    胖O纸 说: 学习了,不过还是有些细节没说好
    桐桐的太阳 说: 有视频就好了
    陈军波 说: 竟然没人评论
    大 说: 超赞的文章
    4 说: 挺牛逼的
    4 说: