パーティクル

particle コマンド

パーティクルは、大きさの無い点の集まりです。
パーティクルを作成するには particle コマンドを使用します。
particle コマンドの -p フラグの右に座標値をつけて、 必要な個数だけパーティクルを作ります。 particle コマンドを 1 回実行すると、 -p フラグの個数分のパーティクルが作られます。 それら複数のパーティクルが、 1 つのパーティクルオブジェクトとしてグループ化され、 トランスフォームノードによってコントロールされるようになります。
たとえば、
particle -p 0 0 1 -p 1 0 0;
というコマンドによって、(0, 0, 1) と (1, 0, 0) の 2 点にパーティクルが作られます。 ここで、このパーティクルのトランスフォームノードの 移動X アトリビュート値を +1 すると、 2 つのパーティクルの位置が (1, 0, 1)、(2, 0, 0) に移動します。
パーティクル 1 つ 1 つの、 位置やその他のアトリビュートをコントロールしたい時は、 ダイナミック・エクスプレッション を使用します。

particle コマンドのフラグ

-p x y z
1 個のパーティクルの座標値を、 floatの値(x, y, z)で指定します。
-count
パーティクルの個数を調べます。(-query といっしょに使用します)
-particleId id
パーティクルのアトリビュートを調べる時の id 番号(int)を指定します。(-query と同時に使用します)
-order int
int 番目のパーティクルのアトリビュートを調べる時に指定します。(-query と同時に使用します)
順番は 0 から始まります。
-attribute string
string で表されるパーティクルの、 アトリビュートを調べる時に指定します。(-query と同時に使用)
-query
パーティクルの様々な値を得るために使用します。

-query フラグ使用上の注意

particle コマンドで -query フラグを使う時には -particlId-order-attribute などの後につけて使用する必要があります。 ただし、-count などは -query の後でかまいません。

particle コマンドの使用例

パーティクルを作成するプロシージャを、 makeParticle1 という名前で作ってみましょう。
このプロシージャでは 10 個のパーティクルを発生させることにします。
各パーティクルの座標値は乱数によって決めています。 ここでは、その座標値を代入しておく変数を個数分用意しないで、 particle コマンドを文字列の連結によって生成し、 そのコマンドを表す文字列を最後に実行しています。
この方法をとることによって、 作られるパーティクルの個数を変えたい時にも、 プログラムの書き換えを最小限で済ませることができるようになります。

  1. 以下のプロシージャを makeParticle1.mel と言う名前でファイルに書き込みます。
    global proc makeParticle1()
    {
    	int $i;
    	float $x, $y, $z;
    	string $points = "";
    
    	for($i = 0; $i < 10; $i++)
    	{
    		$x = rand(-5.0, 5.0);
    		$y = rand(-5.0, 5.0);
    		$z = rand(-5.0, 5.0);
    		$points = $points + "-p " + $x + " " + $y + " " + $z + " ";
    	}
    	eval("particle " + $points);
    }
    
  2. ファイル → ソーススクリプト で makeParticle1.mel を読み込みます。
  3. スクリプト エディタ で以下のコマンドを実行してみます。
    makeParticle1();
    [makeParticle1() の実行結果]
    上図は、わかりやすくするために、 パーティクルの particleRenderType アトリビュートを 球体 に変えて表示しています。
    そのためには、パーティクルのアトリビュートエディタを開いて、 レンダー アトリビュート → パーティクルのレンダータイプ を 球体 に変更します。

もし、makeParticle1.mel で文字列の連結を使用しないで、 座標の個数分の変数(配列)を用意してプログラムを作るとどうなるでしょうか ?

スクリプトの解説

global proc makeParticle1()
makeParticle1() というプロシージャの宣言です。
int $i;
int の変数 $i の宣言です。
float $x, $y, $z;
float の変数 $x, $y, $z の宣言です。
string $points = "";
パーティクルの座標値を入れてゆくための、文字列変数 $points を宣言しています。 $points は、""によって空文字列で初期化されています。
後で、この $points にパーティクルの座標値を追加してゆきます。
for($i = 0; $i < 10; $i++)
$iを、 0 から 10 までインクリメントして for 文のブロックを 10 回実行します。
これによって、10 個のパーティクルが作られます。
もし、パーティクルの個数を変えたければ 10 を他の数値に書き換えてください。
$x = rand(-5.0, 5.0);
$x に -5.0 から 5.0 までの乱数を代入します。
$y = rand(-5.0, 5.0);
$y に -5.0 から 5.0 までの乱数を代入します。
$z = rand(-5.0, 5.0);
$z に -5.0 から 5.0 までの乱数を代入します。
$points = $points + "-p " + $x +" " + $y + " " + $z + " ";
パーティクルの座標を、文字列の連結によって作ってゆきます。
(  の部分は文字列を表します)
ここの処理は、以下のように進んでゆきます。
  1. たとえば
    $x = rand(-5.0, 5.0);
    $y = rand(-5.0, 5.0);
    $z = rand(-5.0, 5.0);

    によって
    $x = 4.0;
    $y = 3.2;
    $z = -2.7;

    という値が変数 $x, $y, $z に代入されたとします。
  2. "-p " + $x + " " + $y + " " + $z + " "
    の部分が以下のようになります。
    "-p " + 4.0 + " " + 3.2 + " " + -2.7 + " "
  3. これらの文字列・数値が + によって一つの文字列になり、その結果が "-p 4.0 3.2 -2.7 " となります。
    ここで、-p の後ろの変数の間と、最後にスペース " " があることに注意してください。
  4. これを $points の後ろに付け足してゆきます。
    $points = $points + "-p 4.0 3.2 -2.7 "
    $points の変数宣言のところで、空文字列 "" が代入されていましたから、 最初($i が 0 のとき) $points には何も入っていません。
    $points = "-p 4.0 3.2 -2.7 "
    となります。

for 文の内部が 10 回実行された後には $points の中に
-p 4.0 3.2 -2.7 -p 1.7 -2.3 3.1 -p 2.2 3.9 1.2 -p 3.7 2.5 2.0 -p 3.2 -1.2 0.8 -p -4.8 4.3 -3.7 -p 4.0 0.2 -4.1
などという具合に、 -p と X、Y、Z の座標値が 10 個並んだ文字列が入っているはずです。
(念のために言っておくと、上の座標値はあくまでも一例ですから、 実際は実行するたびに違う値になるでしょう)
eval ("particle " + $points);
最後に、この座標値 $points を使って particle コマンドを実行します。
この場合、以下のようにしても実行できません。
particle $points;
なぜなら、 $points の中身が 1 つの文字列として particle コマンドに渡されてしまうからです。
こういう場合は
("particle " + $points)
として particle コマンドと $points を連結した文字列を作り、 これを eval コマンドによって実行します。 (ここでもparticleの後にスペースがあることに注意してください)
実際に実行されるコマンドは、たとえば以下のようになります。
eval "particle -p 4.0 3.2 -2.7 -p 1.7 -2.3 3.1 -p 2.2 3.9 1.2 -p 3.7 2.5 2.0 -p 3.2 -1.2 0.8 -p -4.8 4.3 -3.7 -p 4.0 0.2 -4.1"
(もちろん上の X, Y, Z 座標の値は一例にすぎません)
eval ("particle " + $points);
は以下のように、 2 つのコマンドに分けて実行しても同じ結果になります。
string $str = "particle " + $points;
eval $str;

練習

練習課題

参考


Prev | Next
Home | Contents
Mail