MEL语言初级教程.docx

上传人:b****5 文档编号:8124632 上传时间:2023-01-29 格式:DOCX 页数:17 大小:24.75KB
下载 相关 举报
MEL语言初级教程.docx_第1页
第1页 / 共17页
MEL语言初级教程.docx_第2页
第2页 / 共17页
MEL语言初级教程.docx_第3页
第3页 / 共17页
MEL语言初级教程.docx_第4页
第4页 / 共17页
MEL语言初级教程.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

MEL语言初级教程.docx

《MEL语言初级教程.docx》由会员分享,可在线阅读,更多相关《MEL语言初级教程.docx(17页珍藏版)》请在冰豆网上搜索。

MEL语言初级教程.docx

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>$

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 中考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1