ランダム度を生成する

エクスプレッション内で rand 関数、sphrand 関数、gauss 関数を繰り返し実行すると、Maya は一連の乱数を返します(これらの関数の詳細については、「乱数関数の基礎知識」を参照)。アニメーションの再生または巻き戻しのたびに、異なる乱数列が生成されます。一方、アニメーションの再生のたびに同じ乱数列を生成したい場合がよくあります。

たとえば、rand 関数を使用して、球(Spheres)レンダー タイプによる放出されたパーティクルの一つ一つに、ランダムな半径を割り当てる場合を考えてみましょう。既定では、アニメーションを再生するたびに、異なった乱数列がパーティクルの半径として生成されます。

アニメーションの再生のたびに同じ乱数列を生成させるには、エクスプレッションで seed 関数を使用してから、rand 関数、sphrand 関数、または gauss 関数を実行します。アニメーションの再生中に複数の異なる乱数列を生成する必要がある場合を除いて、1 回のアニメーションについて seed 関数を 2 回以上実行する必要はありません。

重要: エクスプレッションまたは MEL スクリプト内で乱数のシード(Seed)値を設定すると、別のエクスプレッションまたは MEL スクリプト内の乱数関数(rand、sphrand、gauss)がそのシード値によって影響を受けます。さらに、現在の作業セッションで開かれるすべてのシーン内の乱数関数も設定済みの Seed 値によって影響を受けます。

seed 関数で設定される seed 値は、パーティクルのシェイプ ノードで使用可能なシード(Seed)アトリビュートとは無関係です。したがって、seed 関数は、ダイナミクスによって生成されるランダム性には影響しません。

フレーム番号が 1 の場合に、rand() 関数を使用して、シーン内のランダムな移動 X (Translate X)の位置に複数のビー玉(marble)を配置する場合を考えます。

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 に巻き戻すと、これらの乱数が marble の移動 X (Translate X)アトリビュートに代入されます。

アトリビュート
marble1.tx 2.922
marble2.tx 5.963
marble3.tx -4.819
marble4.tx 7.186

次回、アニメーションをフレーム 1 に巻き戻すと、個々の marble の移動 X (Translate X)アトリビュートに異なる乱数値が代入されます。たとえば、次のような値が代入されます。

アトリビュート
marble1.tx -3.972
marble2.tx 9.108
marble3.tx -7.244
marble4.tx -3.065

たとえば、アニメーションを巻き戻した場合に marble の移動 X (Translate X)値が同じ値に留まるようにすると、ぼんやりした背景にビー玉を整然と並べることができます。

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);
}

seed 値を任意の値(たとえば 10)に設定すると、それ以降に rand 関数を実行した場合も、同じ乱数の列が再現されます。

アニメーションを初めて巻き戻す場合、たとえば次のような値が marble の移動 X (Translate X)アトリビュートに代入されます。

アトリビュート
marble1.tx 8.020
marble2.tx -2.973
marble3.tx -7.709
marble4.tx 0.741

アニメーションを 2 回目以降に巻き戻した場合も、上と同じ値が marble の移動 X (Translate X)アトリビュートに代入されます。したがって marble は動きません。

文で seed 値を 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 に巻き戻すときに、エクスプレッションは seed 値に 10 を設定します。前のエクスプレッションにあるように、Maya により、各 marble の移動 X (Translate X)アトリビュートに値が割り当てられます。

フレーム 1 以外のフレームではシード値が設定されないため、アニメーションを再生すると、各フレームとも同じ乱数列からの値が rand 関数によって返されます。アニメーションを何回か再生すると、marble の移動 X (Translate X)値は継続的に変化しますが、再生ごとに生成される乱数列は同じです。

別のシード値を指定すると、生成される乱数列が変わります。詳細については、seed を参照してください。