パーティクル
particle コマンド
パーティクルは、大きさの無い点の集まりです。
パーティクルを作成するには pm.particle() 関数を使用し、
p フラグの後にパーティクルの位置を表す座標値をつけて、
必要な個数だけパーティクルを作ります。
pm.particle() 関数を 1 回実行すると、
p フラグに与えられた個数分のパーティクルが作られます。
それらの複数のパーティクルが、
ひとつのパーティクルオブジェクトとしてグループ化され、
トランスフォームノードによってコントロールされるようになります。
例えば、
pm.particle(p=((0, 0, 1), (1, 0, 0)))
という関数を実行することによって、(0, 0, 1) と (1, 0, 0) の 2 点にパーティクルが作られます。
ここで 移動X(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=True
- パーティクルの様々な値を得るために使用します。
- id 番号 5 のパーティクルの velocity アトリビュートの値を調べる場合は以下のように実行します。。
particle(attribute='velocity', particleId=5, query=True)
particle 関数の使用例
以下のプロシージャーを makeParticle1.py と言うファイルに書き込んで実行してみましょう。
このプロシージャーでは 10 個のパーティクルを発生させています。
各パーティクルの座標値は乱数によって決めていますが、
その座標値を代入しておく変数を個数分用意しないで、
pm.particle() 関数を文字列の結合によって生成し、
その関数を表す文字列を最期に実行しています。
この方法をとることによって、
作られるパーティクルの個数を変えたい時にもプログラムの書き換えを最小限で済ませることができるようになります。
- 以下の関数を makeParticle1.py と言う名前でファイルに書き込みます。
import pymel.core as pm
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))
pm.particle(p=points)
- スクリプト エディタ の によって makeParticle1.py を読み込んで、テンキーの Enter キーなどで実行します。
- で以下の関数を実行してみます。
makeParticle1()
上図はわかりやすくするためにパーティクルの particleRenderType アトリビュートを 球体 に変えて表示しています。
そのためには、パーティクルのアトリビュートエディタを開いて、
を 球体 に変更します。
スクリプトの解説
import pymel.core as pm
- pymel.core モジュールをインポートしてpmという名前で使用できるようにします。
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) を要素として追加します。
pm.particle(p=points)
- リスト points に並んでいるタプルを座標値としてパーティクルを作成します。
リスト内包表記
Python において、リストを作成するとき内包表記を使うと、
処理を 1 行にまとめることができます。
例えば、以下のような偶数の並んだリストを作成する Python スクリプトがあったとします。
lst = []
for i in range(10):
lst.append(2*i)
これと同じ処理を内包表現を使用すると以下のように記述することができます。
リスト内包表記の使用例
上の 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)])
練習
- 上の makeParticle1.py を参考にして makeParticle2.py を作り、発生させるパーティクルの個数と、発生させるパーティクルの座標値の範囲(X、Y、Z)も変えることができるようにしてください。
(プロシージャーの名前と引数)
makeParticle2(個数, X 方向の範囲, Y 方向の範囲, 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 までの範囲で作られます。
上図はわかりやすくするためにパーティクルの particleRenderType アトリビュートを 球体 に変えて表示しています。
- さらにmakeParticle2.py を参考にして makeParticle3.py を作り、発生させるパーティクルのレンダリングタイプ(particleRenderType アトリビュート)を変えることができるようにしてみましょう。
(プロシージャーの名前と引数)
makeParticle3(個数, X 方向の範囲, Y 方向の範囲, Z 方向の範囲, レンダリングタイプ)
(使用例)
makeParticle3(20, 7.0, 10.0, 13.0, 7)
20 個のパーティクルが
X 座標が -7.0 から 7.0、
Y 座標が -10.0 から 10.0、
Z 座標が -13.0 から 13.0 までの範囲で、
レンダリングタイプは Blobby surface ( 7 ) で作られます。
(ヒント)
レンダリングタイプを変更するにはパーティクルの particleRenderType アトリビュートを変更します。
アトリビュートを変更する Python 関数は オブジェクト.アトリビュート.set() または pymel.core.setAttr() です。
以下の表は particleRenderType アトリビュートのとる値を表しています。
particleRenderType | 形状 |
0 | マルチポイント |
1 | マルチストリーク |
2 | 数値 |
3 | ポイント |
4 | 球体 |
5 | スプライト |
6 | ストリーク |
7 | メタボール サーフェス |
8 | クラウド |
9 | チューブ |
(提出フォルダ)
\Class-AD\Class-group\2-nen\MEL応用\makeParticle3
参考
- Maya
Maya, MEL, Maya関係のコマンドなどのページ。
Prev |
Home | Contents
Mail