编写运行时表达式

 
 
 

运行时表达式控制在播放动画时、动力学计算之前或之后的属性。每当执行运行时表达式时,Maya 都会更新在该表达式中被赋予值的任何属性。根据选择,可在动力学求值之前或之后对此进行更新。通常针对每帧更新一次。

如果运行时表达式未设定某一属性,该属性会将创建表达式的值用于动画的后续帧。

示例

假定您已创建一个粒子栅格,然后为其速度属性创建该运行时表达式:

particleShape1.velocity = <<0,1,0>>;

在播放动画时,表达式将粒子的栅格每秒上移 1 个栅格单位。

为了在本章和其他章节中更便于查看粒子插图,我们将其显示为已着色的小球体而不是点。

将粒子显示为球体

  1. 选择“粒子形状”(particle shape)节点。
  2. “属性编辑器”(Attribute Editor)“渲染属性”(Render Attributes)区域,选择“球体”(Spheres)作为“粒子渲染类型”(Particle Render Type)
  3. 单击“添加属性”(Add Attributes For)旁边的“当前渲染类型”(Current Render Type)按钮。

    在该按钮下会显示一个“半径”(Radius)滑块。

  4. 调整“半径”(Radius)以设定球体的大小。
  5. 启用“着色 > 对所有项目进行平滑着色处理”(Shading > Smooth Shade All)(在工作区的左上方)。

使用默认的帧速率 24 帧/秒时,粒子每帧移动 1/24 个栅格单位。使用默认的过采样级别 1 时,运行时表达式每帧执行一次。Maya 为对象的每个粒子计算一次运行时表达式。

由于表达式将速度在每一帧设定为 <<0,1,0>>,因此表达式以冗余方式执行。因此,该表达式更适用于创建表达式。但是,在该示例中,这两种表达式类型的效果相同。

示例

假定您已创建一个粒子栅格,并且动画的开始帧编号为 0。为其速度属性创建该运行时表达式:

particleShape1.velocity = <<0,time,0>>;

在播放动画时,该表达式将随着时间值的增加来增大速度的 Y 分量。这使得栅格中的所有粒子都随着时间的增加以更快的速度上升。增大的速度与加速度相同。

由于您要在每一帧增大指定中的值,因此需要在运行时表达式而不是创建表达式中使用该语句。

在创建表达式中使用该语句则会将速度设定为常量值 <<0,0,0>>,原因是在为粒子栅格执行创建表达式时,时间等于 0。

示例

上一示例为所有粒子的速度属性给出了相同的值。也可以为每个粒子给定不同的属性值。

假定您创建了一个包含 121 个粒子的栅格。

假设您进一步为其加速度属性创建该运行时表达式:

particleShape1.acceleration = sphrand(2);

每次执行运行时表达式时,该表达式对于 121 个粒子中的每个粒子执行一次。

sphrand (2) 函数提供了一个向量,其随机选择的分量位于以原点为中心且半径为 2 的假想球体中。每个粒子接收不同的向量值。有关 sphrand 函数的详细信息,请参见 sphrand

由于每个粒子在每一帧中会接收表示加速度的不同随机向量,因此在播放场景时,粒子会分别以不断变化的方向和速率加速。这会使加速度突然改变方向。

重要信息 若要为粒子给定恒定加速度,请在运行时表达式而不是创建表达式中为加速度属性指定常量值。

Maya 模拟加速度的物理特性。它在每个帧之前将加速度初始化为 <<0,0,0>>,如果过采样级别大于 1,则在每个时间步之前将加速度初始化为 <<0,0,0>>。

如果过采样级别为 2,则每帧有 2 个时间步。如果过采样级别为 3,则每帧有 3 个时间步,依此类推。

示例

假设您将动画的开始帧设定为 0,并使用“粒子工具”(Particle Tool)在原点处放置单个粒子:

然后创建一个运行时表达式来控制其位置:

particleShape1.position = <<3,time,0>>;

在播放动画时,由运行时表达式来控制该属性。在播放的第一帧中,粒子会跳到 <<3, time, 0>>。在默认帧速率为 24 帧/秒时,位置为 <<3,0.0417, 0>>,因为此时的时间值是 0.0417。

每个后续帧将以时间增量值设定的速率向上移动粒子。

如果停止并回放动画,粒子将移回原点,即使用“粒子工具”(Particle Tool)创建粒子时的原始位置。创建粒子时,Maya 会在内部保留的初始状态属性 position0 中存储其原始位置。有关详细信息,请参见了解初始状态属性

由于该属性没有用于控制其值的创建表达式,因此 Maya 将该属性设定为其初始状态 position0 值 <<0,0,0>>。

若要防止粒子在回放后跳回到原点,可以编写一个与运行时表达式相同的创建表达式:

particleShape1.position = <<3,time,0>>;

当回放动画时,粒子会移动到位置 <<3,time,0>>。由于在 0 帧处时间为 0,因此回放动画时粒子的开始位置为 <<3,0,0>>。在第二帧和后面的帧中,粒子将与时间增加值同步向上移动。

尽管该示例演示了如何使用创建表达式初始化位置属性,但您通过保存对象的当前属性值以用于初始状态可以获得几乎相同的结果:

要保存当前属性以用于初始状态,请执行下列操作:

  1. 选择“粒子形状”(particle shape)节点。
  2. 使动画前进到第 1 帧。

    此时粒子的位置是 <<3, 0.0417, 0>>。

  3. “动力学”(Dynamics)菜单集中,选择“解算器 > 初始状态 > 为选定对象设置”(Solvers > Initial State > Set for Selected)

    当回放动画时,Maya 会以对象的位置属性的初始状态设置来定位对象。由于您在位置等于 <<3, 0.0417, 0>> 时选择了“为选定对象设置”(Set for Selected),因此该设置为 <<3, 0.0417, 0>>。