断开属性

 
 
 

如果从表达式断开属性,表达式将不再读取或设定属性值。例如,在需要对属性设定关键帧,而不是使用表达式进行控制的时候,可能就需要断开属性。

通过如下操作可从表达式断开属性:

在表达式中显示已断开属性

“表达式编辑器”(Expression Editor)将显示已断开属性,并带有一个符号占位符,以表示该属性先前存在于表达式中。

示例

假定场景中包含两个对象(球和圆锥体),且您已编写以下表达式:

Ball.translateX = Cone.translateX;
Ball.translateY = Cone.translateY;
Ball.translateZ = Cone.translateZ;

如果从场景中删除圆锥体,则 Cone.translateX、Cone.translateY 和 Cone.translateZ 属性不再存在,表达式不再读取这些属性,也不再将其指定给球的 translateX、translateY 和 translateZ 属性。

如果再次显示表达式,表达式将如下所示:

Ball.translateX = .I[0];
Ball.translateY = .I[1];
Ball.translateZ = .I[2];

.I[0]、.I[1] 和 .I[2] 字符代表已从表达式断开圆锥体的平移属性。这些符号表示表达式中属性先前使用的占位符。

.I 意味着该占位符代表一个表达式输入。表达式的输入是带有值的属性,表达式将读取该属性值以指定给另一属性或变量。括号中的数字代表读取属性的表达式中的顺序。

例如,.I[0] 代表该输入是表达式读取的第一个属性;.I[1] 代表该输入是表达式读取的第二个属性;.I[2] 代表该输入是表达式读取的第三个属性。

浮点或整型属性占位符具有值 0。粒子形状节点的向量属性占位符具有值 <<0,0,0>>。在该示例中,占位符 .I[0]、.I[1], 和 I[2] 都具有值 0。执行表达式时,它将值 0 指定给 Ball.translateX、Ball.translateY 和 Ball.translateZ。

如果从表达式断开属性,但属性仍存在于场景中,则属性将从上次表达式的执行中保留值并设定其值。

示例

假设已写完语句中的这些语句:

Ball.translateX = Cone.translateX;
Ball.translateY = Cone.translateY;
Ball.translateZ = Cone.translateZ;

如果从场景中删除球,则 Ball.translateX、Ball.translateY 和 Ball.translateZ 属性将不再存在。表达式不再将圆锥体的 translateX、translateY 和 translateZ 值指定给相应的球属性。

符号占位符替换表达式中的球属性。如果再次显示表达式,语句将如下所示:

.O[0] = Cone.translateX;
.O[1] = Cone.translateY;
.O[2] = Cone.translateZ;
注意 如果表达式将值仅指定给一个对象的属性,删除对象也将删除表达式。如果表达式将值指定给多个对象属性的属性,删除所有这些对象将删除表达式。

若要避免删除之前示例中的表达式,则需要具有设定对象属性而非已删除球属性的某些语句。例如,可能会包括该语句:

Cone.visibility = 1;

.O[0] 字符代表已从表达式断开属性 Ball.translateY。.O 表示的占位符代表来自表达式的输出。

来自表达式的输出是通过表达式指定值的属性。括号中的数字(例如,[0])代表表达式中为属性指定值的顺序。

因为 Ball.translateX 是来自表达式的第一个输出,所以表达式使用 .O[0] 进行替换。该表达式将使用 .O[1] 和 .O[2] 替换 Ball.translateY 和 Ball.translateZ,因为它们是来自表达式的第二个和第三个输出。

执行表达式时,表达式会继续将值指定给占位符,尽管占位符不会对任何对象或场景组件产生影响。

表达式将 Cone.translateX、Cone.translateY 和 Cone.translateZ 的值指定给占位符 .O[0]、.O[1] 和 .O[2],但这些占位符不会控制场景中的任何内容。语句不产生任何影响。

将属性连接到符号占位符

从表达式断开属性后,符号占位符将按之前主题所述那样替换表达式中的该属性。可以使用选择的属性替换占位符。

最直接的方法就是在表达式中每次出现符号占位符时,都键入所需的属性名称。

如果一个冗长的表达式中具有大量的符号占位符,则可以使用一条 MEL connectAttr 命令将新属性连接到同一符号占位符的所有出现位置。也可以使用窗口 > 常规编辑器 > 连接编辑器(Window > General Editors > Connection Editor)

示例 1

假设在名为 HorseController 的表达式中,已有语句中的这些语句:

WhiteHorse.translateX = Car.translateX;
BlackHorse.translateX = Car.translateX;
BrownHorse.translateX = Car.translateX;

删除汽车并重新加载表达式,此时将显示:

WhiteHorse.translateX = .I[0];
BlackHorse.translateX = .I[0];
BrownHorse.translateX = .I[0];

.I[0] 是显示 Car.translateX 属性内容的符号占位符。可以将不同的属性连接到该占位符,以便将其内容指定给 WhiteHorse、BlackHorse 和 BrownHorse 的 translateX 属性。

假设要使用名为 Cow 的对象的 translateX 属性控制这些属性。可以在“命令行”(Command Line)中输入下列 Maya 命令:

connectAttr Cow.tx HorseController.input[0]

该命令将属性 Cow.tx 连接到表达式的 input[0]。表达式名为 HorseController。input[0] 在表达式中缩写为 .I[0]。可以在“Hypergraph”“图表 > 输入和输出连接”(Graph > Input and Output Connections)中查看拼出的输入名称 input[0]。

重新加载表达式将显示新的属性连接:

WhiteHorse.translateX = Cow.translateX;
BlackHorse.translateX = Cow.translateX;
BrownHorse.translateX = Cow.translateX;

示例 2

也可以使用 connectAttr 命令重新连接表达式输出。假设在名为 HorseController 的表达式中,已有语句中的这些语句:

WhiteHorse.translateX = Car.translateX;
BlackHorse.translateX = Car.translateX;
BrownHorse.translateX = Car.translateX;

删除 BrownHorse 对象并重新加载表达式,此时将显示:

WhiteHorse.translateX = Car.translateX;
BlackHorse.translateX = Car.translateX;
.O[2] = Car.translateX;

.O[2] 是显示 BrownHorse.translateX 属性内容的符号占位符。该属性接收了占位符 .O[2],因为该占位符是表达式的第三个输出。(第一个和第二个输出来自表达式 .O[0] 和 .O[1])。可以将不同的属性连接到该占位符,以便使用 Car.translateX 的值控制该占位符,正如第三个语句所示。

假设要使用 Car.translateX 值控制名为 RedHorse.translateX 的新对象的属性。可以在“命令行”(Command Line)中输入下列 Maya 命令:

connectAttr HorseController.output[2] RedHorse.tx

该命令将 HorseController 表达式的 output[2] 连接到属性 RedHorse.tx。output[2] 在表达式中缩写为 .O[2]。

重新加载表达式将显示新的属性连接:

WhiteHorse.translateX = Cow.translateX;
BlackHorse.translateX = Cow.translateX;
RedHorse.translateX = Cow.translateX;