パーティクル

particleコマンド

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

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 に変えて表示している。

スクリプトの解説

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
abe@injapan.net