パーティクルは、大きさの無い点の集まりです。
パーティクルを作成するには maya.cmds.particle() 関数を使用し、
p フラグの後にパーティクルの位置を表す座標値をつけて、
必要な個数だけパーティクルを作ります。
particle 関数を 1 回実行すると、
p フラグに与えられた個数分のパーティクルが作られます。
それらの複数のパーティクルが、
ひとつのパーティクルオブジェクトとしてグループ化され、
トランスフォームノードによってコントロールされるようになります。
例えば、
maya.cmds.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 つの、
位置やその他のアトリビュートをコントロールしたい時は、
ダイナミック・エクスプレッション
を使用します。
以下のプロシージャーを makeParticle1.py と言うファイルに書き込んで実行してみましょう。
このプロシージャーでは 10 個のパーティクルを発生させています。
各パーティクルの座標値は乱数によって決めていますが、
その座標値を代入しておく変数を個数分用意しないで、
particle() 関数を文字列の結合によって生成し、
その関数を表す文字列を最期に実行しています。
この方法をとることによって、
作られるパーティクルの個数を変えたい時にもプログラムの書き換えを最小限で済ませることができるようになります。
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);
}
import maya.cmds
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))
maya.cmds.particle(p=points)
もし、makeParticle1.py で文字列の結合を使用しないで、 座標の個数分の変数(配列)を用意してプログラムを作るとどうなるでしょうか ?
import maya.cmds
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))
maya.cmds.particle(p=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 maya.cmds 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 maya.cmds import particle
def makeParticle1():
particle(p=[[uniform(-5, 5) for j in range(3)] for i in range(10)])
particleRenderType | 形状 |
---|---|
0 | マルチポイント |
1 | マルチストリーク |
2 | 数値 |
3 | ポイント |
4 | 球体 |
5 | スプライト |
6 | ストリーク |
7 | メタボール サーフェス |
8 | クラウド |
9 | チューブ |