表达式的执行频率

“表达式编辑器”(Expression Editor)中键入表达式后,单击“创建”(Create)“编辑”(Edit)按钮以编译表达式。编译表达式时会检查表达式是否存在语法错误,并将表达式转化为一种 Maya 可在您回放或播放动画时执行的形式。编译后,系统会对当前帧执行该表达式。

默认情况下,当前动画时间或帧发生更改,系统还会执行表达式。例如,回放或播放动画时,系统会执行表达式。每次动画帧或时间发生更改时,系统都会执行一次表达式。 要停止此默认求值,请在表达式编辑器中将表达式节点“求值”(Evaluation)模式设置为“按需”(On Demand)。

表达式中直接引用的属性更改值时,也会执行表达式。例如,当表达式将球体的“translateX”属性指定给另一个属性时,如果沿“X 轴”(X-axis)方向移动球体,系统将对球体的每个移动增量执行表达式。

pCube1.tx = pSphere1.tx * 3.0

求值

选择对象而不是粒子形状节点时,可以使用“表达式编辑器”(Expression Editor)中的“求值”(Evaluation)下拉菜单来设定表达式的执行时间。(如果选择粒子形状节点,“表达式编辑器”(Expression Editor)将灰显该菜单。有关粒子形状节点表达式的详细信息,请参见关于粒子表达式。)

编写表达式时,可以直接访问对象属性或使用 MEL 进行访问(请参见下文的注意)。

直接:

pCube1.tx = pCube2.ty * 3.0

MEL:

setAttr pCube1.tx (`getAttr pCube2.ty`* 3.0)
直接访问对象的属性后,Maya 将在节点间为这些属性建立连接。这意味着 Maya 的定向图求值过程会自动识别 pCube2.ty 值的更改,并将 pCube1.tx 标记为灰色(需要重新求值),不管“求值”(Evaluation)选项是否设置为“始终”(Always)
注: 建议不要使用 MEL 脚本访问对象的属性。使用 MEL 脚本会导致出现问题,因为这样做会在求值图中遮挡节点之间的连接,而正常运行需要这些连接。例如,不会自动对与状态相关的表达式(如缓存文件的大小或当前时间)求值。由于这些事件不会受动画驱动,因此在您切换“已设置动画”(animated)属性之前,Maya 不会对其求值。(有时可以使用 MEL 脚本,因为在一些情况下,由于要为表达式的一个或多个输入属性设置动画,因此表达式在求值图中。)但是,我们建议使用直接方法(此处所述)获得一致的结果,而不是使用 MEL 脚本。

如果“求值”(Evaluation)设置为“按需”(On Demand),则仅表达式的输入连接发生更改(在上述示例中,当 pCube2.ty 的值发生更改时),或在“表达式编辑器”(Expression Editor)中单击“编辑”(Edit)时,系统会计算表达式。如果“求值”(Evaluation)设定为“始终”(Always),即使场景中的内容没有发生更改,每帧更改也都将触发求值。

注:

如果“求值”(Evaluation)设置为“始终”(Always),则仅时间发生更改时才会强制对表达式求值。因此,在场景视图中操纵对象时,使用包括 MEL 表达式并将“求值”(Evaluation)设置为“始终”(Always)的解决方案不会求值,除非是在“交互式播放”(Interactive Playback)期间使用。