MEL语言初级教程.docx
《MEL语言初级教程.docx》由会员分享,可在线阅读,更多相关《MEL语言初级教程.docx(17页珍藏版)》请在冰豆网上搜索。
MEL语言初级教程
MEL语言初级教程
(一)
作者:
佚名文章来源:
网上收集点击数:
436更新时间:
2005-5-26【字体:
小大】
首先,我们不讲枯燥的语法,来点实在的。
打开Maya的脚本编辑器(Window->GeneralEditors->ScriptEditor),脚本编辑器分为上下两栏,上栏为历史栏
,显示的是曾经操作的命令及其结果以及错误、警告等。
下一栏是命令输入栏,我们可以在其中输入相关命
令。
请试着输入如下语句:
window-vistrue;
然后按下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-w450-h600-vistrue-t"GoomooStudio"myFirstWindow;
并执行之。
这次我们得到了一个更大的窗口,它的宽度为450象素,高为600象素,标题为"GoomooStudio"
,名称为"myFirstWindow"。
关闭标题为"ChinaDV"的那个窗口,将窗口"GoomooStudio"调小些(怎么调?
用鼠标呗!
),使之不挡住主网
格。
再在命令栏中输入:
sphere;
并执行,看到了什么?
视图的中间出现了一个nurbs球体。
所以,sphere命令用来生成nurbs球体。
下面我们要实现这样一个目的:
在窗口GoomooStudio上生成一个按钮,每单击一次该按钮,在视图的随机
位置创建一个半径随机且小于1的nurbs球体。
请输入以下两行:
columnLayout;
button-l"CreateRandomSphere"-c"sphere-p(rand(-12.0,12.0))(rand(-12.0,12.0))(rand(-12.0,12.0))-r(rand
(1.0));";
输入时请注意大小写和括号、分号和引号,不要输错。
执行完后,我们发现,窗口GoomooStudio上出现了
一个标题为"CreateRandomSphere"的按钮。
那么,这两句话又是什么意思呢?
欲知详情,请听下回分解。
下课!
作业:
单击"CreateRandomSphere"按钮1000次,体会mel语言带来的乐趣!
MEL语言初级教程
(二)
作者:
佚名文章来源:
网上收集点击数:
487更新时间:
2005-5-26【字体:
小大】
上节课的作业完成得怎样?
要单击1000次才能生成1000个随机的球,太累!
今天我们的目标是只单击一次
就生成1000个随机的球,让我们为了此目标而奋斗吧!
先解决上节课悬而未决的问题。
在上节课中,我们看到了一个很长的命令:
button-l"CreateRandomSphere"-c"sphere-p(rand(-12.0,12.0))(rand(-12.0,12.0))(rand(-12.0,12.0))-r(rand
(1.0));";
这里,button表示要创建一个按钮,l即label,也就是要指定按钮上面的文字,而“CreateRandomSphere”则
是该开关的参数;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-vistrue;columnLayout;
button-l"CreateRandomSphere"-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键执行之,然后单击窗口上的“CreateRandomSphere”按钮。
****严正声明****:
死
机了可别怪我!
哎呀!
我要上班了,明天再写。
下课!
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
3000000000
这段程序用来计算1加到50的和与1乘到50的积。
Maya可真是厉害,这么大的数都算得出来,比微软的计算
器可强多了!
这里“$sum+=$i;”和“$multi*=$i;”是mel的简写法,它们分别等同于“$sum=$sum+$i;”和“$multi=$multi*$i;”
此外,for语句还有许多变异的写法,这里暂时就不涉及了。
以上全是枯燥的语法,下面来点实用的东西。
请在脚本编辑器中输入:
windowmyWindow;
columnLayout;
intSliderGrp-l"NumberOfSpheres:
"-fieldtrue-min1-max1000-v50slider;
button-l"CreateRandomSphere"-c"int$k=0;
int$n=`intSliderGrp-q-vslider`;
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));
";
showWindowmyWindow;
执行完后,得到了一个有滑动条和按钮的窗口,这样我们就可以通过滑块来控制生成的球体的数目了。
今天埃了老板K,心情不太好,写出来的东西乱糟糟的,大家不要扔鸡蛋罗。
下课!
MEL语言初级教程(四)
作者:
佚名文章来源:
网上收集点击数:
365更新时间:
2005-5-26【字体:
小大】
执行上节课的最后一段后,我们的程序终于有了人机交互功能,可以由用户来控制生成的球体数目了。
我先
来逐句讲解上段程序的意思。
第一句,windowmyWindow;,创建一个名称为myWindow的窗口,但并不立即显示出来。
第二句,columnLayout;,设置窗口的控件布局为列布局。
第三句,intSliderGrp-l"NumberOfSpheres:
"-fieldtrue-min1-max1000-v50slider;,在该窗口上创建一个整
数滑动条,其标题文字为"NumberOfSpheres:
";"-fieldtrue"表示显示数值输入框,默认状态为不显
示;"-min1-max1000-v50"表示该控件的最小值为1,最大值为1000,默认值为50。
连起来说就是:
创建
一个标题为"NumberOfSpheres:
",最小值为1,最大值为1000,默认值为50,名称为"slider"的整数滑条,
并显示其数字输入框。
第四句,很长啊,我只讲解-c后面的命令序列。
int$k=0;,定义一个整型变量$k,并将其值设为0;int
$n=`intSliderGrp-q-vslider`;,这个命令有点难理解,定义一个整型变量$n,并将其值设为`intSliderGrp-q-v
slider`,***注意***这句两端并不是单引号,而是“左手单引号”,也就是“Esc”键下、“Tab”键上、“1”键左的
那个按键,用得很少的一个按键啦,A|W公司思想创新,令该键发挥奇效。
该键用来括住一个命令,并捕获
该命令执行的结果。
有点难理解,还是举个例子来说吧,输入:
string$mySphere[]=`sphere`;
执行之,我们看到视图的中间生成了一个球体。
这里,我们定义了一个字符串数组,字符串数组可以用来存
放多个字符串。
再输入:
print($mySphere);
执行之,得到结果:
nurbsSphere1
makeNurbSphere1
这和历史栏中显示的//result:
后显示的结果是一样的。
更进一步,在视图的空白处单击,取消对球体的选取
,然后输入:
move-a500$mySphere[0];
执行之,该球被移到了世界坐标的(5,0,0)处,可以看到,我们既没有选择该球,也不知道该球的名字,但我
们仍然能够通过程序控制它,怎么样,看到“左单引号”的威力了吧!
这里,move是移动命令,a即absolute,
表示绝对坐标。
再把思路跳回去,那么intSliderGrp-q-vslider执行的结果是什么呢?
q表示query,即“查询”,v表示value,即“
值”,这句话表示我们要查询名称为“slider”的控件的值,并将查询的结果存入变量$n中。
剩下的就好理解了
,for(;$k<$n+1;$k++),这是for循环的一个变种,它的括号中的第一条语句省略了,因为我们前面已将$k
的值指定为0;for循环中的第二句把1001改为了$n,这样,这个循环就执行$n次,所以生成了$n个球,也
就是用户输入的球体的数目。
第五句,showWindowmyWindow;,这句话用来显示第一句创建的窗口。
至此,大功告成。
不知我讲的你们是否都懂了。
如有不懂,尽管发问,我有问必答。
几天没布置作业了,很高兴吧,今天出个难题。
今天的作业:
在该窗体上再添加一个滑条,用以控制生成球体的最大半径。
下课!
MEL语言初级教程(五)
作者:
佚名文章来源:
网上收集点击数:
441更新时间:
2005-5-26【字体:
小大】
上节课布置的作业完成的怎么样啊?
没完成的可是要打手心的哟!
以下是上节课练习的解答。
windowmyWindow;
columnLayout-adjtrue;
floatSliderGrp-l"maxRadius:
"-fieldtrue-min0.1-max10.0-v1.0rSlider;
intSliderGrp-l"NumberofSpheres:
"-fieldtrue-min1-max1000-v50nSlider;
button-l"CreateRamdomSphers"-c"int$n=`intSliderGrp-q-vnSlider`;
float$r=`floatSliderGrp-q-vrSlider`;
int$i=0;
for(;$i<$n;$i++)
{sphere-p(rand(-12.0,12.0))(rand(-12.0,12.0))(rand(-12.0,12.0))-r(rand($r));
}
";
showWindowmyWindow;
在上面的程序中,我们看到了一个新的命令:
floatSliderGrp,floatSliderGrp和intSliderGrp的用法基本上是一
样的,只不过intSliderGrp表示的是整数,而floatSliderGrp表示的是浮点数,即实数,也就是带有小数部分
的数。
另外,我们还发现了一个严重的问题:
随着被用户所控制的参数的增多,button命令的-c参数后命令序列也
会急剧增加,命令行也会更长,这将给我们阅读、修改和维护程序带来困难。
有没有办法解决这个问题呢?
当然有,下面我们来讲讲“函数”(也称为过程)这个重要的东东。
当然,函数
不仅仅是为了阅读方便而引入的,它是结构化程序设计的一个重要的概念,它把一个长长的程序分成许多独
立的模块,每个模块仅通过几个变量(函数的参数和返回值)与其他的模块进行沟通,这样极大地简化了程
序的编写,提高了程序代码的可重用性。
对于别人已经编好的函数,我们只用采取“拿来主义”,随手拿过来
用就行了,不必考虑他是如何实现的。
当然,我们也可编写自己的函数。
这段话比较枯燥,不过暂时不理解
也没关系,等我们把函数用熟了,自然就明白了。
我们还是以事实来说话。
我们先来写一个简单的函数,该函数可以返回两个实数中较大的那一个。
输入:
procfloatzjsMax(float$a,float$b)
{if($a>=$b)
return$a;
else
return$b;
}
执行之。
咦?
怎么一点反应都没有?
反应是有的,只是我们看不见,我们已经定义了一个名为zjsMax的函数
存到maya的内存中去了(不知这样说准不准确?
),下面我们再输入:
zjsMax(147.258,258.369);
执行之。
咳!
有反应了!
历史栏中显示出:
//Result:
258.369//。
这表示我们的第一个函数编写成功!
下
面我们来剖析这个函数。
proc即procedure,意为“函数”、“过程”,告诉Maya下面我们要定义一个函数了。
float,前面讲过,意为“浮点数”、“实数”,表示这个函数的返回值是一个实数。
zjsMax,这是函数名。
函数名必须由字母、数字和下划线组成,第一个字符不能为数字,前不用加美元符号
。
float$a,float$b,表示这个函数需要两个参数,而且都是浮点数。
参数必须用圆括号括起来。
最后不要加分
号。
下面是函数体,函数体由多条语句组成,这些语句必须用花括号括起来。
if,意为“如果”,后面是条件。
条件语句后不要带分号。
($a>=$b),$a大于或等于$b。
此外还有>(大于)、<(小于)、<=(小于或等于)、!
=(不等于)、==(
等于)。
return,返回;else,否则。
这段函数体翻译成中文就是:
如果$a大于或等于$b,就返回$a,否则,返回$b。
所以,它返回的是较大的那
个实数。
下面我们再编写一个函数,它需要两个参数,一个表示球体的最大半径,另一个表示球体的数目。
请输入:
proczjsRandomSphere(float$r,int$n)
{int$i=0;
for(;$i<$n;$i++)
{sphere-p(rand(-12.0,12.0))(rand(-12.0,12.0))(rand(-12.0,12.0))-r$r;}
}
执行之,照旧没反应。
不过我们已有心理准备啦。
再输入:
zjsRandomSphere(1,100);
视图中立即出现了100个最大半径为1的球体。
哈哈,连前面的界面都不用了。
这个函数没有声明返回的数
据类型,也没有任何返回值。
这样,我们上节课的练习答案可以改成:
proczjsRandomSphere(float$r,int$n)
{int$i=0;
for(;$i<$n;$i++)
{sphere-p(rand(-12.0,12.0))(rand(-12.0,12.0))(rand(-12.0,12.0))-r$r;
}
}
windowmyWindow;
columnLayout-adjtrue;
floatSliderGrp-l"maxRadius:
"-fieldtrue-min0.1-max10.0-v1.0rSlider;
intSliderGrp-l"NumberofSpheres:
"-fieldtrue-min1-max1000-v50nSlider;
button-l"CreateRamdomSphers"-c"int$n=`intSliderGrp-q-vnSlider`;
float$r=`floatSliderGrp-q-vrSlider`;
zjsRandomSphere($r,$n);
";
showWindowmyWindow;
这段程序看上去比前面那段更长,但更易于阅读和修改。
你有这样的感觉吗?
如果没有,那是你还没有习惯
,等习惯了就好了。
今天的作业:
写一个函数,它需要3个参数,返回这三个数中最大的那一个。
----------------------------------------------------------
*****附:
为响应米侬朋友的要求,下面讲一下全局变量。
*****
----------------------------------------------------------
以下只是我个人对全局变量的理解,也许不够准确,但希望能够释疑。
全局变量可以认为是多个函数共同享用的变量。
如何理解呢?
请看例子:
globalfloat$gVar=12345;
procasignValue(float$value)
{
globalfloat$gVar;//全局变量
$gVar=$value;
}
procoutPut()
{
globalfloat$gVar;//全局变量
print($gVar);
}
procoutPut1()
{
float$gVar;//局部变量
print($gVar);
}
执行之。
这里定义了一个全局变量$gVar和三个函数asignValue(float)、outPut()和outPut1()。
按照书写约定,
全局变量的前面要加一个g字母。
任何一个函数在使用全局变量前都必须先声明该变量。
在函数asignValue和
函数outPut中,使用的是全局变量$gVar,而在函数outPut1中,使用的是局部变量$gVar,他们的变量名相同
,下面我们来看看他们有什么差别:
输入outPut();并执行之,结果:
12345;输入outPut1();并执行之,结果:
0。
再输入:
asignValue(-1000);并执行之。
输入:
outPut();并执行之,结果:
-1000;输入outPut1();并执行之,结果:
0,不变。
MEL语言初级教程(六)
作者:
佚名文章来源:
网上收集点击数:
446更新时间:
2005-5-26【字体:
小大】
这是上节课的习题解答:
procfloatzjsMax(float$a,float$b,float$c)
{
float$t;//定义一个临时变量$t
if($a>=$b)
$t=$a;
else
$t=$b;
if($t>=$c)
return$t;
else
return$c;
}
如果熟悉了mel以后,这个函数还可以写成一句话:
procfloatzjsMax(float$a,float$b,float$c)
{
return$a>($b>$c?
$b:
$c)?
$a:
($b>$