パーティクル

particle コマンド

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

particle 関数のフラグ

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

particle 関数の使用例

以下のプロシージャーを makeParticle1.py と言うファイルに書き込んで実行してみましょう。
このプロシージャーでは 10 個のパーティクルを発生させています。
各パーティクルの座標値は乱数によって決めていますが、 その座標値を代入しておく変数を個数分用意しないで、 particle() 関数を文字列の結合によって生成し、 その関数を表す文字列を最期に実行しています。 この方法をとることによって、 作られるパーティクルの個数を変えたい時にもプログラムの書き換えを最小限で済ませることができるようになります。

  1. 以下の MEL スクリプトを Python スクリプトに書き直して、 makeParticle1.py という名前で保存します。
    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.py と言う名前でファイルに書き込みます。
    import pymel.core
    import random
    
    def makeParticle1():
        points = []
        for i in range(10):
            x = random.uniform(-5, 5)
            y = random.uniform(-5, 5)
            z = random.uniform(-5, 5)
            points.append((x, y, z))
        pymel.core.particle(p=points)
    
  3. スクリプト エディタ の ファイル → スクリプトのロード によって makeParticle1.py を読み込んで、テンキーの Enter キーなどで実行します。
  4. スクリプト エディタ で以下の関数を実行してみます。
    makeParticle1()
    [makeParticle1() の実行結果]
    上図はわかりやすくするためにパーティクルの particleRenderType アトリビュートを 球体 に変えて表示しています。
    そのためには、パーティクルのアトリビュートエディタを開いて、 レンダー アトリビュート → パーティクルのレンダータイプ を 球体 に変更します。

スクリプトの解説

import pymel.core
Maya モジュールをインポートします。
import random
乱数のモジュールをインポートして、 乱数関係の関数を使用できるようにします。
def makeParticle1():
makeParticle1 という関数の定義です。
points = []
空のリストを作成して、変数 points に代入します。
for i in range(10):
以下のコマンドを 10 回繰り返し実行します。
range(10) はリスト [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] を返すので、この for 文は以下と同じです。
for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
x = random.uniform(-5, 5)
-5 から 5 までの乱数を作成して、変数 x に代入します。
y = random.uniform(-5, 5)
-5 から 5 までの乱数を作成して、変数 y に代入します。
z = random.uniform(-5, 5)
-5 から 5 までの乱数を作成して、変数 z に代入します。
points.append((x, y, z))
リスト points にタプル (x, y, z) を要素として追加します。
pymel.core.particle(p=points)
リスト points に並んでいるタプルを座標値としてパーティクルを作成します。

リスト内包表記

Python において、リストを作成するとき内包表記を使うと、 処理を 1 行にまとめることができます。
例えば、以下のような偶数の並んだリストを作成する Python スクリプトがあったとします。

lst = []
for i in range(10):
    lst.append(2*i)

これと同じ処理を内包表現を使用すると以下のように記述することができます。

[2*i for i in range(10)]

リスト内包表記の使用例

上の makeParticle1 をリスト内包表記を使用して作成し直すと、 以下のように関数の中身を 1 行で作ることができます。

from random import uniform
from pymel.core import particle

def makeParticle1():
	particle(p=[(uniform(-5, 5), uniform(-5, 5), uniform(-5, 5)) for i in range(10)])

さらに、内包表記の中で内包表記を使用すると、 もう少し短くなります。

from random import uniform
from pymel.core import particle

def makeParticle1():
	particle(p=[[uniform(-5, 5) for j in range(3)] for i in range(10)])

練習

参考


Prev | Next
Home | Contents
Mail