面向程序员的 MEL

 
 
 

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

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

认识到 MEL 起源于壳脚本,有助于解其更加独特的功能。

快速概述

指定和值

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

MEL 是一种强类型语言 (strongly typed language),但在多数情况下允许隐式声明和键入。当声明一个变量时,便同时声明了其类型,并可以选择指定一个初始值。

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

MEL 具有常用整数 (Int)、浮点 (float) 和 字符串数据类型。它还包含向量数据类型,这是浮点的三元值(在处理 3D 数据时非常有用)、数组(变量大小的列表,其中所有元素都是同一类型)和矩阵(矩阵是固定大小的浮点二维表)。数组中的所有项目必须是同一类型。

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 会尽可能自动转化类型。

控制及循环语句和运算符

MEL 的控制语句非常类似于 C 和 Java 语言。

if ( $a == $b) {
	...
} else if ($a > $b) {
	...
} else {
	...
}
$a = ($b > 10) ? $c : ($c - 10);
switch ($color) {
 case "blue":
 ...
 break;
 case $c1:
 ...
 break;
 default:
 ...
 break;
}
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"};
for ($k in $arry) {
	...
}

定义和调用步骤

可以使用以下语法创建用户定义的步骤:

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 使用前面带有 // 的 C++ 式 行 释,以及由 /**/ 包围的自由形式注释。

MELisms

MEL 编程的一些特性会难倒经验丰富的程序员以及初学者。

MEL 中的每个语句必须以分号 (;) 结束。

if ($a > $b) {print("Hello");};
// Both semicolons are required!

与某些脚本语言/环境不同(但与 Logo 语言类似),声明一个可返回值的表达式并不会自动在 MEL 中打印值。这样做反倒会导致错误。

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

在 MEL 中,经常会使用相同的命令来创建操作、编辑现有操作并查询有关现有操作的信息。在每种情况下,标志都会控制命令所要进行的操作(创建、编辑或查询)。

// Create a sphere named "mySphere" with radius 5
sphere -radius 5 -name "mySphere";
// Edit the radius of mySphere
sphere -edit -radius 3 "mySphere";
// Print the radius of mySphere
sphere -query -radius

在 MEL 中,可按照命令语法(类似于 UNIX 壳命令)和函数语法键入命令。使用命令语法,可以省略单字字符串周围的引号,并使用空格而不是逗号来分隔参数。

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

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

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