摩尔网 > CG教程 > Autodesk Maya教程

教程 Maya基础MEL指令
  • 辅助软件:maya
  • |
  • 更新:2016-07-10 12:13
  •  

分享:

注:MEL指令普遍都有个-ch的引数,是用来指定要不要保留历史纪录的。一般来说,不保留纪录(-ch false)效率会较高。还有,多数指令都会返回一个值;你若要把这值纪录下来,可以用`括着指令,然后把它分配给一个变量。比如

 

string $name[] = `sphere`就会把新创的球名收录在$name里。不同的指令会返回不同的值类,所以你必须先查清楚才用恰当的变量来收录它们。

 

以下指令的写法只列出最常用的参数

 

 

--------------------------------------------------------------------------------

 

指令:(字符串)

 

功能:把括号里的字串当命令执行。

 

用法例子:看下一个例子。

 

 

--------------------------------------------------------------------------------

 

指令:pointPosition 物体.控制顶点

 

功能:查询控制顶点的位置。若加上-l选项就给回局部坐标,否则默认的是给回处于场景世界的全局坐标。NURBS表面的控制顶点用 cv[u索引][v索引] 指定;NURBS线的则用 cv[索引];多边形用 vtx[索引];粒子用 pt[索引]。

 

用法例子:造一个NURBS球和一个多边形盒子。先选前者再加选后者,然后执行

 

string $sel[] = `ls -sl`;

int $num[] = `polyuate -v $sel[1]`; --> 查询第二个(多边形)物体有多少颗控制顶点

int $i;

for ($i = 0; $i < $num[0]; $i++) {

string $exec = "pointPosition " + $sel[1] + ".vtx[" + $i + "]"; --> 串出来的命令将纪录顶点位置

float $pos[3] = ($exec); --> 执行上述命令

string $dup[] = `duplicate $sel[0]`; --> 复制;把复制物体的名字收录在$dup里面

move $pos[0] $pos[1] $pos[2] $dup[0]; --> 把复制物体移动到顶点位置

}要查询NURBS物体的控制点数会比较麻烦,没直接命令可以做到。日后在作业一:对称工具里我们会探讨怎么解决这问题。

 

 

--------------------------------------------------------------------------------

 

指令:ls -sl

 

功能:列出被选物体的名称。指令给回的是个字符串组。如果选中的是模型组件(点,线,面),指令会给回压缩了的列表,比如若选中了curve1的第一至第五控制顶点的话,指令就会报curve1.cv[0:4];指令还有一个选项-fl可以给你不经压缩的列表。

 

用法例子:选择一些物体,然后执行

 

string $sel[] = `ls -sl`;

int $num = size($sel);

int $i;

for ($i = 0; $i < $num; $i++) rename $sel[$i] ("new" + $i);

--------------------------------------------------------------------------------

 

指令:select 物体名

 

功能:选择场景内的任何节点或模型组件。select -cl会清除选表。你也可以选择物体的旋转或缩放轴心,就用(比如)select transform1.scalePivot和select transform1.rotatePivot。

 

用法例子:造一条有七颗顶点的NURBS线。然后顺序个别执行select curve1,select -cl和select curve1.cv[0:2] curve1.cv[5]。

 

 

--------------------------------------------------------------------------------

 

指令:createNode 节点类名 -n 节点名 -p transform父节点

 

功能:制造一个新节点。若新节点有形状的话,一定要用-p赋予它一个transform节点。节点类名可以参考help > node and attribute reference。

 

用法例子:看下一个例子。

 

 

--------------------------------------------------------------------------------

 

指令:getAttr 属性名;setAttr 属性名 属性值;connectAttr 源属性 终属性

 

功能:查询,设定与连接属性。还有listAttr可以让你列出所选节点上的所有属性,但这指令较少在脚本派上用场。

 

用法例子1:

 

sphere;

createNode transform -n transform1;

createNode nurbsSurface -n surface1 -p transform1;

connectAttr makeNurbSphere1.outputSurface surface1.create;

setAttr transform1.translateX 5;选那NURBS球,改一改它的半径,然后执行getAttr makeNurbSphere1.radius看看。

 

例子2:getAttr有个引数“-t 帧数”可以让你查询属性处于某个帧数时的状态。

 

制造三粒球。给第一粒球key一些简单动作。然后设立以下表达式。

 

nurbsSphere2.translateX = `getAttr -t (frame-5) nurbsSphere1.translateX`;

nurbsSphere2.translateY = `getAttr -t (frame-5) nurbsSphere1.translateY`;

nurbsSphere2.translateZ = `getAttr -t (frame-5) nurbsSphere1.translateZ`;

nurbsSphere3.translateX = `getAttr -t (frame-10) nurbsSphere1.translateX`;

nurbsSphere3.translateY = `getAttr -t (frame-10) nurbsSphere1.translateY`;

nurbsSphere3.translateZ = `getAttr -t (frame-10) nurbsSphere1.translateZ`;

--------------------------------------------------------------------------------

 

指令:move x y z 物体/轴心/组件;rotate x y z 物体/轴心/组件;scale x y z 物体/轴心/组件

 

功能:移动,旋转或缩放物体。若没指定物体名的话,就在选中物体身上执行。默认的xyz值是绝对值,如move 0 0 0 object1就会把object1移到世界源点。若在物体名前加-r项目的话,xyz值就是相对值,如move -r 0 0 0 object1就不会有任何效果。

 

 

--------------------------------------------------------------------------------

 

makeIdentity -a true 物体名

 

功能:冻结物体的空间转变(则移动,旋转或缩放)。这等于Maya主页菜单里的modify > freeze transformations。若没指定物体名的话,指令会在选中物体身上执行。

 

 

--------------------------------------------------------------------------------

 

指令:pointOnSurface -u u坐标 -v v坐标 -p或-nn或-ntu或-ntv 表面名

 

功能:查询NURBS表面某一点(用-u和-v指定)的位置(-p),法线(-nn),向着u的tangent矢量(-ntn)或向着v的tangent矢量(-ntv)。

 

例子:打开hill.mb场景。察看一下景内物体和材质的名字。执行以下程序

 

int $i;

float $u, $v;

float $pos[];

for( $i = 0; $i < 2000; $i++ ) {

$u = rand(1);

$v = rand(1);

$pos = `pointOnSurface -u $u -v $v -p terrain`;

polyCone -ch off -r 0.2 -h 0.6 -sx 3 -tx false -ax 0 1 0;

move $pos[0] ($pos[1]+0.3) $pos[2];

}

--------------------------------------------------------------------------------

 

指令:colorAtPoint -u u坐标 -v v坐标 -o 通道 贴图节点名

 

功能:查询贴图节点的颜色和遮罩通道的资料。-o选项可以是RGB, A或RGBA。指令会返回浮点数组。

 

例子:打开Hypershade,在里面执行create > 2D textures > File,导入ai.iff作为贴图文件。关掉Hypershade,执行以下MEL程序。

 

// 画一块polygon面

polyCreateFacet -ch false -p -0.22 0.97 0.25 -p -0.22 -0.97 0.25 -p 0.22 -0.97 0.25 -p 0.22 0.97 0.25;

// 加其它面,以形成一个钝边盒子

polyAppend -ch false -ed 2 -p 0.25 -0.97 0.22 -p 0.25 0.97 0.22;

polyAppend -ch false -ed 5 -p 0.25 -0.97 -0.22 -p 0.25 0.97 -0.22;

polyAppend -ch false -ed 8 -p 0.22 -0.97 -0.25 -p 0.22 0.97 -0.25;

polyAppend -ch false -ed 11 -p -0.22 -0.97 -0.25 -p -0.22 0.97 -0.25;

polyAppend -ch false -ed 14 -p -0.25 -0.97 -0.22 -p -0.25 0.97 -0.22;

polyAppend -ch false -ed 17 -p -0.25 -0.97 0.22 -p -0.25 0.97 0.22;

polyAppend -ch false -ed 20 -p -0.22 -0.97 0.25 -p -0.22 0.97 0.25;

polyAppend -ch false -ed 3 -p 0.22 1 0.22 -p -0.22 1 0.22;

polyAppend -ch false -ed 25 -p 0.25 0.97 0.22;

polyAppend -ch false -ed 29 -p 0.25 0.97 -0.22 -p 0.22 1 -0.22;

polyAppend -ch false -ed 31 -p 0.22 0.97 -0.25;

polyAppend -ch false -ed 34 -p -0.22 0.97 -0.25 -p -0.22 1 -0.22;

polyAppend -ch false -ed 36 -p -0.25 0.97 -0.22;

polyAppend -ch false -ed 39 -p -0.25 0.97 0.22 -p -0.22 1 0.22;

polyAppend -ch false -ed 41 -p -0.22 0.97 0.25;

polyAppend -ch false -ed 26 -p 0.22 1 -0.22 -p -0.22 1 -0.22;

// 把重叠的控制点结合起来

polyMergeVertex -ch false -d 0.01 polySurface1.vtx[0:31];

select -cl;

// 摆好位子,准备复制

move -6.65 0 -6.65 polySurface1;

int $i;

// 复制第一行;注意怎么收录复制物的默认名字

for( $i = 1; $i <= 19; $i++ ) {

string $dupname[] = `instance polySurface1`;

move ($i * 0.7 - 6.65) 0 -6.65 $dupname[0];

}

// 其它行列

int $j;

for( $j = 1; $j <= 19; $j++ )

for( $i = 0; $i < 20; $i++ ){

float $x = $i * 0.7 - 6.65;

float $z = $j * 0.7 - 6.65;

// 计算x和z坐标在-6.5至6.5的范围内的比例

float $u = linstep(-6.5, 6.5, $x);

float $v = linstep(-6.5, 6.5, $z);

// 主角出场啦

float $y[] = `colorAtPoint -u $u -v $v -o RGBA file1`;

string $dupname[] = `instance polySurface1`;

move $x $y[0] $z $dupname[0];

}点着视窗的smooth shade看看。你知道为什么显示的字是倒转的吗?怎么扶正它?

 

 

--------------------------------------------------------------------------------

 

指令:getFileList -fld 文件夹 -fs 批量缩写

 

功能:列出文件夹里有些什么文件。指令返回字符串数组。

 

例子:getFileList -fld "C:/Program Files/" -fs "*.mel" 会返回在C:/Program Files内所有拥有.mel扩展名的文件。

 

 

--------------------------------------------------------------------------------

 

指令:chdir 路径

 

功能:和NT的cd命令相同

 

例子:chdir "C:/temp"

 

 

--------------------------------------------------------------------------------

 

指令:sysFile -md 文件夹;sysFile -del 文件;sysFile -ren 新文件名 旧文件名;sysFile -cp 复制文件 原本文件

 

功能:创造文件夹,删除文件,改文件名和复制文件

 

 

--------------------------------------------------------------------------------

 

指令:system 系统命令

 

功能:这简单的指令极为强大;它让你执行Maya以外的系统命令;换言之,它使Maya可以控制其它软件。

 

例子:system "XSI" // 注:得先设好命令路径才能执行

 

 

--------------------------------------------------------------------------------

 

指令:tokenize 字符串 分界符号 字符串数组

 

功能:根据分界符号把字符串分成多份子字串,存入数组里。

 

例子:

 

string $buffer[];

tokenize "This.is.a.test" "." $buffer;过后$buffer就含{"This", "is", "a", "test"}。

 

 

--------------------------------------------------------------------------------

 

指令:filetest -r 文件

 

功能:若文件存在的话就返回1,否则返回0。

 

应用例子:课程示范文件夹里的sourceimages有一连串叫dropframe的图。你有留意到第10-11,15-17,20,23帧图不在吗?这跳帧问题在实际制作环境里常发生,原因可能是人为的疏忽或渲染器的计算出了错。当你有几千帧图时,如何能查出缺了什么帧和怎样去填补它们?

 

// 注:执行前先把dropframe.mb抄到你的project里头

chdir "D:/bbi/MEL/sourceimages";

int $i;

for( $i = 1; $i <= 25; $i++ ) {

string $file = "dropframe." + $i;

if( !`filetest -r $file` ) {

string $rencmd = "render -s " + $i + " -e " + $i + " dropframe.mb";

system $rencmd;

}

}

--------------------------------------------------------------------------------

 

指令:fopen;fclose;fwrite;fread;fprint;fgetword;fgetline;frewind;feof

 

功能:一组读写文件的指令。

 

fopen 文件名 w或a或r或w+或r+ 打开一份文件供你写(w),加写(a),读(r)或读写(w+或r+)。指令返回一个整数文件标,过后所有读写工作都用这标签进行 -- 这跟C的做法一样。

 

fclose 文件标 关掉文件。做完一切读写工作后可要记得执行这指令哦。

 

fwrite 文件标 数据 把数据以二进制形式写进文件里。若数据是字符串的话,别用这个指令,用fprint。 fwrite和fprint都不是即时把数据写出去的;它们会把数据累积在一个buffer,直到buffer满了才把所有内容输出去文件里。

 

fread 文件标 核对数据 由文件里读取数据,然后返回它;数据的类必须和核对数据匹配。

 

fprint 文件标 字符串 把字符串写进文件里。

 

fgetword 文件标 返回下一个空格后的字串。

 

fgetline 文件标 返回下一行字。

 

frewind 文件标 把内容指标倒退回去文件起点。

 

feof 文件标 若内容指标到了文件尾就返回1,否则返回0。

 

应用例子:

 

chdir "C:/temp";

int $fid = `fopen "testdoc1" "w"`;

float $pi = 3.142;

fwrite $fid $pi;

fclose $fid;

 

$fid = `fopen "testdoc2" "w"`;

fprint $fid $pi;

fclose $fid;若你用写字板打开testdoc1来看的话,你就会看到内容是二进制符号,而testdoc2的则是ASCII文字。你过后可以用

 

chdir "C:/temp";

int $fid = `fopen "testdoc1" "r"`;

float $receive;

$receive = `fread $fid $receive`;

fclose $fid;

print $receive;读取testdoc1里头的数据。另一个例子:先创造几个物体,选着它们,然后执行

 

string $sel[] = `ls -sl`;

int $num = size($sel);

string $str = "你选了" + $num-- + "个物体:"; // $num的现值被利用后才减一

int $i;

for ($i = 0; $i < $num; $i++) $str += $sel[$i] + ",";

if ($num) $str += "和";

$str += $sel[$num] + "。n";

$str += "作者:" + `getenv "USERNAME"` + "n"; // getenv会返回一个环境变量的值;这里我们用它来查询现任登入者的名字

$str += "日期:" + `system "date /t"`; // date是Windows的系统命令,报告今天的日期

$str += "时间:" + `system "time /t"`; // time也是系统命令,报告现在的时间

 

chdir "C:/temp";

int $fid = `fopen "test.doc" "w"`;

fprint $fid $str;

fclose $fid;用刚才的文件做最后一个例子:

 

chdir "C:/temp";

int $fid = `fopen "test.doc" "r"`;

fgetline $fid; fgetline $fid; fgetword $fid; frewind $fid; fgetword $fid;

fclose $fid;

--------------------------------------------------------------------------------

 

指令:expression_r_r [-e] -s 表达式字串 -n 表达式节点名

 

功能:设立或改变(-e)表达式。Maya的每一段表达式都是一种DG节点,而你在设立它时可以给它一个名字,以方便过后寻找。

 

应用例子:打开count.mb。执行

 

string $str = ""; int $i;

for ($i = 0; $i <= 5; $i++)

$str += "sec" + $i + ".visibility = frame >= " + ($i*25) + " && frame < " + ($i*25+25) + ";n";

for ($i = 0; $i <= 24; $i++)

$str += "fr" + $i + ".visibility = frame%25 == " + $i + ";n";

expression_r_r -n expr1 -s $str;

--------------------------------------------------------------------------------

 

指令:setKeyframe -at 属性 -t 帧 -v 值 节点

 

功能:设置关键帧

 

应用例子:打开count.mb。执行

 

int $i;

for ($i = 0; $i <= 5; $i++) {

setKeyframe -t ($i*25-1) -v 0 -at visibility ("sec"+$i);

setKeyframe -t ($i*25) -v 1 -at visibility ("sec"+$i);

setKeyframe -t ($i*25+25) -v 0 -at visibility ("sec"+$i);

}

for ($i = 0; $i <= 24; $i++) {

setKeyframe -t $i -v 1 -at visibility ("fr"+$i);

setKeyframe -t ($i+1) -v 0 -at visibility ("fr"+$i);

setKeyframe -t ($i+25) -v 1 -at visibility ("fr"+$i);

setInfinity -pri cycle -poi cycle -at visibility ("fr"+$i); // 使动作循环

}

--------------------------------------------------------------------------------

 

指令:refresh -cv

 

功能:刷新屏幕

 

例子:打开window > settings/preferences > preferences,删掉undo。然后执行

 

polyCreateFacet -ch off -p -7.4 0 -3.4 -p -6.6 0 -3.4 -p -6.6 0 -2.6 -p -7.4 0 -2.6;

int $i;

for ($i = 0; $i < 115; $i++) {

polyExtrudeFacet -ch off -ws on -rx 20 -tx 0.12 polySurfaceShape1.f[0];

select -cl;

}清场。执行

 

polyCreateFacet -ch off -p -7.4 0 -3.4 -p -6.6 0 -3.4 -p -6.6 0 -2.6 -p -7.4 0 -2.6;

int $i;

for ($i = 0; $i < 115; $i++) {

polyExtrudeFacet -ch off -ws on -rx 20 -tx 0.12 polySurfaceShape1.f[0];

select -cl;

refresh -cv;

}你觉得哪个做法比较好?

 

记得把undo还原啊!

 

 

--------------------------------------------------------------------------------

 

currentTime 帧

 

功能:改场景时间

 

 

--------------------------------------------------------------------------------

 

指令:optionVar -iv 变量名 整数 -fv 变量名 浮点数 -sv 变量名 字符串 -rm 变量名 -q 变量名

 

功能:设立,更改,查询(-q)或删除(-rm)永久性的变量。这些变量收藏在$MAYA_APP_DIR/4.5/prefs/userPrefs.mel里。

 

例子:执行optionVar -iv testvar 1234567;重开Maya;执行optionVar -q testvar。

 

 

--------------------------------------------------------------------------------

 

指令:timerX -st 开始时间

 

功能:计算时间的流逝。这指令的用法有点特别 -- 你必须执行它两次,第一次不用-st,以纪录现时,而第二次就用-st把刚才纪录的时间传入,让指令返回中间流逝的秒数。

 

float $tstart = `timerX`;

int $i; for ($i = 0; $i < 10000; $i++);

timerX -st $tstart;

--------------------------------------------------------------------------------

 

指令:flushUndo

 

功能:把复原历史清除掉。如果你的循环句子里包含复杂的建模工作,你应该把这指令也写进去,要不然你的程序会消耗大量内存。注:复原历史不是建模历史;就算你的指令用-ch off,它还是会产生复原历史(如果你没关了它)。

 

例子:开着任务管理器。执行

 

polyCreateFacet -ch off -p -7.4 0 -3.4 -p -6.6 0 -3.4 -p -6.6 0 -2.6 -p -7.4 0 -2.6;

int $i;

for ($i = 0; $i < 600; $i++) {

polyExtrudeFacet -ch off -ws on -rx 2 -tx 0.01 polySurfaceShape1.f[0];

select -cl;

refresh -cv;

}注意内存的消耗指数。

 

重开Maya,执行

 

polyCreateFacet -ch off -p -7.4 0 -3.4 -p -6.6 0 -3.4 -p -6.6 0 -2.6 -p -7.4 0 -2.6;

int $i;

for ($i = 0; $i < 600; $i++) {

polyExtrudeFacet -ch off -ws on -rx 2 -tx 0.01 polySurfaceShape1.f[0];

select -cl;

refresh -cv;

flushUndo;

}同一个程序,但加了flushUndo之后,内存消耗量大大减少了。

 

 

--------------------------------------------------------------------------------

 

指令:memory -fr

 

功能:报告剩下的内存量,返回值的类是浮点数组。

 

例子:

 

polyCreateFacet -ch off -p -7.4 0 -3.4 -p -6.6 0 -3.4 -p -6.6 0 -2.6 -p -7.4 0 -2.6;

int $i;

while (1) {

float $freemem[] = `memory -fr`;

if ($freemem[0] < 300) break; // 若只剩三百兆内存就终止循环

polyExtrudeFacet -ch off -ws on -rx 2 -tx 0.01 polySurfaceShape1.f[0];

select -cl;

refresh -cv;

}

上一篇:   动画运动规则 下一篇:   PS建筑表现后期几个要点

发表评论
添加表情
 
Copyright @ 2012-2016 苏州萌动网络技术有限公司版权所有 苏ICP备12073144号