Maya基础MEL指令
好酷屋教程网小编为您收集和整理了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
相关推荐
热门专题
PS快捷键_PS快捷键大全
经典的Photoshop快捷键大全,如果你是入门阶段的水平,熟读此文并掌握,马上进阶为中级水平。matlab怎么换行?matlab换行教程
今天小编为大家带来的是matlab换行的教程,想知道怎么换行的小伙伴来看看接下来的这篇文章吧,相信一定会帮到你们的。matlab怎么换行?matlab换行教程1、首先在matlab主页面板中点击【Matlab求矩阵的乘积的操作方法
很多用户在使用Matlab的时候,不是很熟悉其中怎么求矩阵的乘积的?本期为你们带来的教程就描述了Matlab求矩阵的乘积的操作方法。Matlab求矩阵的乘积的操作方法打Matlab,在命令行窗口分区工具diskgenius强制删除文件的具体使用流程
很多人不知道分区工具diskgenius如何强制删除文件?今日为你们带来的文章是关于分区工具diskgenius强制删除文件的具体含义讲解,还有不清楚小伙伴和小编一起去学习一下吧。分区工具diskggoldwave怎么启用延迟录制计时器?goldwave启用延迟录制计时器教程
很多小伙伴在使用goldwave的时候,想知道怎么启用延迟录制计时器,下面小编就为大家分享教程,感兴趣的小伙伴不要错过哦!goldwave怎么启用延迟录制计时器?goldwave启用延迟录制计时器教pycharm使用技巧
今天小编给大家讲解pycharm使用技巧,有需要或者有兴趣的朋友们可以看一看下文,相信对大家会有所帮助的。pycharm使用技巧使用PyCharm软件需要python运行环境,这里我已经下载好。CAD看图软件哪个好用?如何使用CAD看图软件
在CAD中,大家都知道CAD图纸是使用CAD制图软件来绘制完成的,那保存的格式就是为dwg格式和dxf格式的。那需要对图纸内容进行查看的时候,就要适用到CAD看图软件。但看图软件有很多,那么CAD看图diskgenius怎么将分区中的文件复制到指定目录?diskgenius将分区中的文件复制到指定目录方法
使用diskgenius的时候,很多小伙伴不知道怎么将分区中的文件复制到指定目录,下面小编就给大家带来方法,有需要的小伙伴不要错过哦。diskgenius怎么将分区中的文件复制到指定目录?diskg分区工具diskgenius将硬盘合并分区的详细流程
说起分区工具diskgenius伙伴们都不陌生,那么使用怎么使用分区工具将硬盘合并分区呢?下面一起看看关于分区工具diskgenius将硬盘合并分区的详细流程吧。分区工具diskgenius将硬盘合MathType中公式与文字错位的处理方法
最近有很多朋友向我咨询关于MathType中公式与文字错位的问题,今天就为大家介绍MathType中公式与文字错位的处理方法,希望能够帮助到大家。MathType中公式与文字错位的处理方法方法一