エミッター

emitter 関数

パーティクルを自動的に発生させるためには maya.cmds.emitter() 関数を使用します。
emitter() 関数によって点・面などから発生させたパーティクルのアトリビュートを、 キーフレームやエクスプレッションによって変化させてアニメーションさせることができます。
また、個々のパーティクルにおける色などのアトリビュートをアニメーションさせたい場合は、 maya.cmds.dynExpression() を使用します。

emitter() 関数のフラグ

type=タイプ
発生させるパーティクルのタイプを決めます。
タイプの種類
omni (全方向)
全方向にパーティクルが発生します。(デフォールト)
direction または dir (一方向)
ある方向だけにパーティクルが発生します。
directionX, directionY, directionZなどで方向を定めます。
surface または surf (サーフェス)
オブジェクト(NURBS、ポリゴン)の表面からパーティクルが発生します。
curve または curv (カーブ)
カーブ上またはその近くからパーティクルが発生します。
volume (ボリューム)
ある空間領域からパーティクルが発生します。
directionX=X 成分
パーティクルの発生する方向の X 成分を決めます。(typedirection の場合のみ有効です)
directionY=Y 成分
パーティクルの発生する方向の Y 成分を決めます。(typedirection の場合のみ有効です)
directionZ=Z 成分
パーティクルの発生する方向の Z 成分を決めます。(typedirection の場合のみ有効です)
minDistance=距離
パーティクルが発生を始める距離を決めます。
maxDistance=距離
パーティクルの発生が終る距離を決めます。
minDistance から maxDistance までの距離の間でパーティクルが発生します。
position=(X, Y, Z)
エミッターのワールド座標における位置を定めます。
rate=割合
パーティクルを発生させる割合です。
この値が大きいほど発生する個数が増加します。
spread=角度
パーティクルを発生させる角度です。(type が direction の場合のみ有効です)
0.0 から 1.0 の値を指定します。
speed=速度
パーティクルの速度です。
もとの速度にこの値を乗じた値が結果の速度になります。 例えば、0.5 にするともとの速度の半分の速度になります。
normalSpeed=速度
パーティクルの法線方向の速度です。(type が surface の場合のみ有効です)
tangentSpeed=速度
パーティクルの接線方向の速度です。(type が surface の場合のみ有効です)
例えば、normalSpeedが 1 で tangentSpeed が 0 だとオブジェクトの面と垂直方向にパーティクルが発生します。
逆に、normalSpeed が 0 で tangentSpeed が 1 だとオブジェクトの面と水平方向にパーティクルが発生します。

emitter 関数の使用例 1

以下の Python 関数をスクリプトエディタに打ち込んで実行すると 3 つのパーティクルが作られ、その 3 つのパーティクルからエミッターによって全方向(omni)にパーティクルが発生します。

import maya.cmds

maya.cmds.particle(p=((1, 0, 0), (0, 1, 0), (0, 0, 1)))
name = maya.cmds.emitter(rate=10, minDistance=1.5, maxDistance=2.5)
maya.cmds.particle()
maya.cmds.connectDynamic(emitters=name[0])
[makeEmitter2.mel の実行結果]
上図はわかりやすくするためにパーティクルの パーティクルのレンダータイプ(Particle Render Type) アトリビュートを 球体(Spheres) に変えて表示しています。

スクリプトの解説

import maya.cmds
maya.cmds モジュールをインポートします。
maya.cmds.particle(p=((1, 0, 0), (0, 1, 0), (0, 0, 1)))
この particle 関数によって作られる 3 つのパーティクルが、 エミッターによってパーティクルの発生源となります。
name = maya.cmds.emitter(rate=10, minDistance=1.5, maxDistance=2.5)
エミッターによって全方向(omni)に毎秒 10 個の割合で、 エミッターからの距離が 1.5 から 2.5 の間にパーティクルを発生させます。
type フラグが使用されていないので、 デフォールトの omni が有効になります。
name に作られたエミッターの名前が代入されます。
maya.cmds.particle()
このパーティクルにエミッターがパーティクルを追加してゆきます。
maya.cmds.connectDynamic(emitters=name[0])
現在セレクトされているパーティクルをエミッター(name[0])から発生するエミッターとします。
セレクトされているのは直前の particle 関数で作られたパーティクルです。
この関数を実行しないとエミッターが有効になりません。

emitter 関数の使用例2

以下は、球体の表面からパーティクルを発生させて(type "surface")、 パーティクルと球をエクスプレッションで回転させるスクリプトです。

  1. 以下のプロシージャを makeEmitter1.py と言う名前でファイルに書き込みます。
    import maya.cmds
    
    def makeEmitter1():
        name = maya.cmds.sphere()
        maya.cmds.scale(5, 5, 5)
        maya.cmds.expression(object=name[0], string='ry = 30 * time')
        ename = maya.cmds.emitter(name[0], type='surface', normalSpeed=1.0, tangentSpeed=0.0, rate=1)
        pname = maya.cmds.particle()
        maya.cmds.expression(object=pname[0], string='ry = 30 * time')
        maya.cmds.connectDynamic(pname[0], emitters=ename)
    
  2. スクリプト エディタ の ファイル → スクリプトのロード によって makeEmitter1.py を読み込んで、テンキーの Enter キーなどで実行します。
  3. スクリプトエディタ のインプットウインドウで以下の関数を実行します。
    makeEmitter1()
    [makeEmitter2.mel の実行結果]

スクリプトの解説

import maya.cmds
Maya モジュールをインポートします。
def makeEmitter1():
makeEmitter1() という関数の宣言です。
name = maya.cmds.sphere()
NURBS の球体を作り、name に球の名前を代入します。
name[0] にトランスフォーム・ノード、 name[1] にインプット・ノードの名前が代入されます。
maya.cmds.scale(5, 5, 5)
球体を大きさ(スケール X, スケール Y, スケール Z)を 5 にします。
スケールしておかなくても実行に支障はありませんが、 パーティクル発生の様子がよくわかるように球体を大きくしておきます。
maya.cmds.expression(object=name[0], string='ry = 30 * time')
作った球(name[0])に対して ry = 30 * time という Y 軸方向に回転させるエクスプレッションを定義しておきます。 これによって、球が 1 秒間に 30 度回転するアニメーションになります。
ename = maya.cmds.emitter(name[0], type='surface', normalSpeed=1.0, tangentSpeed=0.0, rate=1)
type='surface' によって球体のオブジェクト表面からパーティクルの現れるエミッターを作ります。
作られたエミッターの名前は ename に代入しておきます。
normalSpeed=1.0
法線方向のスピードは 1.0 です。
tangentSpeed=0.0
接線方向のスピードは 0.0 です。
rate=1
毎秒、単位面積あたり 1 個づつパーティクルが放出されます。
pname = maya.cmds.particle()
空のパーティクルを作り、 作られたパーティクルの名前を pname に代入しておきます。
エミッターによってこのパーティクルオブジェクトにパーティクルが追加されてゆきます。
maya.cmds.expression(object=pname[0], string='ry = 30 * time')
pname[0] で表されるパーティクルに対して ry = 30 * time という Y 軸方向に回転させるエクスプレッションを定義しておきます。 これは、上で球に対して定義したエクスプレッションと同じものです。
maya.cmds.connectDynamic(pname[0], emitters=ename)
pname[0] で表されるパーティクルに対してエミッター(ename)をコネクトします。
これによってエミッターからパーティクルが発生するようになります。

練習

参考


Prev | Next
Home | Contents
Mail