欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Maya Mel基础知识教程 了解运用Mel

程序员文章站 2023-11-17 17:39:16
下面为大家带来Maya Mel基础知识教程,主要是希望大家能更了解运用Mel,好了,下面我们一起来看看吧 ... 15-06-14...

教程向朋友们介绍mel的一些基础知识,希望是朋友们更好的了解运用mel,感谢大家阅读本教程!

了解 mel

mel (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。

本教材的各处都有许多有关的mel指令和程序码的例子。要运行例子程序,你可以把它们粘贴到maya的脚本语言编辑器(script editor)里,并选择edit execute就可以了。使自己进一步地熟悉脚本语言编辑器的要点,执行脚本程序,并把程序保存到maya的script目录中的一个文件中,可以参考maya文件和用户指南中的适当章节。

mel要点

使用 mel的要点包括了使用mel指令和产生mel程序。

本章包括以下内容:指令、程序、maya gems共三个部分。本期介绍maya脚本语言mel的指令。

分为以下三个部分:1、了解指令;2、mel指令文件;3、使用指令。

1、了解指令

mel包括了涉及使用maya的所有方面的全范围的指令。使用mel指令的一些典型的例子包括快速产生物体、精确移动物体和对物体进行更有效的控制。如,可以使用下述的一个mel指令产生一个半径准确的为27.5 单位的叫做 bigboy 的一个球体:

sphere -radius 27.5 -name bigboy;

随后你还可以再输入一条mel指令将bigboy绕z轴旋转90度:

rotate -r 0 0 90 bigboy;

另一个例子,假定你在用结点工具产生一个结点,你想把这个结点沿着x轴方向移动5个单位。你可以执行以下的mel指令,而不需要打断结点的产生:

move -r 5 0 0;


2、mel指令文件

maya的在线库(online library)描述了每一条指令,提供了用法、格式、返回值和例子的信息。mel的指令参考在线文件(command reference online documentation)提供了以字母顺序排列的指令,也以**能方式加以组织。

3、使用指令

包括内容有:输入指令、使用指令行、获得指令返回值、指令模式和指令在表达式中。

⑴、输入指令

maya提供了一些输入mel指令的方法;使用脚本语言编辑器(script editor)或者指令行(command line)是最常用的方法。你也可以在脚本程序文件、maya ascii(.ma)文件、工具柜图标(shelf icons)、热键以及表达式中执行指令。但是最常用的还是在脚本语言编辑器中输入指令。

无论如何输入指令,所有的mel指令必须用一个分号结束。以下是mel 指令的一些例子:

sphere -name roundy;
setattr roundy.translatex 7;
whatis ls;
help ls;
ls -typ nurbssurface;

⑵、使用指令行

可以使用指令行输入mel指令。如果指令行没有出现,在maya主菜单中选择options command line使指令行出现。

虽然在指令行和脚本语言编辑器中都可以输入指令,但两者之间有一些重要的区别:

你可以从指令行,使用数字键盘或字符键盘的enter键输入指令。而脚本语言编辑器只能用数字键盘的enter键。

指令行只有一行,执行一个mel指令。为了输入更多的mel指令,指令之间可以?quot;;"分开。

指令行仅将结果的最后一行显示到右边。而脚本语言编辑器显示所有的结果。

⑶、获得指令返回值

many mel指令返回一个值。为了抓取这个返回值,可以用单引号或者eval指令。

使用单引号获得指令返回值

用单引号"`"将指令前后标注出来可以返回指令的输出。随后你可以把这个输出赋给一个变量并在脚本语言编辑器中显示它。



string $a;
$a = `particle -p 5 0 5 -name sun`;

print($a);

第一条语句定义了一个名为$a的阵列。第二条语句执行引号中的mel指令,并把指令的输出赋给$a。第三条指令把$a的内容显示给脚本语言编辑器,如下:

sun

sunshape

可以对任何一个mel指令保存和显示其结果。返回值的类型是由你使用的指令决定的。在以上例子中,粒子命令返回一个字符串阵列。所以,等式左边的变量符号也须要是接受这个返回值的字符串阵列的类型。

使用eval指令获得指令返回值

eval指令执行一个命令,也让你抓取返回值。它比起单引号有一个优点,因为你可以从一个字符串建立一个指令。象单引号方式那样,也可以把输出赋给一个变量并显示它。



string $command = "sphere";
eval($command + " -r 5");

第一条语句把字符串sphere标注给变量$command。第二条指令给字符串sphere添加 -r 5,并执行完整的指令sphere -r 5。它产生一个半径为5个格子单位的球体。

有关eval指令的更多的信息,见掌管指令的在线文件。

⑷、指令模式

mel指令选项典型地在以下一种或多种模式中起作用:query、编辑和产生。query模式是用于找出一些事件的值;编辑模式是用于改变一些事件的值;产生模式是产生一些事件。在在线mel指令参考中,指令选项的描述包括一个q、e或c以指示query模式、编辑模式、产生模式。

⑸、指令在表达式中

可以在一个表达式中执行mel指令和序列。但是,如果你执行以下的指令你的场景会产生故障:

断开或连接属性
删除或产生物体或者其他项

在一个表达式中播放你的动画不会撤消mel指令的执行。例如,如果你的表达式执行mel指令产生了一对球体,播放这段动画时并不删除原来的球体。再次播放该场景时会产生另一对球体。

不过你可以通过选择edit undo撤消mel指令,但是如果你的场景有故障时,它将会不工作。还要注意,你可以只撤消queue尺寸的设置所允许的许多运算。为设立queue 尺寸,选择options general preferences。

当你从指令行执行一个指令时,状态信息出现在脚本语言编辑器中和指令行的响应区域里。当在一个表达式中执行指令时,不显示这个信息。 关于表达式的更多的内容,请参考using maya: expressions。

概述 maya脚本语言

本章包括以下内容: 1、了解脚本语言;2、设立脚本语言环境。

1、了解脚本语言

编写脚本语言程序是产生maya埋入式语言(mel)脚本程序的过程。一个脚本语言程序是一个mel指令或者mel序列的集。通过产生脚本语言程序,你可以利用maya的用户界面使执行任务自动化,可以获得"under the hood"访问maya所有的各个部分,还可以对界面进行扩展和自定义。

2、设立脚本语言环境

为了设立脚本语言环境,需要考虑以下内容:
⑴、脚本语言文件
⑵、建立脚本语言路径
⑶、在脚本语言程序中使用程序

⑴、脚本语言文件

一个mel脚本文件(*.mel)是一个包含mel指令、mel程序或者二者都有的文件。典型地,是用一个mel脚本文件执行一系列的指令。如,可以写一个脚本程序以产生一个墙形状的物体,然后再给它施加一个砖的纹理。

可以用一个文字编辑器写一个mel脚本文件然后把它保存到磁盘的一个文件中。mel脚本文件使用文件扩展名 .mel。可以把脚本文件用于不同的场景中和不同的工作期间中。当执行一个mel脚本文件时,它并不变成为场景的一个部分,因此如果你要想重复它的作用时,应该每次都执行该脚本程序。

⑵、建立脚本文件路径

在缺省状态下,maya在你的scripts目录中查找mel脚本文件。
在缺省状态下,这个目录定义在你的login名下。例子如下:

(irix) ~elvis/maya/scripts

(windows nt) c:\aw\elvis\maya\scripts

使你的脚本文件可以运行的最简单的方法是把它们放在上述路径里。

注意你的scripts目录缺省地包含了一些脚本文件。它们以menu_作为名字的开始,用于maya内部。

你可以给maya用于查找脚本文件的缺省路径增加目录。

为脚本文件路径增加一个目录(在irix中):

1--在一个irix shell中,设立环境变量maya_script_path给附加目录的路径。

2--从这个shell启动maya。

为脚本文件路径增加一个目录(在windows nt中):

1--使用windows nt explorer或者my computer,显示maya nt bin目录的内容。

缺省时是c:\aw\mayax.x\bin。

2--双击mayaenvironment.exe启动该程序。

这样显示出了你的home、project、plug-in、script和bitmap目录的路径。该路径包括在安装期间产生的缺省路径和你后来定义的任何路径。不能改变缺省路径。

对于plug-in、script和bitmap路径,用分号(;)分离路径,这些项可以定位。

在这个窗口中禁止编辑路径。但你可以用以下的步骤代替。

重要事项:
如果你的计算机上安装了maya nt的多个版本,你会看到一个版本的路径。版本号是在窗口的标题栏里。为了看另外的版本的路径,点击previous或next。为了保存一个版本的路径,点击save。如果你的计算机只装了一个版本,这些键会变暗。

3--点击maya script path框旁边的change键。

注意,如果你改变了home路径,这就按照新的home路径改变了project、plug-in、 script和bitmap路径。会询问你是否想这样做。点击cancel可以放弃这个改变。

4--在change setting窗口中输入(或者编辑)一个路径。

一般地,可以增加缺省路径,但是不能重置它们。当你定义路径时使用左斜线或者右斜线。

为了定义一个远程路径,可以将一个隐含目录与你的计算机上的一个驱动器字符对应起来。细节请看你的windows nt文件。

如果需要输入多个路径,使用分号把这些路径分离开。

如果要使用一个文件浏览器从别的文件系统查找和选择一个路径,点击browse。

为了返回到你原来的缺省路径中,点击restore default。这对于当你定义了一个不正确的路径或者想删除废弃的路径是非常有用的。

5--点击ok。

例子(irix)

为了给scripts路径增加~/maya/scripts/clipfx and remote/x/scripts目录,在启动maya之前给irix增加以下目录:

setenv maya_script_path ~/maya/scripts/clipfx:/remote/x/scripts

随后maya将能够在~/maya/scripts, ~/maya/scripts/clipfx, 或者/remote/x/scripts中找到你的脚本文件。

⑶、在脚本文件中使用程序

你可以在mel脚本文件中使用全局和局部程序。全局程序在它们的文件外边是可见的;局部程序仅在它们的文件内部是可见的。

如果maya遇到一个没有定义的指令,它会为找到一个与该指令有相同基名的mel脚本文件搜索脚本路径。当它找到该文件之后,它在该文件中会声明所有的全局mel程序。任何具有与该指令有相同基名的全局程序会被执行。

如,假定你在运行一个saywhat指令。因为没有这样的一个saywhat指令,maya会在它的所有的script路径中对一个叫做saywhat或者saywhat.mel的文件进行搜索。如果在一个script目录中,它找到了有以下内容的saywhat.mel脚本文件:

proc red5() {print("red5 standing by...\n");}
global proc saywhat() {print("saywhat online\n");}
global proc gogo() {print("gogo online\n");}

然后全局程序saywhat和gogo被声明,并执行saywhat程序。结果是:

saywhat online

因为gogo全局程序已经声明过了;现在就可以在指令行中或者在脚本语言编辑器中输入gogo运行它。

使用maya内部脚本文件

maya有一些用于它的用户界面和其他运算细节的mel脚本文件。你可以在alias|wavefront中查找这些脚本文件,学习专业脚本程序作者的这些技术。这些脚本文件是在由缺省定义的以下述目录开始的目录中:

(irix) /usr/aw/mayax.x/scripts

(windows nt) c:\aw\mayax.x\scripts

其中x.x是maya的版本号。

注意:
不要在这个目录中修改或者插入脚本文件;该目录是保留maya用户界面工作用的脚本文件的。改变这些文件可能会影响maya的操作。

如果你想在这个目录中修改脚本程序以改变maya的界面,先要把它们拷贝到你的局部scripts目录中。如果你的局部scripts目录中有与maya内部script文件目录中相同名字的脚本文件,那你的局部scripts目录中的文件会被运行。

使用脚本语言编辑器

本章包括以下内容: 1、打开脚本编辑器;2、打开一个脚本程序;3、把一个mel脚本程序文件作为源文件 ;
4、保存脚本文字;5、执行一个脚本程序;6、清除状态信息;7、清除指令输入;8、响应一个指令;
9、显示程序中的语句行号;10、显示堆栈跟踪。

1、打开脚本编辑器

可以通过选择window general editors script editor或者点击maya窗口右下部的script editor图标打开脚本编辑器。
脚本编辑器提供以下菜单选项:

open script--打开脚本程序
source script--把一个脚本程序文件作为源文件
save selected--保存脚本程序
execute--执行脚本程序
clear history--清除历史
clear input--清除输入
echo all commands--返回所有指令的返回值
show line numbers--显示行号
show stack trace--显示堆栈跟踪

编辑命令

下表列出了在脚本编辑器中有效的键盘命令。(在表达式编辑器和一些输入框中它们也是有效的。) 命令 定义 平台
ctrl+c copy irix、windows
ctrl+x cut irix、windows
ctrl+v paste irix、windows
ctrl+k 删除到本行末 irix
ctrl+d 删除下一个字符 irix
ctrl+a 移动光标到行首 irix
ctrl+e 移动光标到行末 irix
ctrl+a 选择编辑框中的所有文字 windows


2、打开一个脚本程序

我们可以打开一个脚本程序以便检查、执行或找出它的问题。打开一个脚本程序时并不执行它。
只是在脚本编辑器的输入栏里简单地把它显示出来。

要执行显示在脚本编辑器的输入栏里的一些或者全部脚本程序,可以用鼠标选择它,然后按键盘的数字enter键。

当你想把一些或者全部内容拖拉到柜架上并在那里产生一个图标时,打开一个脚本程序就是非常有用的。
可以点击该图标执行这个程序。

为了打开一个脚本文件:

1--从脚本语言编辑器中选择file open script。出现一个文件浏览器。

2--选择要打开的脚本文件。


把一个脚本程序作为源文件

把一个mel脚本程序文件作为源文件,执行所有的mel指令并声明包含在该脚本程序文件中的所有的全局过程。
如果你在一个脚本程序文件中修改了一个程序,maya 并不把这个改变登记给该程序,直到你把它的程序文件作为源文件。
这是因为maya把执行了的程序保存到了存储器中。当你把一个脚本程序文件作为源文件时,maya再次读该脚本程序文件里的那个程序。

为了把一个脚本程序作为源文件:

1--从脚本语言编辑器中选择file  open script。出现一个文件浏览器。

2--选择要打开的脚本文件。

把一个脚本程序作为源文件之后,该文件里的所有mel指令会执行。该脚本程序中的所有全局过程会被声明,但并不被执行。
mel指令是按照它们出现在文件中的顺序执行的,并且应当没有错误。如果产生了一个错误,执行会中断并不再装载更多的程序。

当你把一个mel脚本程序作为源文件之后,不声明或者不执行局部过程。
但是,如果你是通过在脚本编辑器或指令行里输入而声明了一个局部过程,该过程会被声明为全局过程,你可以在任何时候执行它。

执行一个程序可以通过执行一个mel指令实现。当你想把一个脚本程序作为源文件,并具有执行该文件中的程序的作用时,这是很有用的。
为了这样做,要首先声明该程序,然后声明通过一个文件浏览器执行该程序的指令。

4、保存脚本文字

使用file save selected指令从脚本编辑器保存脚本文字。可以从指令输入(底部)将文字高亮化,
也可以通过脚本编辑器的状态信息(顶部)部分。maya 将会把高亮的文字部分保存到你说明的目录里的一个 .mel 文件中。

5、执行一个脚本程序

当你想执行一个预先已经源化了的脚本程序时,可以在脚本编辑器的指令输入栏(底部)输入该程序的名字,然后进行下面工作中的一种:

按 ctrl + enter 键;
或者
按数字键盘的 enter 键;
或者
从脚本编辑器里选择 edit execute。

也可以使用这些指令执行一个在脚本编辑器里已经打开了的脚本程序的定义。如果mel脚本定义没有出现失败,
则该定义是从脚本编辑器的底部移到顶部。否则该定义不会移动,并且在顶部会显示出一个错误信息。

提示:
可以首先选取mel script的一部分然后只执行这一部分(ctrl+enter)。 它不会删除其它部分。

6、清除状态信息

要清除状态信息(脚本编辑器的顶部),从脚本编辑器里选择edit clear history。这将会删除掉所有的状态信息文字。
使用这个指令时应当小心一些,因为没有办法撤消它。

7、清除指令输入

要清除指令输入文字(脚本编辑器的顶部), 从脚本编辑器里选择edit clear input。这将会删除掉所有的指令输入文字。
使用这个指令时应当小心一些,因为没有办法撤消它。

8、响应一个指令

当你用maya工作时,对应的mel指令常常出现在脚本编辑器的顶部。缺省情况下,只有那最重要的指令才会显示。

你可以在脚本编辑器里选择edit echo all commands ,虚拟地显示与你的maya作用相关的所有指令。
它可以帮助你学习哪些mel指令触发作用。

在你的maya的作用之间并不是总有一对一的对应关系,这些指令返回响应到脚本编辑器里。
如果你使用一个脚本程序去打开属性编辑器,一些mel指令出现在脚本编辑器里(响应是打开的):

buildobjectedmenu mayawindow|menu4|menuitem56;
editselected;
editmenuupdate mayawindow|menu2;

但是,只有以下的mel指令需要引入属性编辑器:

editselected;

同时,对于一些作用来说,也不总是会将mel指令的响应返回到脚本编辑器里。如,当你选择了一个属性编辑器时,
脚本编辑器的顶部没有返回任何信息。

要关闭返回信息,从脚本编辑器里再次选择 edit echo all commands。

9、显示程序中的语句行号

如果你在执行一个长的程序时由于错误而出现了问题,可以打开脚本程序的行号,你就可以更容易地找到错误。
要显示错误指令的行号,从脚本编辑器里选择edit show line numbers。当你打开了show line numbers选项,
maya 在脚本编辑器状态信息框(顶部)的旁边显示脚本程序的行号。

要关掉行号,在脚本编辑器菜单里再次选择edit show line numbers。

maya将显示行号的设置保存下来作为以后使用。如果打开了行号,当下一次你运行maya时它们会出现在脚本编辑器里。

10、显示堆栈跟踪

如果你用埋入的脚本程序文件执行一个脚本程序时出现了问题,打开堆栈跟踪选项显示文件结构中的脚本程序错误。
要显示一个脚本文件的堆栈跟踪,在脚本编辑器里选择edit show stack trace。maya会在一个窗口里显示堆栈跟踪,
在脚本编辑器里显示一个错误信息。

使用脚本语言结点

一个脚本语言结点是一个包括了一个 mel脚本语言程序的结点。
当该结点产生或者当该结点被破坏时,该程序被执行,它取决于脚本结点的类型。

本章包括以下内容:
1、了解脚本语言结点;
2、产生脚本语言结点;
3、测试脚本语言;
4、编辑脚本语言结点;
5、设立脚本语言结点的执行;
6、删除脚本语言结点。

1、了解脚本语言结点

脚本语言结点是把一个mel脚本语言程序存储到一个maya场景文件中的一种方法。
脚本语言结点也包含了用于产生用户界面的所有mel指令,并被用maya文件保存。

你可以用不同的方法执行脚本语言程序。可以指明一个脚本程序结点执行它的程序:

当该结点是从一个文件中读出的;

在渲染一桢图像的之前或者之后;

在渲染一个动画的之前或者之后。


当一个文件关闭着时使用file open或者file new

一个脚本语言程序结点有三个属性:
before、after和type。决定于脚本程序的类型,当执行该程序时,说明before和after属性。

2、产生脚本语言结点

可以使用表达式编辑器产生脚本语言结点。

为了产生一个脚本语言结点:

1--选择window expression editor。

2--在expression editor中选择select filter by script node name。

任何现存的script nodes显示在script nodes表中。

3--在expression editor的script window中输入脚本程序。

4--在script node name框中输入一个名字。

5--定义你想要使脚本成为一个之前或者之后的脚本程序。

6--点击create键。

这产生脚本结点。现在你可以定义它的类型。

7--从execute on 下拉菜单里选择以下的一个脚本程序结点类型:

demand
当你使用scriptnode指令,隐含地需求它时,运行脚本文件(看在线指令文件的scriptnode指令的信息)。
忽略这种类型的脚本文件的之前和之后的属性。

open/close
如果你已经指定了该脚本文件作为之前的脚本文件,当以批处理模式读文件时脚本被执行。如果你把它
作为之后的脚本文件,当文件被关闭或者没有以图示用户界面模式提供,或者当该结点被删除时,它被执行。

gui open/close

如果你已经指定了该脚本文件作为之前的脚本文件,当以图示用户界面模式运行maya,在读文件时脚本文件
被执行。如果你把它作为之后的脚本文件,当文件被关闭,或者没有以图示用户界面模式提供,或者当该结
点被删除时,它被执行。

ui configuration (内部)

之前的脚本文件包括了用户界面设置的信息。它是由maya或者一个plug-in为了保存面板排列和编辑状态信息
而自动的产生的。当你打开一个文件时,这个脚本结点执行它的脚本文件。在执行之后,该结点被删除掉。之
后的脚本是不会运行的。如果一个文件被提供或被输入,这个结点将会不存在。

软件渲染

如果你选派好脚本作为之前的脚本,脚本的执行在一个动画之前被渲染。如果你选派好脚本作为之后的脚本,
脚本的执行在一个动画之后被渲染。

软件桢渲染

如果你选派好脚本作为之前的脚本,脚本的执行在一个桢之前被渲染。如果你选派好脚本作为之后的脚本,脚
本的执行在一个桢之后被渲染。

8--点击edit键给脚本结点赋类型。

9--如果你想增加另外一个脚本结点,点击new script node键。

script窗口和script node name框被清除,你可以输入一个新的脚本结点。

一个脚本语言结点是一个包括了一个 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。

2--点击复选框将execute script nodes打开或者关闭。

6、删除脚本语言结点

可以使用表达式编辑器删除脚本语言结点。

为了删除一个脚本语言结点:

1--s选择window expression editor。

2--在表达式编辑器中选择select filter by script node name。

3--选择你想在script nodes list中要删除的脚本语言结点。

4--点击delete按键。

定义数据

本章描述 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, 和 0
float 小数 392.6, 7.0, and -2.667
string 一个或更多的字符 "what's up, chief?"
vector 三个浮点数 %26lt;%26lt;3,?7.7,?9.1
matrix 浮点数阵列 %26lt;%26lt;1.1, 2, 3; 6.7, 5, 4.9

以上类型除matrix外,都可以是一个阵列。如,一个三元素的整数阵列是一个跟一个的三个整数。

声明和标注变量

声明一个变量是说明变量的名字和类型;标注一个变量是给已生命的变量一个专有的值。下例是将声明和标注合为一步:

int $temp = 3;
float $temp = 222.222;
string $temp = "heya kid.";
vector $temp = %26lt;%26lt;1, 2.7, 3.2;
matrix $temp = %26lt;%26lt;4.5, 1, 0.2; -13, 9911, 0.007;

当生命矩阵变量时,必须包括二维阵列的尺寸。

下例说明对整型、浮点、字符串和矢量阵列型变量阵列的声明和标注:

int $temp = {100, 1000, -70, 2, 9822};
float $temp = {43.3, -10.7, 0, 82.5};
string $temp = {"lord", "flies", "cool brown fox2."}; %26lt; p

vector $temp = {%26lt;%26lt;0, 0, 0, %26lt;%26lt;0.01, -2, 16};

如果一个变量被声明但未被标注,它的所有的值是0;字串变量则?quot; "。

float $temp; // 赋值: 0;
string $temp; // 赋值: {"", "", ""};
vector $temp; // 赋值: {%26lt;%26lt;0, 0, 0, %26lt;%26lt;0, 0, 0};
matrix $temp; // 赋值: %26lt;%26lt;0, 0; 0, 0; 0, 0;

如果一个变量被声明或者被使用而没有定义它的类型,它被隐含声明为将要赋值给它的那种类型。

$temp = 0.0; // 浮点数
string $temp; // 零元素字符串阵列
$trip = "heya buddy"; // 字符串
$rip = {1, 2, 3, 4}; // 四元素整型阵列
$lip = %26lt;%26lt;1, 2.1; 3, 4; // 2x2 矩阵
$flixp = $temp; // 零元素字符串阵列

注意值0.0是一个浮点数,而一个0值是一个整型数。这决定了在隐含声明时是产生一个浮点数还是产生一个整型数。
不建议使用隐含声明,因为它不象变量的隐含声明那样的清楚。

保留字

mel的保留字可以是一个变量类型、控制逻辑或是表达一个值。以下是mel的保留字:

break case continue default do else
false float for global if in
int matrix no off on proc
return string switch true vector while
yes

数据类型关键字

int float vector string matrix

布尔常数关键字

yes no on off true false

流动控制关键字

if else for while do in break continue default switch case

其他关键字

global return source catch alias proc

保留字也区分大小写。所以int是整型,int不是。实际上alias、source、catch 也是保留字,但它们起指令作用,
因此没有被包括在上述表内。

字符串

字符串可用"+"运算连接。

string $what = "whale";
string $title = "great" + " white " + $what;

这将使title变量的内容为great white whale。

矢量

为寻址一个vector的各个成分,使用"."。

vector $los = %26lt;%26lt;1, 2, 7;
float $firstcomponent = $los.x; // 赋值为 1
float $secondcomponent = $los.y; // 赋值为 2
float $thirdcomponent = $los.z; // 赋值为 7

标注矢量的成分:

vector $lock = %26lt;%26lt;7, -4, 9;
$lock = %26lt;%26lt;$lock.x, $lock.y, 3; // assigned %26lt;%26lt;7, -4, 3

但不能直接给一个成分标数字:

$lock.z = 3000; // 错误

但是通常当访问一个矢量成分时,你应该象下面例子那样围绕它使用括号:

例子:
print $lock.x; // 错误
print($lock.x);
setattr persp.scalex $los.x; // 错误
setattr persp.scalex ($los.x);

阵列

你可以声明一个int, float, string或vector类型的阵列。阵列的第一个序号为0

string $array = {"first\n", "second\n", "third\n"};
print($array); // 显示 "first\n"
print($array); // 显示 "second\n"
print($array); // 显示 "third\n"

阵列尺寸可以自动地增加。

int $scores; // 声明为一个0元素阵列
$scores = 3; // 现在是151元素阵列
$scores = 5; // 现在是201元素阵列 但最好不要声明过大的没用的阵列,因为它要占内存:

int $bigboy;
$bigboy = 2; // 危险

要除去一个阵列的所有元素可使用clear**能。要查看阵列的尺寸可使用size。

string $hats = {"blue", "red", "black"};
print("there were " + size($hats) + " hats.\n");
clear($hats);
print("but now there are " + size($hats) + ".\n");

以上指令的输出是:

there were 3 hats.
but now there are 0.

矩阵

可以把一个矩阵想象为一个浮点阵列的阵列,或是一个浮点数据的二维阵列。矩阵产生后,它的尺寸不能改变。
企图寻址一个矩阵的不存在的元素将会出现错误。在产生矩阵时必须定义它的尺寸。

matrix $a1 = %26lt;%26lt;1; 4; // 错误: 没有说明尺寸
matrix $a2; // 错误: 没有说明尺寸
matrix $a3; // 有效: 产生 %26lt;%26lt;0; 0;
$a3 = 7; // 错误: 元素不存在
$a3 = 9; // 有效

声明而未标注值的矩阵,其所有元素都为0。

matrix $a4 = %26lt;%26lt;-3.4, 6, 201, 0.7; 4, 2, 9.3, 1001;

如果矩阵表示一个二维阵列,则第一个索引表示列;地二个索引表示行:

matrix $a4column 0column 1column 2column 3
row 0-3.462010.7row 1429.31001

如果你把矩阵设想为一个身列的阵列,则第一个索引表示阵列,第二个索引该阵列里的索引:

matrix $a4index 0index 1index 2index 3
float array 0-3.462010.7float array 1429.31001

物体属性

属性是场景中的物体的特征或参数。在maya中可以用许多方法建立属性-属性编辑器、mel程序、工具盒工具或表达式。
你可以设立属性去控制在工作空间中看到的虚拟的事情。
如,一个nurbs球具有属性scalex, scaley, scalez, rotatex, 等等。

物体属性名

物体属性名具有如下格式:

objectname.attributename

其中objectname是物体的名字,attributename是该物体的属性名。属性名中不要使用空格或特殊字符,可以用下划线。

产生一个名字为brawl的球:

sphere -name brawl;

可以获取它的属性的一个值:

float $yscale = `getattr brawl.scaley`;

brawl.scaley是brawl物体的scaley属性的全名。

路径

如果两个物体具有不同的父物体,它们可以有相同的名字。当说明有相同名字的物体时必须使用路径:

pathname|objectname

其中pathname物体的父物体。管道字符(|)用于区分路径。

sphere -name doughnuthole;
group -name groupa;
sphere -p 3 0 0 -name doughnuthole;

现在我们有两个叫做doughnuthole的物体,但一个有父物体groupa,另一个没有父物体。以?*噶畈桓龃砦螅?br / 因为maya不知道哪个doughnuthole物体要设立scaley属性:

setattr doughnuthole.scaley 3.3; // error: 哪个?

你必须输入属性的路径:

setattr groupa|doughnuthole.scaley 3.3;
setattr |doughnuthole.scaley 0.3;

你可以说明物体的所有路径,用管道符进行区分:

group -name groupb groupa;

setattr |groupb|groupa|doughnuthole.scaley 1;

物体属性的可能的数据类型

每个属性有特定的数据类型。几何体, 粒子物体, maya中的其他项都具有这些数据类型的属性:

数据类型 意义 属性例 数据例

浮点小数 numbers ball.translatex 2.6, 7.0, -9.1int
整数 (...-1, 0, 1, 2...) ballshape.spansu -289, 33, 0
boolean 0或1 ball.visibilityon, off, yes, no, 1, 0, true, false

考虑一个由以?*噶畈慕凶鯢ire的粒子物体:

particle -name fire -position 7 0 7;

它可以具有以下另外的数据类型:

数据类型 意义 属性例 数据例

vector array 矢量阵列 fireshape.position
{%26lt;%26lt;3.2,?7.7,?9.1, %26lt;%26lt;7,?10,?2.2}
double array 浮点阵列 numbersfireshape.lifespan 1.333 1.666

你可以使用getparticleattr和setparticleattr指令设立矢量的元素或一个粒子系统的双阵列。

float $tmp =
`getparticleattr -at position fireshape.pt`;
vector $particleposition = %26lt;%26lt;$tmp, $tmp, $tmp;
(完)