一个关于maya mel插件安装的简单程序 ,只求其中逻辑图。这个MEL脚本是实现frame0到指定帧的播放速度。

在线编辑:52design
本文链接:
推荐阅读:
免责声明:本站刊载此文不代表同意其说法或描述,仅为提供更多信息。对本文有异议,请联络本站!
转载要求:文章作者及来源信息必需保留。转载之图片、文件请不要盗链本站地址,且不准打上各自站点的水印!
创意素材推荐
近期推荐报道
Photoshop| 插画艺术| 网页设计| 插画艺术| Photoshop| HTML/CSS| 平面设计| 插画艺术| 平面设计| 网页设计|武汉动漫学院|MAYA培训|MAYA教程|MEL脚本编辑器
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;
editMenuUpdate MayaWindow|menu2;
但是,只有以下的MEL指令需要引入属性编辑器:
同时,对于一些作用来说,也不总是会将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 &
一个脚本语言程序结点有三个属性:
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 下拉菜单里选择以下的一个脚本程序结点类型:
当你使用scriptNode指令,隐含地需求它时,运行脚本文件(看在线指令文件的scriptNode指令的信息)。
忽略这种类型的脚本文件的之前和之后的属性。
Open/Close
如果你已经指定了该脚本文件作为之前的脚本文件,当以批处理模式读文件时脚本被执行。如果你把它
作为之后的脚本文件,当文件被关闭或者没有以图示用户界面模式提供,或者当该结点被删除时,它被执行。
GUI Open/Close
如果你已经指定了该脚本文件作为之前的脚本文件,当以图示用户界面模式运行MAYA,在读文件时脚本文件
被执行。如果你把它作为之后的脚本文件,当文件被关闭,或者没有以图示用户界面模式提供,或者当该结
点被删除时,它被执行。
UI Configuration (内部)
之前的脚本文件包括了用户界面设置的信息。它是由Maya或者一个plug-in为了保存面板排列和编辑状态信息
而自动的产生的。当你打开一个文件时,这个脚本结点执行它的脚本文件。在执行之后,该结点被删除掉。之
后的脚本是不会运行的。如果一个文件被提供或被输入,这个结点将会不存在。
如果你选派好脚本作为之前的脚本,脚本的执行在一个动画之前被渲染。如果你选派好脚本作为之后的脚本,
脚本的执行在一个动画之后被渲染。
软件桢渲染
如果你选派好脚本作为之前的脚本,脚本的执行在一个桢之前被渲染。如果你选派好脚本作为之后的脚本,脚
本的执行在一个桢之后被渲染。
8--点击Edit键给脚本结点赋类型。
9--如果你想增加另外一个脚本结点,点击New Script Node键。
Script窗口和Script Node Name框被清除,你可以输入一个新的脚本节点。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。2036人阅读
MAYA MEL 基础
1 MEL代码基础
1.1数据类型
存放整数,一般为32位,有些平台可能为64位,默认值为0
&&&&&& 存放实数,类似于C中的double类型,一般为64位,但是有些平台可能也不一样,默认值为0.0
&3&string:字符串
& & & & 用双引号包围起来,字符串的基本操作有:连接(使用”+”号将两个字符串连接),求长(使用size函数计算长度),分割(使用tokenize函数将字符串分割子字符串),默认值为空字符串。跟C中的字符串风格类似。
&4&vector:矢量
& & & &用于存放3个float型数据,一般用于存放顶点坐标,可以使用.x,.y,.z属性读取其中的3个数据,但是不能单独对其中的一项赋值。默认值&&0.0,0.0,0.0&&&
&5&array:数组
& & & &使用具体的类型定义一个数组,用法和C中的一样使用方括号([])进行定义,使用 size函数获得数组的长度,使用下标访问数据,第一个数据的下标为0。
& & & & 跟C不同的是MEL中的数组长度可以动态改变,将数组长度作为下标对其赋值,数组长度加1并存储这个新元素。假如越界的下标比数组长度还大,对这个下标的元素赋值,则数组的长度为新下标减1,中间未赋值的元素为这个数组类型的默认值。
& & & & 使用clear函数清空数组&
&6&matrix:矩阵
& & & &是一个二维矩阵,存放float类型的数据,使用C中的二维数组访问方式,第一个数据的下标为[0][0],矩阵的大小定义之后不能再改变。
&&&&&& 矩阵初始化示例:
&&&&&& matrix$mat[2][4] = &&1,2,3,4;5,6,7,8&&;//没行用分号分隔&
& & & &使用whatIs可以查询变量或函数的类型&
1.2 变量定义及类型转换
&&&&&& (DataType)&$varN
&&&&&& 每个变量名前面都要带一个美元符($),定义变量可以不设定变量类型,而是直接声明,它的类型根据后面给它所赋的值来确定。
&&&&&& 假如一个变量使用一个类型确定后(定义时未使用类型名时由系统确定),在后面给它赋值不同类型的值都会尝试转换为定义时的类型。所以在赋值的时候要注意变量的类型,不然可能会发生数据截断。
&&&&&& MEL数据类型转换之间的规则
原类型 & & & & & & & & & & & &&
转换类型 & & & & & & & &
示例 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
float $i = 3;
//Result: $i = 3.0
vector $v = 3;
//Result: $v = &&3.0,3.0,3.0&&
int $i = 3.45;
//Result: $i = 3;
vector $v = 3.45;
//Result: $v = &&3.45,3.45,3.45&&
int $i = &&1,2,3&&
//Result:$i=3;为矢量长度整数部分
float &$i = &&1,2,3&&
//Result:$i=3.7416;为矢量长度
&1.3 运算符
赋值运算符: =
算术运算符:+ - * / %(求余) ^(两个矢量的叉乘,v1^v2)
& & & & & & & & & & & 两个矢量用*相乘为它们的点乘
布尔运算符
& & & & true, yes, on, 1
& & & & false, no, off, 0
& & & & 假如将布尔变量用于算术运算,可以发现它使用vector进行计算
比较运算符 & & &= == !=
逻辑运算符 || && ! & & &
& & & &运算符的优先级跟C中的一样
1.4 代码块
&&&&&& 每条代码使用分号结束,每个语句块使用大括号分割,有如下可以使用的循环
& & & &for ,while ,do while,switch
& & & & & & & 和c一样
& & & &for in
& & & & & & & for($elems in $vals) …可以对数组,向量等数据类型使用这类遍历
&&&&&& 相当于C中的函数,定义形式如下
&&&&&& proc returnType procName(DataType 1val1,DataType2 val2,…) & & &
& & & &要使用关键字proc,下面是一个示例
proc int sumTwo(int $val1,int $val2)
int $sum = $val1+$val2;
int $t = sumTwo(3,5);
//Result:8
& & & &当一个定义好的过程使用CTRL+ENTER提交到MEL系统中后,同一文件中的代码就能调用它了。&
1.6 全局变量
&&&&&& 为了可以在不同的MEL文件中进行数据交互,可以使用全局变量实现。定义了全局变量后,就可以在Maya内随时访问它。定义形式如下:
&&&&&& global DataType $valN
&&&&&& 相对于普通变量的定义在前面添加了一个global关键字。要访问全局变量,需要先声明这个全局量,假如前面定义了一个$fileName的string类型全局变量,现在要访问它:
global string $fileN//首先声明
$fileName = “e:/proj1/skinning.mb”;
& & & &假如这处没有使用global关键字,则$fileName会被当做是一个局部变量。
&&&&&& 全局变量一般在定义的时候初始化,在定义后不能再做初始化,而是只能先作一个声明,然后再操作这个全局变量。
&&&&&& 使用命令env可以查看当前MAYA中定义的所有全局变量。
1.7 全局过程
&&&&&& 也是使用关键字global定义全局过程。定义后可以在Maya中任意调用&
在ScriptEditor中定义的变量和过程都自动是全局的,所以要想定义的变量和过程可撤销,应该在最外部使用花括号({})。
& & & & 学习MEL编程的根本目的就是为了使用这些内部命令,MAYA提供了许多的MEL命令,网上有一个MEL reference,可以查询MEL的所有命令&
&1& help &commandName&
& & & & 要查询某个命令的具体用法,最简单的办法是在命令行或命令编辑器中输入help commandName
&2& 执行命令
& & & & commandN
& & & & 可以写在MEL程序中,或直接写在命令行、命令编辑器中
&3& 命令返回值
& & & & 许多命令都有一个返回值,使用左引用符号(``,TAB键上方)或eval函数
$clusters = `ls -type &skinCluster&`;
string $cmd = “4 + 9”;
int sum = eval($cmd);
3 MEL文件加载
& & & &MEL文件自动保存的时候被存放到maya/scripts文件夹下。运行MEL文件中的过程有两种方式。
&1&直接调用
& & & &将过程定义为全局的过程,存放到默认文件夹下,文件名为过程名.mel,下次maya启动后就可以直接调用这个过程了
&2&源化后调用
& & & & 使用source命令将mel文件源化,就是将其加载到maya中,然后就可以调用这个mel文件的任意过程了。这种做法对应的mel文件中的过程也要是全局的,但不必使过程名和mel文件相同,示例:
source &e:/kfq/mel/mel_test.mel&;
& & & & 使用getenv MAYA_SCRIPT_PATH可以获得Maya的脚本路径。Maya在默认的情况会搜寻这些路径下的脚本,假如要添加自己的路径,可以在Maya.env文件添加MAYA_SCRIPT_PATH = my_custom_path(使用正斜杠将文件夹分开)。Maya.env可以通过命令about&-environmentFile查询获得。
& & & & MAYA每次启动的时候,都会运行脚本目录下面的名为userSetup(.mel,.py)的文件。
4&& 示例程序:
&1&分割字符串
& & & &比如取出一个三角形面的三个顶点的索引
select -rMesh.f[i];
string $face[] = `polyInfo -faceToVertex`;//得到的结果为:FACE
string $buffer[];
tokenize$ face[0] & & $
& & & 执行这段代码得到的结果为以空格分割的几个字符串,存放到了数组buffer中
&&2&将选中的顶点输出到文件 & & &
proc outputsel(string $fileName,$string $regionName)
string $sels[] = `ls -selection`;
string $strT
$fileId = `fopen $fileName &a&`;
for($i=0;$i&size($sels);++$i)
string $buffer[];
tokenize $sels[$i] &.& $
string $str = `substring $buffer[1] 5(size($buffer[1])-1)`;
string $buffer1[];
tokenize $str &:& $buffer1;
if(size($buffer1)&1)
int $start = int($buffer1[0]);
int $end = int($buffer1[1]);
for($k=$$k&=$++$k)
$strTotal = $strTotal +string($k)+&\n&;
$strTotal = $strTotal +$buffer1[0]+&\n&;
fprint $fileId $strT
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:84600次
积分:1343
积分:1343
排名:第13093名
原创:44篇
转载:19篇
评论:15条
(2)(1)(2)(1)(6)(5)(3)(1)(1)(1)(8)(2)(6)(2)(3)(2)(4)(4)(1)(8)(3)(3)[MAYA]告诉你MEL是什么(三)
五、使用脚本语言结点
  一个脚本语言结点是一个包括了一个MEL脚本语言程序的结点。当该结点产生或者当该结点被破坏时,该程序被执行,它取决于脚本结点的类型。
  本章包括以下内容:1、了解脚本语言结点;2、产生脚本语言结点;3、测试脚本语言;4、编辑脚本语言结点;
5、设立脚本语言结点的执行;6、删除脚本语言结点。
--------------------------------------------------------------------------------
1、了解脚本语言结点
  脚本语言结点是把一个MEL脚本语言程序存储到一个Maya场景文件中的一种方法。脚本语言结点也包含了用于产生用户界面的所有MEL指令,并被用MAYA文件保存。你可以用不同的方法执行脚本语言程序。可以指明一个脚本程序结点执行它的程序:
当该结点是从一个文件中读出的;
在渲染一桢图像的之前或者之后;
在渲染一个动画的之前或者之后。
当一个文件关闭着时使用File & Open或者File &
  一个脚本语言程序结点有三个属性:
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 下拉菜单里选择以下的一个脚本程序结点类型:
  当你使用scriptNode指令,隐含地需求它时,运行脚本文件(看在线指令文件的scriptNode指令的信息)。
忽略这种类型的脚本文件的之前和之后的属性。
Open/Close
  如果你已经指定了该脚本文件作为之前的脚本文件,当以批处理模式读文件时脚本被执行。如果你把它作为之后的脚本文件,当文件被关闭或者没有以图示用户界面模式提供,或者当该结点被删除时,它被执行。
GUI Open/Close
 如果你已经指定了该脚本文件作为之前的脚本文件,当以图示用户界面模式运行MAYA,在读文件时脚本文件被执行。如果你把它作为之后的脚本文件,当文件被关闭,或者没有以图示用户界面模式提供,或者当该结点被删除时,它被执行。
UI Configuration (内部)
  之前的脚本文件包括了用户界面设置的信息。它是由Maya或者一个plug-in为了保存面板排列和编辑状态信息而自动的产生的。当你打开一个文件时,这个脚本结点执行它的脚本文件。在执行之后,该结点被删除掉。之后的脚本是不会运行的。如果一个文件被提供或被输入,这个结点将会不存在。
  如果你选派好脚本作为之前的脚本,脚本的执行在一个动画之前被渲染。如果你选派好脚本作为之后的脚本,脚本的执行在一个动画之后被渲染。
软件桢渲染
  如果你选派好脚本作为之前的脚本,脚本的执行在一个桢之前被渲染。如果你选派好脚本作为之后的脚本,脚本的执行在一个桢之后被渲染。
8--点击Edit键给脚本结点赋类型。
9--如果你想增加另外一个脚本结点,点击New Script Node键。
Script窗口和Script Node Name框被清除,你可以输入一个新的脚本结点。
-------------------------------------------------------------------
3、测试脚本程序
可以使用表达式编辑器对脚本程序进行测试。
为测试一个脚本程序:
1--选择Window & Expression Editor。
2--在表达式编辑器中选择Select Filter & By Script Node
3--在Script window中输入脚本程序,或从Script Nodes 表中。
4--点击Test Script键。
错误显示在脚本语言编辑器中。
-------------------------------------------------------------------
4、编辑脚本语言结点
可以使用表达式编辑器对脚本语言结点进行编辑。
为了对脚本语言的编辑定义一个编辑器:
1--选择Window & Expression Editor。
2--在表达式编辑器中选择Select Filter & By Script Node
3--从编辑器下拉菜单中选择一个编辑器。
为了编辑一个脚本语言结点:
1--选择Window & Expression Editor。
2--在表达式编辑器中选择Select Filter & By Script Node
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
3--选择你想在Script Nodes list中要删除的脚本语言结点。
4--点击Delete按键
六、定义数据
  本章描述MEL的数据类型它们之间的转换:1、变量;2、常数;3、数据类型转换;4、限制。
--------------------------------------------------------------------------------
  所有变量名以$开始。变量名不包括空格和特殊字符。你可以使用下划线和数字作为变量名但开头不能是数字。识别大小写,如$temp不同于$Temp。
int $radical7M // 有效 int HEY // ERROR: 开头缺"$" int $
// ERROR: 开头不是"$" int $_VAL_ID___AIT_; // 有效 int $howdyYa` //
ERROR: 含有无效字符 int $1B // ERROR: 开头不能是数字
有以下五种变量类型:
类型 意义 例子
int 整数 (...-2, -1, 0, 1, 2...)10, -5, 和 0
float 小数 392.6, 7.0, and -2.667
string 一个或更多的字符 "What's up, chief?"
vector 三个浮点数
&&3,?7.7,?9.1&&
matrix 浮点数阵列 &&1.1, 2, 3; 6.7, 5,
  以上类型除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,
当生命矩阵变量时,必须包括二维阵列的尺寸。
下例说明对整型、浮点、字符串和矢量阵列型变量阵列的声明和标注:
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."}; vector $tEMp[2] = {&&0, 0,
&&0.01, -2,
如果一个变量被声明但未被标注,它的所有的值是0;字串变量则? "。
float $teMP; // 赋值: 0; string $TEMp[3]; // 赋值: {"", "", ""}; vector
$TEmP[2]; // 赋值: {&&0, 0,
0&&}; matrix $TeMP[3][2]; // 赋值:
&&0, 0; 0, 0; 0,
如果一个变量被声明或者被使用而没有定义它的类型,它被隐含声明为将要赋值给它的那种类型。
$tEMP = 0.0; // 浮点数 string $TEMP[]; // 零元素字符串阵列 $trip = "heya
Buddy"; // 字符串 $rip = {1, 2, 3, 4}; // 四元素整型阵列 $lip =
&&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
数据类型关键字
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
也是保留字,但它们起指令作用,因此没有被包括在上述表内。
2.字符串
字符串可用"+"运算连接。
string $what = "Whale"; string $title = "Great" + " White " +
这将使title变量的内容为Great White Whale。
为寻址一个vector的各个成分,使用"."。
vector $LOS = &&1, 2,
7&&; float $firstComponent = $LOS.x;
// 赋值为 1 float $secondComponent = $LOS.y; // 赋值为 2 float
$thirdComponent = $LOS.z; // 赋值为 7
标注矢量的成分:
vector $LOCK = &&7, -4,
9&&; $LOCK =
&&$LOCK.x, $LOCK.y,
3&&; // Assigned
但不能直接给一个成分标数字:
$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[3] = {"first\n", "second\n", "third\n"};
print($array[0]); // 显示 "first\n" print($array[1]); // 显示
"second\n" print($array[2]); // 显示 "third\n"
阵列尺寸可以自动地增加。
int $scores[]; // 声明为一个0元素阵列 $scores[150] = 3; // 现在是151元素阵列
$scores[200] = 5; // 现在是201元素阵列 但最好不要声明过大的没用的阵列,因为它要占内存: int
$bigBoy[]; $bigBoy[] = 2; // 危险
要除去一个阵列的所有元素可使用clear功能。要查看阵列的尺寸可使用size。
string $hats[3] = {"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[][] = &&1;
4&&; // 错误: 没有说明尺寸 matrix $a2[][]; //
错误: 没有说明尺寸 matrix $a3[2][1]; // 有效: 产生
0&&; $a3[0][1] = 7; // 错误: 元素不存在
$a3[1][0] = 9; // 有效
声明而未标注值的矩阵,其所有元素都为0。
matrix $a4[2][4] = &&-3.4, 6, 201,
0.7; 4, 2, 9.3, 1001&&;
如果矩阵表示一个二维阵列,则第一个索引表示列;地二个索引表示行:
matrix $a4[2][4]column 0column 1column 2column 3 row
如果你把矩阵设想为一个身列的阵列,则第一个索引表示阵列,第二个索引该阵列里的索引:
matrix $a4[2][4]index 0index 1index 2index 3 float array
0-3.float array
6.物体属性
  属性是场景中的物体的特征或参数。在Maya中可以用许多方法建立属性-属性编辑器、MEL程序、工具盒工具或表达式。你可以设立属性去控制在工作空间中看到的虚拟的事情。如,一个NURBS球具有属性scaleX,
scaleY, scaleZ, rotateX, 等等。
物体属性名
物体属性名具有如下格式:
objectName.attributeName
  其中objectName是物体的名字,attributeName是该物体的属性名。属性名中不要使用空格或特殊字符,可以用下划线。
产生一个名字为Brawl的球:
sphere -name B
可以获取它的属性的一个值:
float $yScale = `getAttr Brawl.scaleY`;
Brawl.scaleY是Brawl物体的scaleY属性的全名。
如果两个物体具有不同的父物体,它们可以有相同的名字。当说明有相同名字的物体时必须使用路径:
pathname│objectname
其中pathname物体的父物体。管道字符(│)用于区分路径。
sphere -name doughnutH group -name GroupA; sphere -p 3 0 0
-name doughnutH
现在我们有两个叫做doughnutHole的物体,但一个有父物体GroupA,另一个没有父物体。以下指令产生一个错误,因为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,
考虑一个由以下指令产生的叫做Fire的粒子物体:
particle -name Fire -position 7 0 7;
它可以具有以下另外的数据类型:
数据类型 意义 属性例 数据例
vector array 矢量阵列 FireShape.position
{&&3.2,?7.7,?9.1&&,
&&7,?10,?2.2&&}
double array 浮点阵列 numbersFireShape.lifespan 1.333 1.666
你可以使用getParticleAttr和setParticleAttr指令设立矢量的元素或一个粒子系统的双阵列。
float $Tmp[] = `getParticleAttr -at position FireShape.pt[0]`;
vector $particlePosition = &&$Tmp[0],
$Tmp[1], $Tmp[2]&&; setParticleAttr
-at position -vv 0 0 7 FireShape.pt[0];
  对于矢量阵列数据类型,Maya用一个阵列的单元素对物体的每一部分表达指定的属性。注意,pt[0]
表达产生FireShape的第一部分的索引。每个元素是由三个浮点数构成的。在一个双阵列中,Maya用一个浮点数对每一部分表达特定的属性。
  重要事项:在表达式中,你可以使用一个等于符号(=)设立或得到一个变量或属性的值。在MEL语句中,只可以使用(=)设立或得到一个变量值。使用MEL
setAttr、getAttr、setParticleAttr、getParticleAttr指令设立或得到一个属性值。
  全局和局部变量 典型地,你将使用在一个单序列里的变量这些变量叫做局部变量(local variables),
因为它们只出现在局部过程里:
  如果你产生一个相同名字的局部变量在两个序列里,两个变量被分离并且相互无关。
如:假定你在两个序列中产生一个取名为$tester的变量。标注或修改$tester变量的一个值不影响在其他里的值。
  如果你想在一个序列里产生并动画一个变量,也要把它使用于该序列之外,你可以把它声明为一个全局变量(global
variable)。
global float $
你就可以用其它MEL指令和语句读该变量。当你要扩大该变量的使用范围时, 应再次进行声明。
global float $crash = 8; global proc holy() { $crash = 7;
print($crash + "\n"); } print($crash + "\n"); // 结果:8 holy(); //
结果:7 print($crash + "\n"); // 结果:8
尽管看起来使用了全局浮点型的crash,实际上使用了一个隐含产生的局部整型变量
(看例子: 隐含声明(Implicit declaration))。
global float $slash = 8; global proc moly() { global float $
$slash = 7; print($slash + "\n"); } print($slash + "\n"); // 结果:8
moly(); // 结果:7 print($slash + "\n"); // 结果:7
  当你用了一个单指令声明了一个全局变量并给它标注了一个值,该标注仅发生在由Maya第一次读指令的时候。被定义了的序列中的全局变量是被读的。
global proc proof() { global float $fight = 7; $fight = 2;
print($fight + "\n"); }
  知道该序列的proof被读入,变量fight没有声明。换言之,Maya还没有觉察到它的变量的存在。但是,一旦该序列被读入和被定义,该变量fight被声明为一个全局浮点型并被赋值为7。该声明之后,该全局变量对所有的MEL指令都是可见的。即它可被任何MEL指令修改。
但是,当proof被执行后,fight被赋值为2。
如:在proof被定义后,以下指令将产生给出的结果:
print($fight + "\n"); // Result: 7 // Result: 2 print($fight
+ "\n"); // Result: 2
如果两个序列对相同的全局变量声明和标注一个值会出现什么情况?看以下两个脚本文件:
(假定放在你的脚本目录中):
脚本文件: crush.mel global proc crush() { global float $sight = 7;
print $ } 脚本文件: groove.mel global proc groove() { global
float $sight = 9; print $ }
一个值标注到一个全局变量仅仅是在第一次Maya读每个脚本文件时。
crush(); // Result: 7 groove(); // Result: 9 crush(); // Result:
-------------------------------------------------------------------
  MEL中的常数只有布尔常数(Boolean constants)。它实际上是整型数,值为1或者为0。
关键字true, on, 和yes具有值1;关键字false, off 和 no具有值0。
-------------------------------------------------------------------
3、数据类型转换
-------------------------------------------------------------------
int float string vector matrix
-------------------------------------------------------------------
int ($i) perfect perfect perfect
float ($f) without perfect perfect
string without perfect if perfect perfect if none
fraction starts with starts with
if starts number, vector or
with number else 0 floats with
,else 0 remaining
elements 0
vector length of length of 3 floats perfect perfect
vector vector separated for [1][3]
without by a space matrix,
fraction else none
matrix for [1][3] for [1][3] none for [1][3] perfect
matrix or matrix or matrix or
smaller, smaller, smaller,
length of length of perfect with
matrix matrix remaining
without elements 0
-------------------------------------------------------------------
一个标量类型(scalar type)是一个非阵列型。从阵列到标量或从标量到阵列型没有转换。
int $ski = 1.8; // 赋值:1
vector $crads = 1.7; // 赋值:&&1.7,
1.7, 1.7&&
int $wild = " 3.44 dogs"; // 赋值:3
vector $wrd = " 8 2.2 cat"; //
赋值:&&8, 2.2,
int $my = &&1, 2,
3&&; // 赋值:3
string $oo = &&6, 2.2,
1&&; // 赋值:"6 2.2 1"
matrix $so[1][3] = $ // 赋值:&&8,
float $mole = &&0.3,
0.4&&; // 赋值:0.5
vector $ole = &&2,
赋值:&&2, 7.7,
  Maya的自动类型转换使我们可以不考虑它们的状态以及不考虑是否是能接受的类型。以下是它们的规则:
--Strings 支配其他所有类型。
--Vectors 支配floats。
--Floats 支配ints。
--如果一个算子为整型,另一个为浮点型,MEL将整型转换为浮点型。
--在vector和matrix之间,左边的类型起支配作用。
--赋值时,有左边的类型支配。
  在一个赋值操作中,右边的类型被转换到左边的类型。前四条规则在右手的计算期间施用于子表达式;
最终的转换发生在给左边赋值时。 下表是自动类型转换的规则。
-------------------------------------------------------------------
运算 结果的数据类型
-------------------------------------------------------------------
int 运算子 float float
float 运算子 int float
int 运算子 vector vector
vector 运算子 float vector
vector 运算子 matrix vector
matrix 运算子 vector matrix
matrix 运算子 string string
string 运算子 int string
-------------------------------------------------------------------
$var1 = 7 + 1.3; // 类型: float (8.3) $var2 = 7.9 + 2; // 类型: float
(9.9) $var3 = 2 + &&4, 5,
6&&; // 类型: vector
8&& $var4 = 0007 + " Lives!"; // 类型:
string ("7 Lives!")
  在最后的例子中,0007是值7的整型,它被转换为一个字符串并与"Lives!"合并。结果是一个字符串,它显式声明var4为值是"7
Lives!"的字符串类型。
有两个显式方法把一个类型的值转换给另一个。最常用的方法是在该值前面用括号说明:
$Z = (vector) "&&1, 2,
3&&";// Type: vector
3&& $cools = (float) 7; // Type:
float (7) $ools = (string) 47.554; // Type: string ("47.554")
你也可以采用跟随括号来实现显式转换:
$ly = vector("&&1, 2,
3&&"); // Type: vector
3&& $ooly = int(3.67); // Type: int
-------------------------------------------------------------------
整数除法的舍弃
当Maya对常数和没有声明数据类型的变量运行算术运算时,它按照表现形式推测数据类型。如以下指令:
float $where = 1/2; // Result: 0
  Maya推测1和2是整型数,因为它们没有小数点。该表达式用整数1除以整数2。其整数结果是0而余数是1。
Maya不保留该余数。
  由于变量是浮点的,Maya将整数值0转换为浮点数0 (相同值)。 为得到该值的小数成分,需要将一个整数转换为浮点:
float $there = 1/2.0; // 结果: 0.5 或 float $youGo = float(1)/2;
精度和最大数长
  对于一个字串、矩阵或阵列,最大尺寸仅取决于你的计算机的存储器的有效容量。但是,浮点和整型有精度和最大长度的限制。
  一个整数的最大长度与C
语言中是一样的,决定于机器。大部分计算机中它的范围是-2,147,483,648到2,147,483,647。一个浮点数的最大长度和精度与C语言中的双精度数是一样的,也取决于机器。浮点有精度限制,在长计算里会积累取舍误差。但它的精度很高(大约15位的精度),
取舍通常不会成问题。
超限折返(Range wrap-around)
  变量有范围限制。如果超出这个范围,会产生不期望的后果。
int $mighty =
+ 1; // Result: - int $radical =
- - 1; // Result:
int $buddy = ; //
Result: - int $man =
+ 2; // Result:
  当超出了变量的最大范围,变量的值转折为变量的最小值;反之,若超出最小范围,会转为最大值。
float $GG = 1.5 +
* 3; // Result: -.5
  在这个例子中,按照优先顺序先做乘法。因为是两个整数相乘,所以其结果还是一个整数。
因为它的值超过了整型数的最大范围,所以该值被折返。
另一个例子:
$GG = 1.5 +
* 3; $GG = 1.5 + ; // 超出整型最大范围 $GG
+ () - (.0); $GG = 1.5 +
+ (-) - (.0); $GG = 1.5 +
- ; $GG = 1.5 + -; $GG = -.5;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 maya mel插件安装 的文章

 

随机推荐