重新生成随机性

 
 
 

如果在一个表达式中重复执行 rand、sphrand 和 gauss 函数,Maya 会返回一个随机数序列。(请参见随机数函数以获得有关这些函数的详细信息。)每次回放和播放动画时,随机数序列都有所不同。通常,您要生成每次播放动画时都会重复的随机数序列。

例如,假设您使用 rand 函数将随机半径指定给已发射的渲染为“球体”(Spheres)的粒子流中的每个粒子。默认情况下,每次播放动画时,Maya 都为粒子提供不同的随机半径值序列。

若要每次播放动画时创建相同的半径值,您可以在 rand、sphrand 或 gauss 函数执行之前在表达式中使用 seed 函数。无需对每个动画都多次执行 seed 函数,除非您需要播放动画时生成几个不同的重复随机数字序列。

重要信息在表达式或 MEL 脚本中设定种子值时,种子值会影响在其他表达式和 MEL 脚本中的 rand、sphrand 和 gauss 函数。在当前工作会话中随后打开的所有场景中,此类函数都受此种子值的影响。

此种子值与粒子形状节点中可用的“种子”(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”属性

属性
marble1.tx 2.922
marble2.tx 5.963
marble3.tx -4.819
marble4.tx 7.186

下一次将动画回放到第 1 帧时,每个大理石的“translateX”属性将接收一个不同的随机值。Maya 可能指定下列值:

属性
marble1.tx -3.972
marble2.tx 9.108
marble3.tx -7.244
marble4.tx -3.065

例如,您可能希望在回放时,大理石的“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”属性:

属性
marble1.tx 8.020
marble2.tx -2.973
marble3.tx -7.709
marble4.tx 0.741

之后每次回放动画时,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”值将在动画播放期间不断变化,但每次播放动画时,值的序列是相同的。

您可以为种子指定不同的值以生成不同的返回值序列。有关详细信息,请参见种子