[Maya]Mel基础教程之三

来自:http://www.5i58.net   编辑:杨一   发布时间:2006-4-9 14:00:39
maya动画培训课程

                                          [Maya]Mel基础教程之三

vector $tEMp[2] = {<<0, 0, 0>>, <<0.01, -2, 16>>};

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

float $teMP; // 赋值: 0;
string $TEMp[3]; // 赋值: {"", "", ""};
vector $TEmP[2]; // 赋值: {<<0, 0, 0>>, <<0, 0, 0>>};
matrix $TeMP[3][2]; // 赋值: <<0, 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
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 = <<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 <<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[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[123456789] = 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; 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 0-3.462010.7row 1429.31001

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

matrix $a4[2][4]index 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
{<<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]>>;