介绍

最近学习了一下Maya的Mel语言进行扩展开发,这里简单记录整理一下相关笔记

关于Mel

MEL 是来源于 UNIX 壳脚本的一种语言。因此,MEL 在很大程度上是依靠执行命令来完成操作,而不像其他语言那样操纵数据结构、调用函数或使用面向对象的方法。

用于控制 Maya 的大多数命令类似于 UNIX 命令行实用程序:通过许多选项来修改自身行为的独立小程序

概述

指定和值

MEL 中的指定运算符是等号 (=)。MEL 还具有类似于其他语言的快捷指定运算符(+=、-=、/=、*=、++、–等)。

声明一个变量时,便同时声明了其类型,并可以选择指定一个初始值。

变量名称以 $ 开头,后面带一个字母,然后是包含字母/数字/下划线的任意组合。所有类型的变量(标量和复合)均以 $ 开始。

MEL 具有常用整数、浮点和 字符串数据类型。它还包含向量数据类型,这是浮点的三元值、数组和矩阵。数组中的所有项目必须是同一类型。

1
2
3
4
5
int $a = 5;
float $b = 3.456;
vector $v = <<1.2, 3.4, 6.5>>;
float $ar[] = {1.2, 3.4, 4.5}; // An array of floats
matrix $mtx[3][2]; // A 3x2 matrix of floats

注意: 无法在 MEL 中创建数组的数组。 MEL 会尽可能自动转化类型。

控制及循环语句和运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//比较$a和$b,并根据结果执行不同的操作
if ( $a == $b) {
...
} else if ($a > $b) {
...
} else {
...
}

//将$a与$b是否大于的结果进行比较
//如果为true,则使用$c。
//如果为false,则$c减去10。
$a = ($b > 10) ? $c : ($c - 10);

//对Switch语句进行求值以选择应执行的代码块
switch ($color) {
case "blue":
...
break;
case $c1:
...
break;
default:
...
break;
}

//如果条件为true,请执行以下操作
while ($a < size($arry)) {
...
}

//在条件成立时执行以下操作
do {
...
} while ($a > 0);

//循环
int $i;
for ($i = 10; $i > 0; $i--) {
print($i+"...\n");
}
print("Blastoff!!!");
string $arry[3] = {"red","green","blue"};

//遍历arry中的每个k变量
for ($k in $arry) {
...
}

定义和调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
global proc <return type> <name>(<arg list>) {
...
return <exp>;
}
global proc float squareAndAdd(float $x, float $y) {
return $x * $x + $y;
}
square(5.0, 2.0);
27

//如果省略全局关键字,该步骤仅在其已被定义的脚本文件中可用。

//如果步骤不返回值,则省略返回类型关键字,且不包含 return 语句。

global proc msg() {
print("Hello world\n");
}

注释

MEL 使用前面带有 // 行注释,以及由 /* 和 */ 包围的自由形式注释。

容易出问题的地方

MEL 中的每个语句必须以分号 (;) 结束,对于{}中的语句同样适用会导致犯错

1
if ($a > $b) {print("Hello");};

与某些相比(Node.js,Python),声明一个可返回值的表达式并不会自动在 MEL 中打印值。会导致错误

1
2
3
4
5
3 + 5;
// Error: 3 + 5; //
// Error: Syntax error //
print(3+5);
8

利用Mel进行创建,编辑,查询

1
2
3
4
5
6
// 创建一个名为“mySphere”、半径为5的球体
sphere -radius 5 -name "mySphere";
// 编辑mySphere的半径
sphere -edit -radius 3 "mySphere";
// 打印mySphere的半径
sphere -query -radius

使用命令语法,可以省略单字字符串周围的引号,并使用空格而不是逗号来分隔参数

1
2
setAttr("mySphere1.translateX",10); // Function syntax
setAttr mySphere1.translateX 10; // Command syntax

函数语法会自动返回值。若要使用命令语法获取返回值,必须将命令扩在反引号中

1
2
$a = getAttr("mySphere.translateX"); // Function syntax
$b = `getAttr mySphere.translateY`; // Command syntax