フィールド

フィールドとは

フィールドを使うことによっては、 自然界にある様々な力をシュミレートしてアニメーションを実行することができます。
フィールドは、ソフトボディ・リジッドボディ・パーティクルに作用します。 ソフトボディ・リジッドボディについての詳しいことは、 マニュアルまたは、他の章を参照してください。
Python において、オブジェクトにフィールドを作用させるためには、 以下のコマンドでパーティクル・ソフトボディ・リジッドボディなどにコネクトする必要があります。
maya.cmds.connectDynamic(オブジェクト名, fields=フィールド名)

フィールドの種類

フィールドの使用例 (大気)

エミッターから発生するパーティクルが 大気 フィールドによって飛ばされるアニメーションを、 以下のプロシージャーによって作ってみましょう。

  1. 以下の Python スクリプトを makeField1.py という名前で作る。
    import maya.cmds
    
    def makeField1():
        maya.cmds.particle(p=(0, 5, 0))
        ename = maya.cmds.emitter(type='direction', dx=0.0, dy=-1.0, dz=0.0, spread=0.2, rate=3)
        pname = maya.cmds.particle()
        maya.cmds.connectDynamic(pname[0], emitters=ename[0])
        aname = maya.cmds.air(pos=(3, 0, 0), maxDistance=5.0, magnitude=1.0, dx=-1.0, dy=0.0, dz=0.0)
        maya.cmds.connectDynamic(pname[0], fields=aname[0])
    
  2. スクリプト エディタ の ファイル → スクリプトのロード によって makeField1.py を読み込んで、テンキーの Enter キーなどで実行します。
  3. スクリプト エディタ の下のウインドウから makeField1() と打ち込んで実行します。
  4. プレイバックしてアニメーションを実行します。
    [makeField1.py の実行図]
    上図はわかりやすくするためにパーティクルの レンダータイプ アトリビュートを 球体 に変えて表示しています。

スクリプトの解説

import maya.cmds
maya.cmds モジュールをインポートします。
def makeField1():
makeField1() という関数の宣言です。
maya.cmds.particle(p=(0, 5, 0))
パーティクルを(0, 5, 0)の位置に作ります。
この位置からパーティクルを発生させます。
ename = maya.cmds.emitter(type='direction', dx=0.0, dy=-1.0, dz=0.0, spread=0.2, rate=3)
そのパーティクルに対して Y 軸に対して下方向に発生・運動するエミッターを作り、 作られたエミッターの名前を ename に代入します。
ename[0] にパーティクルのトランスフォームノード、 ename[1] にエミッターノードの名前が代入されます。
pname = maya.cmds.particle()
emitter によってパーティクルが追加されてゆくパーティクルオブジェクトを作ります。
pname[0]にパーティクルのトランスフォームノード、 pname[1]にパーティクルのシェープノードが代入されます。
maya.cmds.connectDynamic(pname[0], emitters=ename[0])
エミッター(ename[0]) とパーティクル(pname[0])をコネクトします。 これでエミッターからパーティクルを発生するようになります。
aname = maya.cmds.air(pos=(3, 0, 0), maxDistance=5.0, magnitude=1.0, dx=-1.0, dy=0.0, dz=0.0)
スタンドアローンフィールドの 大気 フィールド作ります。
作られた 大気 フィールドの名前を aname[0] に代入しておきます。
各フラグの意味は以下の通りです。
pos=(3, 0, 0)
位置は(3, 0, 0)
maxDistance=5.0
大気 フィールドの力の届く範囲は、 大気 フィールドから 5.0 の距離まで
この値が -1 であればコネクトされているすべてのパーティクルに 大気 の影響がおよぶようになります。
magnitude=1.0
大気 フィールドの力の強さ
dx=-1.0, -dy=0.0, -dz=0.0
-magnitude の方向
ここでは X 軸に平行でマイナス方向です。
maya.cmds.connectDynamic(pname[0], fields=aname[0])
大気 フィールド(aname[0])をパーティクル(pname[0])にコネクトします。 これでパーティクルが 大気 フィールドによって影響されるようになります。

フィールドの使用例(newton)

エミッターから発生するパーティクルが newton フィールドによって NURBS 平面 の中に吸い込まれてゆくアニメーションを、 以下のプロシージャーによって作ってみましょう。

  1. 以下の Python スクリプトを makeField2.py という名前で作ります。
    import maya.cmds
    
    def makeField2():
        maya.cmds.particle(p=(5, 10, 0))
        ename = maya.cmds.emitter(type='direction', dx=0.0, dy=-1.0, dz=0.0, spread=0.2, rate=3)
        pname = maya.cmds.particle()
        maya.cmds.connectDynamic(pname[0], emitters=ename[0])
        maya.cmds.nurbsPlane()
        maya.cmds.scale(0, 10, 10)
        nname = maya.cmds.newton(magnitude=1.0, maxDistance=8.0, attenuation=0.98)
        maya.cmds.connectDynamic(pname[0], fields=nname[0])
    
  2. スクリプト エディタ の ファイル → スクリプトのロード によって makeField2.py を読み込んで、テンキーの Enter キーなどで実行します。
  3. スクリプト エディタ の下のウインドウから makeField2() と打ち込んで実行します。
  4. プレイバックしてアニメーションを実行します。
    [makeField2.mel の実行図]
    上図はわかりやすくするためにパーティクルの レンダータイプ アトリビュートを 球体 に変えて表示しています。

スクリプトの解説

スクリプトの前半は makeField1.mel と同じなので、後半のみ解説します。

maya.cmds.nurbsPlane()
後でフィールドを属させるための NURBS 平面 を作ります。
maya.cmds.scale(0, 10, 10)
アニメーションを見やすくするために、適当にスケールをかけておきます。
nname = maya.cmds.newton(magnitude=1.0, maxDistance=8.0, attenuation=0.98)
NURBS 平面 に属するオブジェクトフィールドを作成します。
NURBS 平面 はセレクトされた状態なので名前を指定する必要はありません。
各フラグの意味は以下の通りです。
magnitude=1.0
フィールドの強さは 1.0
maxDistance=8.0
フィールドの作用する距離が 8.0
attenuation=0.98
フィールドの減衰率
フィールドとパーティクルの距離が大きくなるに従って 0.98 乗づつ強さが小さくなります。
この値が 0 だと距離に関係なく力は一定になります。 (デフォールトの値は 0 です)
maya.cmds.connectDynamic(pname[0], fields=nname[0])
ニュートン フィールド(nname)をパーティクル(pname)にコネクトします。 これでエミッターによって作られたパーティクルが ニュートン フィールドによって影響されるようになります。

その他のフィールドの使用例

gravity コマンドの使用例

import maya.cmds

def makeGravity():
    ename = maya.cmds.emitter(pos=(0, 0, 0), type='direction', dx=0, dy=1, dz=0, spread=0.2, speed=15.0, rate=100)
    pname = maya.cmds.particle()
    maya.cmds.connectDynamic(pname[0], emitters=ename[0])
    gname = maya.cmds.gravity(pos=(0, 0, 0), magnitude=9.8, dx=0 ,dy=-1 ,dz=0)
    maya.cmds.connectDynamic(pname[0], f=gname[0])

drag コマンドの使用例

import maya.cmds

def makeDrag():
    ename = maya.cmds.emitter(pos=(0, 0, 0), type='direction', dx=0, dy=1, dz=0, spread=0.2, rate=3)
    pname = maya.cmds.particle()
    maya.cmds.connectDynamic(pname[0], emitters=ename[0])
    dname = maya.cmds.drag(pos=(0, 0, 0), magnitude=0.3, dx=0, dy=1, dz=0)
    maya.cmds.connectDynamic(pname[0], f=dname[0])

radialコマンドの使用例

import maya.cmds

def makeRadial():
    ename = maya.cmds.emitter(pos=(0, 0, 0), type='direction', dx=0, dy=1, dz=0, spread=0.2, rate=3)
    pname = maya.cmds.particle()
    maya.cmds.connectDynamic(pname[0], emitters=ename[0])
    rname = maya.cmds.radial(pos=(-2, 5, 0), magnitude=-2.0, maxDistance=3.0)
    maya.cmds.connectDynamic(pname[0], f=rname[0])

turbulence コマンドの使用例

import maya.cmds

def makeTurbulence():
    ename = maya.cmds.emitter(pos=(0, 0, 0), type='direction', dx=0, dy=1, dz=0, spread=0.2, rate=3)
    pname = maya.cmds.particle()
    maya.cmds.connectDynamic(pname[0], emitters=ename[0])
    tname = maya.cmds.turbulence(pos=(0, 5, 0), magnitude=2.0, maxDistance=3.0)
    maya.cmds.connectDynamic(pname[0], f=tname[0])

uniform コマンドの使用例

import maya.cmds

def makeUniform():
    ename = maya.cmds.emitter(pos=(0, 0, 0), type='direction', dx=0, dy=1, dz=0, spread=0.2, rate=3)
    pname = maya.cmds.particle()
    maya.cmds.connectDynamic(pname[0], emitters=ename[0])
    uname = maya.cmds.uniform(pos=(-2, 5, 0), magnitude=2.0, maxDistance=3.0)
    maya.cmds.connectDynamic(pname[0], f=uname[0])

vortex コマンドの使用例

import maya.cmds

def makeVortex():
    ename = maya.cmds.emitter(pos=(0, 0, 0), type='direction', dx=0, dy=1, dz=0, spread=0.2, rate=50)
    pname = maya.cmds.particle()
    maya.cmds.connectDynamic(pname[0], emitters=ename[0])
    vname = maya.cmds.vortex(pos=(0, 0, 0), magnitude=0.15, maxDistance=30.0, ax=0, ay=1.0, az=0)
    maya.cmds.connectDynamic(pname[0], f=vname[0])

練習

参考


Prev | Next
Home | Contents
Mail