コリジョン

コリジョンとは

maya.cmds.collision() 関数によって パーティクルと、ポリゴンや NURBS などのオブジェクトとを衝突させることができます。
collision() 関数で作られたコリジョンオブジェクトは、 以下の関数によってパーティクルなどにコネクトします。
maya.cmds.connectDynamic(パーティクル, collisions=コリジョンオブジェクト)

collision() 関数のフラグ

resilience=弾力値
弾力を表す値(0.0 〜 1.0)
大きい値ほど良くはずむようになります。
friction=摩擦係数
摩擦を表す値(0.0 〜 1.0)
この値によって跳ねる角度が変ります。

collision() 関数の使用例

以下の Python スクリプトによって、 エミッターから発生したパーティクルが NURBS プレーン に衝突して跳ね返りながら落ちてゆくアニメーションが作成されます。

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

スクリプトの解説

import maya.cmds
maya.cmds モジュールをインポートします。
def makeCollision1():
makeCollision1() という関数の宣言です。
ename = maya.cmds.emitter(pos=(0.0, 5.0, 0.0), type='direction', dx=-1.0, dy=-1.0, dz=0.0, spread=0.5, rate=3)
エミッターを作成します。
各フラグの意味は以下の通りです。
pos=(0.0, 5.0, 0.0)
エミッターが作られる位置です。
type='direction'
dx, dy, dz フラグで指定する方向にパーティクルを放出します。
dx=-1.0, dy=-1.0, dz=0.0
パーティクルの放出方向です。
spread=0.5
パーティクルの放出角度を指定します。
0.0 から 1.0 の値を指定して、 0.5 が 90 度、1.0 が 180 度になります。
このフラグは type が direction か curve の場合のみ有効です。
rate=3
毎秒のパーティクルの放出数を指定します。
pname = maya.cmds.particle()
エミッターによってパーティクルが追加されてゆく、 パーティクルオブジェクトを作ります。
maya.cmds.connectDynamic(emitters=ename[0])
現在セレクトされているパーティクル pname をエミッター ename にコネクトします。
plname = maya.cmds.nurbsPlane()
パーティクルと衝突するNURBS プレーン を作ります。
maya.cmds.scale(0, 15, 15)
NURBS プレーン のスケール値を 15 にします。
maya.cmds.rotate(0, 0, 45)
NURBS プレーン を Z 軸で 45 度傾かせます。
maya.cmds.collision(plname[0], pname[0], resilience=0.3, friction=0.1)
NURBS プレーン plname[0] とパーティクル pname[0] にコリジョンの設定をします。
各フラグの意味は以下の通りです。
resilience=0.3
弾力係数
この値が 0.0 以上だと衝突したパーティクルが跳ね返ります。 0.0 以下だと貫通します。
1.0 以上、または -1.0 以下だと衝突後のパーティクルの速度が加速されます。
friction=0.1
摩擦係数
この値が 0.0 であれば摩擦の影響を受けないで、 衝突した面に平行に跳ね返ります。 値が 1.0 の場合は衝突した面に垂直に跳ね返ります。
gname = maya.cmds.gravity()
パーティクルをアニメーションさせるために gravity フィールドを作ります。
maya.cmds.connectDynamic(pname[0], fields=gname[0])
gravity フィールドとパーティクル pname[0] をコネクトして、 パーティクルが gravity フィールドによって落ちてゆくようにします。
maya.cmds.connectDynamic(pname[0], collisions=plname[0])
NURBS プレーン plname[0] とパーティクル pname[0] をコネクトしてパーティクルが NURBS プレーン に衝突すると跳ね返るようにします。

練習

参考


Prev | Next
Home | Contents
Mail