如果在一个表达式中重复执行 rand、sphrand 和高斯函数,Maya 会返回一个随机数序列。(有关这些函数的详细信息,请参见随机数函数简介。)每次回放和播放动画时,随机数序列都有所不同。通常,您要生成每次播放动画时都会重复的随机数序列。
例如,假设您使用 rand 函数将随机半径指定给已发射的渲染为“球体”(Spheres)的粒子流中的每个粒子。默认情况下,每次播放动画时,Maya 都为粒子提供不同的随机半径值序列。
若要每次播放动画时创建相同的半径值,您可以在 rand、sphrand 或高斯函数执行之前在表达式中使用 seed 函数。无需对每个动画都多次执行 seed 函数,除非您需要播放动画时生成几个不同的重复随机数字序列。
重要信息在表达式或 MEL 脚本中设定种子值时,种子值会影响在其他表达式和 MEL 脚本中的 rand、sphrand 和高斯函数。在当前工作会话中随后打开的所有场景中,此类函数都受此种子值的影响。
此种子值与粒子形状节点中可用的“种子”(Seed)属性无关。因此,seed 函数不会影响用动力学创建的随机性。
示例
假设您使用 rand 函数在第 1 帧将多个大理石定位于场景中的随机“translateX”位置:
if (frame == 1) { marble1.tx = rand(-10,10); marble2.tx = rand(-10,10); marble3.tx = rand(-10,10); marble4.tx = rand(-10,10); }
每次执行时,rand (-10,10) 返回介于 -10 和 10 之间的一个随机数字。当将动画回放到第 1 帧时,Maya 可能将这些值指定给大理石的“translateX”属性:
| ||||||||||
|
下一次将动画回放到第 1 帧时,每个大理石的“translateX”属性将接收一个不同的随机值。Maya 可能指定下列值:
| ||||||||||
|
例如,您可能希望在回放时,大理石的“translateX”值能保持不变,以便您可以在模糊的背景中正确地合成大理石。
您可以使用 seed 函数将回放动画时 rand 函数返回的随机值序列保持一致。
if (frame == 1) { seed(10); marble1.tx = rand(-10,10); marble2.tx = rand(-10,10); marble3.tx = rand(-10,10); marble4.tx = rand(-10,10); }
通过将种子值设定为一个任意数字,例如,10,后续执行 rand 函数时将返回一个重复的随机数序列。
当第一次回放动画时,Maya 可能将这些值指定给大理石的“translateX”属性:
|
之后每次回放动画时,Maya 会将这些相同的值指定给大理石的“translateX”属性。大理石不会移动。
每次语句将种子值设定为 10 时,后续执行 rand 函数都会从以起始数字开始的序列返回数字。换句话说,将种子值重置为 10 会将随机数生成过程重新启动到采用序列中的第一个值。
假设您将表达式更改为如下:
if (frame == 1) { seed(10); } marble1.tx = rand(-10,10); marble2.tx = rand(-10,10); marble3.tx = rand(-10,10); marble4.tx = rand(-10,10);
当将动画回放到第 1 帧时,表达式将种子设定为 10。Maya 将值指定给大理石的“translateX”属性,像在以前的表达式中那样。
由于表达式不会在非第 1 帧的其他帧设定种子值,因此播放动画会使 rand 函数每一帧返回一个新的但重复的随机数序列。如果多次播放动画,则“translateX”值将在动画播放期间不断变化,但每次播放动画时,值的序列是相同的。
您可以为种子指定不同的值以生成不同的返回值序列。有关详细信息,请参见种子。
,