MEL 语言初级教程
Maya Mel基础教程(6)

Maya Mel基础教程(6)使用脚本语言结点一个脚本语言结点是一个包括了一个 MEL脚本语言程序的结点。
当该结点产生或者当该结点被破坏时,该程序被执行,它取决于脚本结点的类型。
本章包括以下内容:1、了解脚本语言结点;2、产生脚本语言结点;3、测试脚本语言;4、编辑脚本语言结点;5、设立脚本语言结点的执行;6、删除脚本语言结点。
3、测试脚本程序可以使用表达式编辑器对脚本程序进行测试。
为测试一个脚本程序:1--选择Window Expression Editor。
2--在表达式编辑器中选择Select Filter By Script Node Name。
3--在Script window中输入脚本程序,或从Script Nodes 表中。
4--点击Test Script键。
错误显示在脚本语言编辑器中。
4、编辑脚本语言结点可以使用表达式编辑器对脚本语言结点进行编辑。
为了对脚本语言的编辑定义一个编辑器:1--选择Window Expression Editor。
2--在表达式编辑器中选择Select Filter By Script Node Name。
3--从编辑器下拉菜单中选择一个编辑器。
为了编辑一个脚本语言结点:1--选择Window Expression Editor。
2--在表达式编辑器中选择Select Filter By Script Node Name。
3--选择你想在Script Nodes list中要编辑的脚本语言结点。
4--在Script window中编辑该脚本语言结点。
5--如果你想撤消你的改变,点击Reload。
Maya重装原来的脚本语言结点。
6--为了清理Script window,点击Clear键。
5、设立脚本语言结点的执行为了设立脚本语言结点的执行:1--选择File Open Scene。
或选择File Open然后在Open Scene window中点击Options。
Maya mel语言基础入门

一、了解MELMEL (Maya埋入式语言)为Maya提供了基础。
Maya界面的几乎每一个要点都是在MEL指令和脚本程序上建立的。
由于Maya给出了对于MEL自身的完全的访问,你可以扩展和定制Maya。
通过MEL,你可以进一步开发Maya使它成为你和你的项目的独特而创新的环境。
为有效地使用Maya,你并不非得精通MEL。
但是,熟悉MEL可以加深你使用Maya的专业能力。
使用MEL的许多方面可以由只有很少编程经验或者没有经验者所使用。
喜欢MEL 并不非得喜欢编程。
有一些方法,它们可以使你获得MEL的好处而不必考虑编程的细节。
一旦当你进行了产生MEL脚本语言的尝试,你会发现MEL可以给你提供可以想象到的最先进的数字化画图的方法。
为了获得Maya的输出,大部分可以使用MEL来做。
这里是你可以使用MEL来工作的一些例子:·使用MEL指令脱开Maya的用户界面,快速地产生热键,访问更深的要点。
·给属性输入准确的值,脱开由界面强制引起的拘谨的限制。
·对特定的场景自定义界面,对一个特定的项目改变缺省设置。
·产生MEL程序和执行用户建模、动画、动态和渲染任务的脚本程序。
如何使用本教程本教程叙述如何学习和使用Maya埋入式语言(MEL)。
如果你初次接触MEL,本教材帮助你在使用MEL指令和脚本程序方面开始起步。
一旦当你开始开发MEL程序的时候,本教材将继续帮助你,讲解如何能够使你获得用MEL产生的更多的指令、宏、程序和用户界面元素的输出。
本教材假定你对Maya已经有了基本的了解。
如果你完全是新开始学习Maya,请看一下学习Maya的教材,并对在Using Maya documentation set中描述的要点进行开发。
应该熟悉Maya的在线文件(见Online documentation)。
特别是应该使你自己熟悉MEL Command Reference和DG Node Reference。
maya语言mel文本教学第七课-mel脚本的打包操作

maya语言mel文本教学第七课-mel脚本的打包操作maya语言mel文本教学第七课mel脚本的打包操作本节课我们主要讲如果我们写好了一段mel,我们如何调用它,通过什么样的方式将mel 进行打包操作mel的打包操作分为,mel内部打包调用操作和mel外部打包整体操作内部打包是在我们写mel的时候我们事先写好一段执行语句,设置好变量后暂时不执行这段语句的操作,而是先将其存放在maya的内存中,当需要执行这段语句运算的时候,我们把相关的数据调入这段语句的变量中通过我们所写的语句执行操作得到我们要的结果。
这样可以简便我们的mel操作。
节省mel行数。
外部打包是我们将写好的完整的mel整体进行保存成 .mel 文件,当我们使用这段mel的时候可以通过mel文件的名字调用这段mel执行我们想要的操作。
就如同我们平时在网上下载的一些打包好的mel 一样。
在mel中我们打包mel是通过函数和子程序操作的我们执行打包的函数和子程序其实差不多,不同的是,函数一般用于数字的计算,而子程序一般是用于字符串的计算。
我们大家不用刻意的去区分函数和子程序的概念和类型,我们只把它当作是对一段mel运算方法的打包或者是一个计算模板就可以了。
首先我给大家讲解一下用于mel本体内调用的函数子程序的基本操作格式proc float name(float $x,float $y){float $z = $x+$y;return $z;}给大家解释一下我们要声明一个函数或者子程序我们要使用proc 进行声明,也就是说在mel中键入proc 的时候mel就会识别此操作为声明一个函数或者子程序的操作。
后面跟着的float是函数的返回值的类型此含义为函数返回值的类型为浮点型。
后面跟着的name是函数或者子程序的名称。
在括号里面是定义的函数参数和内容,这里面的参数根据我们编写脚本的需要来设置。
在下面的大括号里面的则是函数体。
也就是说函数或者子程序内部的代码。
MAYA MEL

1楼MEL (Maya埋入式语言)为Maya提供了基础。
Maya界面的几乎每一个要点都是在MEL指令和脚本程序上建立的。
由于Maya给出了对于MEL自身的完全的访问,你可以扩展和定制Maya。
通过MEL,你可以进一步开发Maya使它成为你和你的项目的独特而创新的环境。
为有效地使用Maya,你并不非得精通MEL。
但是,熟悉MEL可以加深你使用Maya的专业能力。
使用MEL的许多方面可以由只有很少编程经验或者没有经验者所使用。
喜欢ME L并不非得喜欢编程。
有一些方法,它们可以使你获得MEL的好处而不必考虑编程的细节。
一旦当你进行了产生MEL脚本语言的尝试,你会发现MEL可以给你提供可以想象到的最先进的数字化画图的方法。
为了获得Maya的输出,大部分可以使用MEL来做。
这里是你可以使用MEL来工作的一些例子:•使用MEL指令脱开Maya的用户界面,快速地产生热键,访问更深的要点。
•给属性输入准确的值,脱开由界面强制引起的拘谨的限制。
•对特定的场景自定义界面,对一个特定的项目改变缺省设置。
•产生MEL程序和执行用户建模、动画、动态和渲染任务的脚本程序。
如何使用本教程本教程叙述如何学习和使用Maya埋入式语言(MEL)。
如果你初次接触MEL,本教材帮助你在使用MEL指令和脚本程序方面开始起步。
一旦当你开始开发 MEL程序的时候,本教材将继续帮助你,讲解如何能够使你获得用MEL产生的更多的指令、宏、程序和用户界面元素的输出。
本教材假定你对Maya已经有了基本的了解。
如果你完全是新开始学习Maya,请看一下学习Maya的教材,并对在Using Maya documentation set中描述的要点进行开发。
应该熟悉Maya的在线文件(见Online documentation)。
特别是应该使你自己熟悉MEL Command Refer ence和DG Node Reference。
本教材的各处都有许多有关的MEL指令和程序码的例子。
Maya Mel基础教程(7)

Maya Mel基础教程(7)定义数据本章描述 MEL的数据类型它们之间的转换:1、变量;2、常数;3、数据类型转换;4、限制。
1、变量所有变量名以$开始。
变量名不包括空格和特殊字符。
你可以使用下划线和数字作为变量名但开头不能是数字。
识别大小写,如$temp不同于$Temp。
例:int $radical7Mark; // 有效int HEYchief; // ERROR: 开头缺”$”int $ nine; // ERROR: 开头不是”$”int $_VAL_ID___AIT_; // 有效int $howdyYa`ll; // ERROR: 含有无效字符int $1Bill; // ERROR: 开头不能是数字有以下五种变量类型:类型 意义 例子int 整数 (...-2, -1, 0, 1, 2...)10, -5, 和 0float 小数 392.6, 7.0, and -2.667string 一个或更多的字符 “What s up, chief?”vector 三个浮点数 3,?7.7,?9.1matrix 浮点数阵列 1.1, 2, 3; 6.7, 5, 4.9以上类型除matrix外,都可以是一个阵列。
如,一个三元素的整数阵列是一个跟一个的三个整数。
声明和标注变量声明一个变量是说明变量的名字和类型;标注一个变量是给已生命的变量一个专有的值。
下例是将声明和标注合为一步:int $temp = 3;float $Temp = 222.222;string $tEmp = “Heya kid.”;vector $teMp = 1, 2.7, 3.2 ;matrix $temP[2][3] = 4.5, 1, 0.2; -13, 9911, 0.007 ;当生命矩阵变量时,必须包括二维阵列的尺寸。
下例说明对整型、浮点、字符串和矢量阵列型变量阵列的声明和标注: int $TEmp[5] = {100, 1000, -70, 2, 9822};float $TeMp[4] = {43.3, -10.7, 0, 82.5};string $TemP[3] = {“Lord”, “Flies”, “cool brown fox2.”}; pvector $tEMp[2] = { 0, 0, 0 , 0.01, -2, 16 };如果一个变量被声明但未被标注,它的所有的值是0;字串变量则? quot; “。
Mel语言

Mel语言Mel 语言一、创建双面楼梯代码1int $count = 20;for($i = 0; $i < $count; $i++){//create a cubepolyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;//move the cubemove $i 0 0;//scale the cubescale -r 1 ($i+1) 1;};代码2int $count = 20;for($i = 0; $i < $count; $i++){//create a cubepolyCube -w 1 -h ($i+1) -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;//move the cubemove $i 0 0;};代码3 (单面(移动中心))int $count = 20;for($i = 0; $i < $count; $i++){//create a cubestring $cube[] = `polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1`;move 0.5 -0.5 0.5 ($cube[0]+".scalePivot")($cube[0]+".rotatePivot") ;//move the cubemove $i 0 0;//scale the cubescale -r 1 ($i+1) 1;};二、常用Mel命令Window→General Editors→Script Editor1、ls 列举节点,单独运行ls列举Outliner里所有节点help –doc ls 打开ls命令帮助页面ls –selection(sl) 输出所选物体名称ls –type camera 列举出所有类型为“相机”的节点2、nodeType 获得已知名称的物体的类型nodeType locatorShape1 获得名为locatorShape1的节点类型3、setAttr 设置指定的一个属性到一个指定的值setAttr "pCube1.translateX" 1; 设置pCube1的X轴位移为1 setAttr –lock true "pCube1.translateX" 把pCube1的X轴位移属性锁定,可以简写成:setAttr –l 1 "pCube1.tx"setAttr –keyable false "pCube1.translateX" 把pCube1的X轴位移属性设置成不可K帧(直接隐藏属性),可简写成setAttr –k 0 “pCube1.tx”4、getAttr 获取指定属性的值getAttr pCube1.translateX 获取 pCube1的X轴位移值getAttr –k pCube1.translateX 查看X轴位移值是否能K帧,返回值为0或1setAttr和getAttr合用示例:int $tx=`getAttr pCube1.translateX`;int $tx1;$tx1=$tx+1;setAttr "pCube1.translateX" $tx1;示例:获取选中物体位移、旋转和缩放属性值string $sel[]=`ls –sl`; //把选中的物体属性输入到$sel[]里for ($i=0;$i<size($sel);$i++){< p="">print (“object:”+$sel[$i]+”\n”);float $tx=`getAttr ($sel[$i]+”.translateX”)`;float $ty=`getAttr ($sel[$i]+”.translateY”)`;float $tz=`getAttr ($sel[$i]+”.translateZ”)`;print (“Translate:”+$tx+”,”+$tx+”,”+$tx+”\n”);//以下使用一行代码读取旋转的三个属性值,放到一个数组里float $r[]=`getAttr ($sel[$i]+”.rotate”)`;print (“Rotate:”+$r[0]+”,”+$r[1]+”,”+$r[2]+”\n”);float $s[]=`getAttr ($sel[$i]+”.scale”)`;print (“Scale:”+$s[0]+”,”+$s[1]+”,”+$s[2]+”\n”);print (“\n”);}加上globle,变为全局函数,可调用,在Maya里直接输入函数名,就可以输出运行结果globle proc ShowTRS(){string $sel[]=`ls –sl`;string $each;for ($each in $sel[]){ //这里用$each代替普通用法中的$i,效果相同print (“object:”+$each+”\n”);float $tx=`getAttr ($each +”.translateX”)`;float $ty=`getAttr ($each+”.translateY”)`;float $tz=`getAttr ($each +”.translateZ”)`;print (“Translate:”+$tx+”,”+$tx+”,”+$tx+”\n”);float $r[]=`getAttr ($each +”.rotate”)`;print (“Rotate:”+$r[0]+”,”+$r[1]+”,”+$r[2]+”\n”);float $s[]=`getAttr ($each +”.scale”)`;print (“Scale:”+$s[0]+”,”+$s[1]+”,”+$s[2]+”\n”);print (“\n”);示例:列举Maya里所有的灯光,并输出强度global proc ShowLight(){string $lights[]=`ls -type light`;print ("_______________________________________\n");string $each;for($each in $lights){float $i=`getAttr ($each+".intensity")`;print ($each+" : "+$i+"\n");}}5、三、Mel语法1、int $intNum=9;print (9/2);整型(int)变量,结果为4float $floatNum=9.0;print (9.0/2);浮点数变量,结果为4.5print (“Hello”+”World”+$intNum);结果为HelloWorld4 print (“\””) ;此时输出为一个引号”,记得加上一个\,否则无法输出一个”print (“\\\\”);输出为rand (0,10);随机数,在0和10之间的随机数seed (6); 指定种子为6,rand (0,10);每次执行完一个种子再随机,得到的结果是一样的2、示例:下面for循环代码执行结果为20个立方体在0-360度之间随机旋转for ($i=1;$i<=20;$i++){rotate –r –eu 0 (rand(0,360)) 0 (“pCube”+$i);}示例:下面代码执行结果为复制出50个立方体,且复制出的立方体XYZ轴绝对位移均在(-80,80)间随机取值,旋转在(0,360)间随机取值int $max=50;float $bound=80;for ($i=0;$i<$max;$i++){string $newObj[]=`duplicate -rr "pCube1"`;move -a (rand(-$bound,$bound)) (rand(-$bound,$bound)) (rand(-$bound,$bound)) $newObj[0];rotate -a (rand(0,360)) (rand(0,360)) (rand(0,360)) $newObj[0];}3、int $arr[]={1,2,3};float $arr2[]={1.0,2.3,3.5};int $num[5]; 指定元素个数为5print ($num[0]);size ($arr); 获取数组元素个数clear ($arr); 将数组中元素清零,返回空数组状态vector $abcVec; 定义向量vector $Y=<<0,1,0>>;print ($Y.x $Y.y $Y.z); 打印向量的值vector $v1=<<0,0,1>>;vector $v2=<<0,1,0>>;print (angle($v1,$v2)*180/3.1415); 计算向量$v1和$v2的夹角示例:建立一个立方体和一条CV线的路径动画,并沿路径复制立方体//string $path="curve1";//string $obj="pCube1";//int $count=20;global proc Fuzhi(int $count){ //封装string $sel[]=`ls-sl`;string $path=$sel[1];string $obj=$sel[0];//建立路径动画select $obj $path;string $pathNode=`pathAnimation -fractionMode true -follow true -followAxis x -upAxis y -worldUpType "vector" -worldUpVector 0 1 0 -inverseUp false-inverseFront false -bank false -startTimeU 1 -endTimeU $count`;//每帧复制for($i=1;$i<=$count;$i++){currentTime $i;duplicate -rr $obj;}delete $pathNode;}4、for($i=0;$i<10;$i++){} for一般格式While (True){break;} while一般格式示例:平面上面的和平面下面的立方体赋予不同的材质和颜色(blinn1和blinn2这两种材质不是自动给出的,需要自己先对某物体进行设置,为了区分,可以设置成不同的颜色)float $h1=`getAttr pPlane1.ty`;for($i=1;$i<=50;$i++){float $h2=`getAttr ("pCube"+$i+".ty")`;if($h2>$h1){sets -e -forceElement blinn1SG ("pCube"+$i);}else{sets -e -forceElement blinn2SG ("pCube"+$i);}}四、表达式Window→Animation Editors→Expression Editor1、示例:运用表达式实现灯开关和灯颜色切换。
第二课 mel学习系列课程--数组

第二课 mel学习系列课程--数组1楼首先,感谢大家对我教程的支持。
其次跟大家道歉,今天发教程发晚了,昨天晚上通宵加班到今天早晨10点多。
刚刚起来把今天的内容整理好。
昨天的帖子我看了大家完成的作业,基本上问题都不大,大家在maya中运行一下语句就可以了,如果有什么地方不明白的可以单独开贴提问。
mel这个东西靠教程光明白是远远不够的,一定要多加练习,这样不断的总结经验教训才能有所提高。
好了下面进行今天的内容--------------------------------------数组也分整数数组,小数数组,字符串数组其实数组就好比我们在maya场景中选择了多个对象打组是一个道理,在mel中我们可以将数字和字符串进行打组后进行统一操作如整数数组里面可能有很多数字 1 3 5 7 0 等,可以理解为将这些数字打了一个组小数数组也是如此 1.2 3.6 6.8 3.4 将这四个数字进行了打一个组字符串数组就是将字母或者字符串打组 hi hello maya ok 将这四个单词打组数组在mel中的表示方式如下,我以整数数组为例{int $a [] = {3, 13, 17,37};print $a;}上面我们做了一个整数数组的简单表达方式。
int上节课讲过是代表整型变量定义一个整型变量a在a的后面有一个[]意思就是告诉系统这个变量是一个数组,在等号后面大括号中的内容就是这个数组的内容。
大家可以执行这条语句看看maya的反馈信息是是如何显示的,我们使用print 反馈数组信息,得到数组列表。
但是如果我们要调用数组中的单独的某一个数字我们该怎么操作呢?这就需要我们执行数组下标操作。
大家要注意数组我们上面写的数组语句中的数组内容标号是从0开始的。
也就是说{3, 13, 17,37}数组中第一个数字3的下标为0以此类推,13的下标为1等等。
如果我们要调用上面数组中的第三个数字17,我们要执行如下操作{int $a [] = {3, 13, 17,37};print $a[2];}大家在mel执行上面的语句后反馈结果为17,这个结果是我们想要的同样我们也可以对数组重新赋值,这个道理就好比是,我们在maya场景中建立一个空组,在这个空组中我们可以随意的添加和更换组中的元素是一个道理{int $a [] = {3, 13, 17,37};print $a;}上面这个语句我们只是对这个数组的初始化,好比我们在maya场景中建组,组中已经包含了这些对象,我要更换这个组里面的内容我们要执行如下操作{int $a [] = {3, 13, 17,37};$a = {47,98,103,111};print $a;}我们在mel中执行上面的语句,发现我们将变量$a数组的原内容3,13,17,37更改为47,98,103, 111。
maya语言mel文本教学第三课-简单的命令和语法

maya语言mel文本教学第三课简单的命令和语法在前两节课中我们讲解了mel的一些基础知识,大家知道了什么是变量什么是数组,并对其进行了实际操作和使用。
从这节课开始我们使用mel就慢慢开始练习到场景内的实际操作,给大家介绍一些maya实际操作中所涉及的一些命令和语法学习是一个循序渐进的过程,欲速则不达。
我们由简入深。
一步一步的跟一起研究mel,希望大家在群内一起探讨多多发言,营造本群的学习氛围。
谢谢大家~正文开始:mel 初级命令和简单语法操作在maya脚本里int float string if for(if和for以后学判断语句和循环语句时会用到)等等这些是语言本身使用的,控制语言本身的流程。
除了这些关键字意外,剩下的其他的语句都是命令。
我们可以在maya的菜单栏的help下拉菜单中的MEL Command Reference 中查询mel的所有命令语句。
mel命令的通用格式命令的名称空格第一个参数空格参数的内容空格第二个参数空格参数的内容以此类推,最后跟分号;这就是mel的通用格式,一个命令可能有几十个参数,有些参数是不需要更改的我们只需要其保留默认值就可以,这样我们就不用把他们都写在上面我们要更改哪个参数,我们就写那些参数进行设置和更改就可以了。
我们打开maya,在maya的mel编辑器中,我们输入help polyCube 并运行,在mel 的返回栏中就会详细的列出polyCube的所有参数,前面带“-”的都是他的参数,参数有长名表示法和短名表示法,长命表示法,比较清晰,短名表示法就是书写起来比较方便,每一个参数后面都有他的参数类型。
如我们看到在参数中有一个-name参数,他后面跟的参数类型string,也就是说这个参数是字符串参数,我们可以通过这个参数给polyCube其名字。
后面还有参数类型是int的就是参数类型是整数。
好比-sw后面跟的参数类型就是整数类型,因为我们在设置polyCube的横向分段的时候不可能存在小数,如我们创建一个polyCube 横向分段为5段而不可能是5.5段。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MEL 语言初级教程(一)作者:佚名文章来源:网上收集点击数:436 更新时间:2005-5-26【字体:小大】首先,我们不讲枯燥的语法,来点实在的。
打开Maya的脚本编辑器(Window->General Editors->Script Editor),脚本编辑器分为上下两栏,上栏为历史栏,显示的是曾经操作的命令及其结果以及错误、警告等。
下一栏是命令输入栏,我们可以在其中输入相关命令。
请试着输入如下语句:window -vis true;然后按下Ctrl+Enter键,是不是立即弹出了一个标题为"window1"的窗口?那么这句话是什么意思呢?window是一个命令,表示我们要创建或修改一个窗口。
vis是visible 的缩写,即“可见”,-vis是window命令的一个开关,true则是该开关的参数,意为“是”。
连起来说就是:创建一个窗口并使它可见。
于是我们就得到了一个缺省的窗口,它的标题栏为"window1",名称也为"window1",但注意名称我们看不见,但从历史栏的最后一栏我们可以得知。
下面我们更改该窗口的标题,在输入栏中输入:window -e -t "ChinaDV" window1;按下Ctrl+Enter键执行命令。
我们看到,窗口的标题变成了"ChinaDV"。
这句话又是什么意思呢?e是指edit,t是指title,表示我们要编辑名称为window1的窗口,把它的标题栏改为"ChinaDv"。
当然,我们也可以用一条语句在生成窗口的同时指定窗口的标题、名称、长宽等属性。
试着输入:window -w 450 -h 600 -vis true -t "Goomoo Studio" myFirstWindow;并执行之。
这次我们得到了一个更大的窗口,它的宽度为450象素,高为600象素,标题为"Goomoo Studio",名称为"myFirstWindow"。
关闭标题为"ChinaDV"的那个窗口,将窗口"Goomoo Studio"调小些(怎么调?用鼠标呗!),使之不挡住主网格。
再在命令栏中输入:sphere;并执行,看到了什么?视图的中间出现了一个nurbs球体。
所以,sphere命令用来生成nurbs球体。
下面我们要实现这样一个目的:在窗口Goomoo Studio上生成一个按钮,每单击一次该按钮,在视图的随机位置创建一个半径随机且小于1的nurbs球体。
请输入以下两行:columnLayout;button -l "Create Random Sphere" -c " sphere -p-r (rand(1.0));";输入时请注意大小写和括号、分号和引号,不要输错。
执行完后,我们发现,窗口Goomoo Studio上出现了一个标题为"Create Random Sphere"的按钮。
那么,这两句话又是什么意思呢?欲知详情,请听下回分解。
下课!作业:单击"Create Random Sphere"按钮1000次,体会mel语言带来的乐趣!MEL 语言初级教程(二)作者:佚名文章来源:网上收集点击数:487 更新时间:2005-5-26【字体:小大】上节课的作业完成得怎样?要单击1000次才能生成1000个随机的球,太累!今天我们的目标是只单击一次就生成1000个随机的球,让我们为了此目标而奋斗吧!先解决上节课悬而未决的问题。
在上节课中,我们看到了一个很长的命令:button -l "Create Random Sphere" -c " sphere -p-r (rand(1.0));";这里,button表示要创建一个按钮,l即label,也就是要指定按钮上面的文字,而“Create Random Sphere”则是该开关的参数;c是command,表示单击该按钮后所要执行的命令。
注意:这些命令要用双引号括起来。
这里,我们要执行的命令是:sphere -p (rand(-12.0,12.0)) (rand(-12.0,12.0)) (rand(-12.0,12.0)) -r (rand(1.0));p即position,指定球的位置,用三个浮点数(即实数)分别表示它的x,y,z坐标,这里x,y,z的值全为rand(-12.0,12.0),这是什么意思呢?rand()是一个数学函数,它可以带一个或两个参数。
当他带一个参数的时候,比如rand(10.0),表示从0到10.0中间随机取一个值,这个值可能是3.14159,也可能是2.71828,当然也可能是7.88414(吃点88试一试,:));当他带两个参数的时候,比如rand(-12.0,12.0),表示从-12到12之间取一个随机的实数,因此有可能是-9.600,3.245,12.0等。
你可以在脚本编辑器中试着输入下列命令来体会rand()函数:print(rand(10));print(rand(-10,10));命令的结果将显示在命令历史栏中。
r即radius,表示球的半径。
我们再在命令栏中输入下面一段:window -vis true;columnLayout;button -l "Create Random Sphere" -c " int $i;for($i=0;$i<1000;$i++)sphere -p (rand(-12.0,12.0)) (rand(-12.0,12.0)) (rand(-12.0,12.0)) -r (rand(1.0)); "按数字键盘上的Enter键执行之,然后单击窗口上的“Create Random Sphere”按钮。
****严正声明****:死机了可别怪我!哎呀!我要上班了,明天再写。
下课!MEL 语言初级教程(三)作者:佚名文章来源:网上收集点击数:534 更新时间:2005-5-26【字体:小大】执行完上次的命令后,你的机器死过去了吗?没有?那好,这样的机器才有做三维的资格啊。
在上节课的那个更长的命令中,我们看到了三个陌生的东西:“int”、“for(;;)”和“$i”。
先从简单的讲起。
$i是一个自定义的变量,它和物体的自定义属性差不多。
变量名只能由字母、数字和下划线组成。
那么如何理解变量呢?你可以把一个变量想像成一个盒子,这个盒子里可以存放各种数据,包括整数、实数、字符串、矢量等。
“int”即“integer”是一个定义符,“int $i”指明了代号为$i这个盒子里只能存放整数,此外比较常用的有:float(实数),string(字符串)等。
注意:在mel中,所有的变量前都需要加一个“$”符号。
为什么要这样呢?我想有两个方面的原因:一是与Maya系统所定义的变量区分开来,以免发生冲突;二是A|W公司可能缺钱花,这样规定之后呢,看着mel脚本上满眼的美元,心里那个爽啊!哈哈!!for(;;)语法可就有点难了,大家要可要认真学罗。
还是用实例来讲解吧,输入:int $i,$sum;$sum=0;for($i=1;$i<1001;$i++)$sum=$sum+$i;print($sum);执行完后,我们看到了结果:500500。
这就是从1加到1000的和(是否想起了高斯?)。
第一句定义了两个整型变量:$i和$sum,$i用来控制循环,$sum用来存放相加的结果。
第二句首先将结果置零。
下面就是for循环了,for循环首先执行第一条语句:$i=1,它将变量$i赋值为1;然后执行第二句:$i<1001,判断$i的值是否小于1001,如果是,就执行$sum=$sum+$i;显然,这条语句马上被执行了,所以,$sum=0+1=1;(否则,就跳出循环,执行print($sum);这条语句)然后才执行$i++,这是什么意思呢?这表示变量$i的值自加1,即$i=$i+1,所以$i=1+1=2,然后再次进行判断$i的值是否小于1001,如果是,则再次执行$sum=$sum+$i;显然,这次又执行了,$sum的值由1增为2...如此循环不已,直至$i的值大于1000为止,所以这个循环一共执行了1000次,$sum的值也就从1加到1000。
说了这么多,不知大家听懂了没有,如果还没懂,看看附图吧。
另外要注意,如果循环体有多条语句,这些语句要用花括号括起来,比如:float $i,$sum,$multi;$sum=0;$multi=1;for($i=1;$i<51;$i++){$sum+=$i;$multi*=$i;}print($sum);print("\n");print($multi);显示结果:1275 3041409320171337600000000000000000000000000000000000000 0000000000这段程序用来计算1加到50的和与1乘到50的积。
Maya可真是厉害,这么大的数都算得出来,比微软的计算器可强多了!这里“$sum+=$i;”和“$multi*=$i;”是mel的简写法,它们分别等同于“$sum=$sum+$i;”和“$multi=$multi*$i;”此外,for语句还有许多变异的写法,这里暂时就不涉及了。
以上全是枯燥的语法,下面来点实用的东西。
请在脚本编辑器中输入:window myWindow;columnLayout;intSliderGrp -l "Number Of Spheres:" -field true -min 1 -max 1000 -v 50 slider;button -l "Create Random Sphere" -c " int $k=0;int $n=`intSliderGrp -q -v slider`;for(;$k<$n;$k++)sphere -p (rand(-12.0,12.0)) (rand(-12.0,12.0)) (rand(-12.0,12.0)) -r (rand(1.0));";showWindow myWindow;执行完后,得到了一个有滑动条和按钮的窗口,这样我们就可以通过滑块来控制生成的球体的数目了。
今天埃了老板K,心情不太好,写出来的东西乱糟糟的,大家不要扔鸡蛋罗。