表达式和 MEL 语法之间的区别

 
 
 

表达式和 MEL 语法之间只有两个区别:直接访问对象属性,以及时间和帧变量的使用。

直接访问对象属性

在表达式中,可以直接访问对象属性,而在 MEL 中则必须使用 getAttr、setAttr、getParticleAttr 或 setParticleAttr 命令。

以下是一些直接访问对象属性的表达式语法示例。

persp.translateX = 23.2;
float $perspRotX = persp.rotateX;

要在 MEL 中执行类似以上的操作,必须使用 setAttr 和 getAttr 命令,如以下示例所示。

setAttr("persp.translateY", 23.2);
float $perspRotY = getAttr("persp.rotateY");

“脚本编辑器”(Script Editor)中执行以下命令,以创建一组粒子:

particle -position 1 2 3 -position 2 1 3 -name dust;

现在,可将以下表达式语法用于粒子形状:

vector $pos = position;
acceleration = <<2, 1, 0>>;

要在 MEL 中执行类似以上的操作,必须使用 setParticleAttr 和 getParticleAttr 命令,如以下示例所示。

select dustShape.pt[0];
 float $temp[] =
 getParticleAttr("-attribute", "position", "dustShape.pt[0]");
 vector $position = <<$temp[0], $temp[1], $temp[2]>>;
 setParticleAttr("-attribute", "velocity", "-vectorValue",
 -3, 0, 0, "dustShape.pt[0]");

上述 MEL 命令仅用于 particleShape 中的第一个粒子。

时间和帧变量

在表达式中,可以使用预定义的时间和帧变量。例如:

persp.translateY = frame;
persp.rotateY = time;

不能在 MEL 中使用时间和帧。要在 MEL 中访问时间和帧信息,必须执行类似如下的操作:

float $frame = `currentTime -q`;
string $timeFormat = `currentUnit -query -time`;
currentUnit -time sec;
float $time = `currentTime -q`;
currentUnit -time $timeFormat;

注释

不能在表达式中使用多行 /* */ 注释。可以使用 // 注释。