パーティクル

particleコマンド

シーンにパーティクルを作成するにはparticleコマンドを使用する。
-pオプションによって必要な個数だけの座標値をつけてこのコマンドを実行することによって、それらのパーティクルにひとつの名前がつけられる。
例えば、
particle -p 0 0 1 -p 1 0 0;
というコマンドによって、(0, 0, 1)と(1, 0, 0)の2点にパーティクルが作られる。

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.melと言うファイルに書き込んで実行してみよう。
このプロシージャーでは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. File → Source Script でmakeParticle1.melを読み込む。
  3. Script Editor で以下のコマンドを実行してみる。
    makeParticle1();
    [makeParticle1() の実行結果]
    上図はわかりやすくするためにパーティクルの Particle Render Type アトリビュートを Spheres に変えて表示している。
    (パーティクルのアトリビュートエディタを開いて、Render Attributes → Paticle Render Type を Sphedres に変更する)

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

スクリプトの解説

int $i;
int の変数 $i の宣言。
float $x, $y, $z;
float の変数 $x, $y, $z の宣言。
string $points = "";
パーティクルの座標値を入れてゆくための string 変数 $points を ""によって空の状態で宣言している。
(string は文字列を表す型である)
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;

    となったとする。
  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 "
    最初($i が 0 のとき)$points には何も入っていないので ($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 の中身が一つの値として 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);
は以下のように実行しても同じである。
$str = "particle " + $points;
eval $str;

練習

練習課題

参考


Prev | Next
Home | Contents
Mail