パーティクル
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の後で良い)
- id番号5のパーティクルのvelocityの値を調べる。
particle -attribute velocity -particleId 5 -query
particleコマンドの使用例
以下のプロシージャーをmakeParticle1.melと言うファイルに書き込んで実行してみよう。
このプロシージャーでは10個のパーティクルを発生させている。
各パーティクルの座標値は乱数によって決めているが、
その座標値を代入しておく変数を個数分用意しないで、
particle コマンドを文字列の結合によって生成して、そのコマンドを表す文字列を最期に実行している。
この方法をとることによって、作られるパーティクルの個数を変えたい時にもプログラムの書き換えを最小限で済ませることができる。
- 以下のプロシージャを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);
}
- でmakeParticle1.melを読み込む。
- で以下のコマンドを実行してみる。
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 + " ";
- パーティクルの座標を文字列の連結によって作ってゆく。
( の部分は文字列を表す)
ここの処理は以下のように進んでゆく。
- 例えば
$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;
となったとする。
-
"-p " + $x + " " + $y + " " + $z + " "
の部分は、まず以下のようになる。
"-p " + 4.0 + " " + 3.2 + " " + -2.7 + " "
- これらの文字列・数値が + によって一つの文字列になり、その結果が
"-p 4.0 3.2 -2.7 "
となる。
(-pの後ろ、変数の間と最後のスペース " " に注意)
- これを $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;
練習
- 上の makeParticle1.mel を参考にして makeParticle2.mel を作り、発生させるパーティクルの個数と、発生させるパーティクルの座標値の範囲(X、Y、Z)も変えることができるようにしよう。
makeParticle2(int 個数, float X方向の範囲, float Y方向の範囲, float Z方向の範囲)
(使用例)
makeParticle2(30, 5.0, 10.0, 15.0)
30 個のパーティクルがX 座標が -5.0 から 5.0、 Y座標が -10.0 から 10.0、Z 座標が -15.0 から 15.0 までの範囲で作られる。
上図はわかりやすくするためにパーティクルの Particle Render Type アトリビュートを Spheresに変えて表示している。
- さらにmakeParticle2.mel を参考にして makeParticle3.mel を作り、発生させるパーティクルのレンダリングタイプ(Particle Render Type アトリビュート)を変えることができるようにしてみよう。
makeParticle3(int 個数, float X方向の範囲, float Y方向の範囲, float Z方向の範囲, int レンダリングタイプ)
(使用例)
makeParticle3(20, 7.0, 10.0, 13.0, 7)
30 個のパーティクルが X 座標が -7.0 から 7.0、 Y 座標が -10.0 から 10.0、Z 座標が -13.0 から 13.0 までの範囲で、レンダリングタイプは Blobby surface ( 7 ) で作られる。
(ヒント)
レンダリングタイプを変更するにはパーティクルの particleRenderType アトリビュートを変更する。
アトリビュートを変更する MEL コマンドは setAttr である。
以下の表は particleRenderType アトリビュートのとる値を表している。
particleRenderType | shape |
0 | MultiPoint |
1 | MultiStreak |
2 | Numeric |
3 | Points |
4 | Spheres |
5 | Sprites |
6 | Streak |
7 | Blobby Surface |
8 | Cloud |
9 | Tube |
練習課題
参考
Prev | Next
Home | Contents
Mail