好酷屋

Maya基础MEL指令

好酷屋

发布于2024-08-05

好酷屋教程网小编为您收集和整理了Maya基础MEL指令的相关教程:注:MEL指令普遍都有个-ch的引数,是用来指定要不要保留历史纪录的。一般来说,不保留纪录(-chfalse)效率会较高。还有,多数指令都会返回一个值;你若要把这值纪录下来,可以用`括着指令,然后把它

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

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

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

——————————————————————————–

指令:(字符串)

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

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

——————————————————————————–

指令:pointposition物体.控制顶点

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

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

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

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

int$i;

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

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

float$pos=($exec);–>执行上述命令

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

move$pos$pos$pos$dup;–>把复制物体移动到顶点位置

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

——————————————————————————–

指令:ls-sl

功能:列出被选物体的名称。指令给回的是个字符串组。如果选中的是模型组件(点,线,面),指令会给回压缩了的列表,比如若选中了curve1的第一至第五控制顶点的话,指令就会报curve1.cv;指令还有一个选项-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会清除选表。你也可以选择物体的旋转或缩放轴心,就用(比如)selecttransform1.scalepivot和selecttransform1.rotatepivot。

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

——————————————————————————–

指令:createNode节点类名-n节点名-ptransform父节点

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

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

——————————————————————————–

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

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

用法例子1:

sphere;

createNodetransform-ntransform1;

createNodenurbsSurface-nsurface1-ptransform1;

connectAttrmakeNurbSphere1.outputSurfacesurface1.create;

setAttrtransform1.translateX5;选那NURBS球,改一改它的半径,然后执行getAttrmakeNurbSphere1.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`;

——————————————————————————–

指令:movexyz物体/轴心/组件;rotatexyz物体/轴心/组件;scalexyz物体/轴心/组件

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

——————————————————————————–

makeIdentity-atrue物体名

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

——————————————————————————–

指令:pointOnSurface-uu坐标-vv坐标-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-pterrain`;

polyCone-choff-r0.2-h0.6-sx3-txfalse-ax010;

move$pos($pos+0.3)$pos;

}

——————————————————————————–

指令:colorAtpoint-uu坐标-vv坐标-o通道贴图节点名

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

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

//画一块polygon面

polyCreateFacet-chfalse-p-0.220.970.25-p-0.22-0.970.25-p0.22-0.970.25-p0.220.970.25;

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

polyAppend-chfalse-ed2-p0.25-0.970.22-p0.250.970.22;

polyAppend-chfalse-ed5-p0.25-0.97-0.22-p0.250.97-0.22;

polyAppend-chfalse-ed8-p0.22-0.97-0.25-p0.220.97-0.25;

polyAppend-chfalse-ed11-p-0.22-0.97-0.25-p-0.220.97-0.25;

polyAppend-chfalse-ed14-p-0.25-0.97-0.22-p-0.250.97-0.22;

polyAppend-chfalse-ed17-p-0.25-0.970.22-p-0.250.970.22;

polyAppend-chfalse-ed20-p-0.22-0.970.25-p-0.220.970.25;

polyAppend-chfalse-ed3-p0.2210.22-p-0.2210.22;

polyAppend-chfalse-ed25-p0.250.970.22;

polyAppend-chfalse-ed29-p0.250.97-0.22-p0.221-0.22;

polyAppend-chfalse-ed31-p0.220.97-0.25;

polyAppend-chfalse-ed34-p-0.220.97-0.25-p-0.221-0.22;

polyAppend-chfalse-ed36-p-0.250.97-0.22;

polyAppend-chfalse-ed39-p-0.250.970.22-p-0.2210.22;

polyAppend-chfalse-ed41-p-0.220.970.25;

polyAppend-chfalse-ed26-p0.221-0.22-p-0.221-0.22;

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

polyMergeVertex-chfalse-d0.01polySurface1.vtx;

select-cl;

//摆好位子,准备复制

move-6.650-6.65polySurface1;

int$i;

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

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

string$dupname[]=`instancepolySurface1`;

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

}

//其它行列

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-oRGBAfile1`;

string$dupname[]=`instancepolySurface1`;

move$x$y$z$dupname;

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

——————————————————————————–

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

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

例子:getFileList-fld"C:/programFiles/"-fs"*.mel"会返回在C:/programFiles内所有拥有.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-nexpr1-s$str;

——————————————————————————–

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

功能:设置关键帧

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

int$i;

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

setKeyframe-t($i*25-1)-v0-atvisibility("sec"+$i);

setKeyframe-t($i*25)-v1-atvisibility("sec"+$i);

setKeyframe-t($i*25+25)-v0-atvisibility("sec"+$i);

}

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

setKeyframe-t$i-v1-atvisibility("fr"+$i);

setKeyframe-t($i+1)-v0-atvisibility("fr"+$i);

setKeyframe-t($i+25)-v1-atvisibility("fr"+$i);

setInfinity-pricycle-poicycle-atvisibility("fr"+$i);//使动作循环

}

——————————————————————————–

指令:refresh-cv

功能:刷新屏幕

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

polyCreateFacet-choff-p-7.40-3.4-p-6.60-3.4-p-6.60-2.6-p-7.40-2.6;

int$i;

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

polyExtrudeFacet-choff-wson-rx20-tx0.12polySurfaceShape1.f;

select-cl;

}清场。执行

polyCreateFacet-choff-p-7.40-3.4-p-6.60-3.4-p-6.60-2.6-p-7.40-2.6;

int$i;

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

polyExtrudeFacet-choff-wson-rx20-tx0.12polySurfaceShape1.f;

select-cl;

refresh-cv;

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

记得把undo还原啊!

——————————————————————————–

currentTime帧

功能:改场景时间

——————————————————————————–

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

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

例子:执行optionVar-ivtestvar1234567;重开Maya;执行optionVar-qtestvar。

——————————————————————————–

指令:timerX-st开始时间

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

float$tstart=`timerX`;

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

timerX-st$tstart;

——————————————————————————–

指令:flushUndo

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

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

polyCreateFacet-choff-p-7.40-3.4-p-6.60-3.4-p-6.60-2.6-p-7.40-2.6;

int$i;

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

polyExtrudeFacet-choff-wson-rx2-tx0.01polySurfaceShape1.f;

select-cl;

refresh-cv;

}注意内存的消耗指数。

重开Maya,执行

polyCreateFacet-choff-p-7.40-3.4-p-6.60-3.4-p-6.60-2.6-p-7.40-2.6;

int$i;

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

polyExtrudeFacet-choff-wson-rx2-tx0.01polySurfaceShape1.f;

select-cl;

refresh-cv;

flushUndo;

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

——————————————————————————–

指令:memory-fr

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

例子:

polyCreateFacet-choff-p-7.40-3.4-p-6.60-3.4-p-6.60-2.6-p-7.40-2.6;

int$i;

while(1){

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

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

polyExtrudeFacet-choff-wson-rx2-tx0.01polySurfaceShape1.f;

select-cl;

refresh-cv;

}

以上就是好酷屋教程网小编为您收集和整理的Maya基础MEL指令相关内容,如果对您有帮助,请帮忙分享这篇文章^_^

本文来源: https://www.haoku5.com/IT/66b08f69d6c56d77330c2822.html

相关推荐

    热门专题