如果从表达式断开属性,表达式将不再读取或设定属性值。例如,在需要对属性设定关键帧,而不是使用表达式进行控制的时候,可能就需要断开属性。
“表达式编辑器”(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;
.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)。
假设在名为 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;
也可以使用 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;