リジッドボディ

リジッドボディとは

リジッドボディ(Rigid Body)とは NURBS やポリゴンのサーフェスを固い形状にしたものです。
リジッドボディ同士を衝突させて、 貫通しないで跳ね返らせるようにすることができます。

リジッドボディにはアクティブとパッシブという 2 種類があります。
例えば、壁にぶつかるボールを作りたい時は ダイナミクスによってアニメーションするボールをアクティブリジッドボディに、 そのボールが衝突する壁をパッシブリジッドボディにしておきます。

リジッドボディを作成する時に注意しなければならないのは、 衝突する物体同志の法線の向きが反対になっていないと衝突しないということです。

リジッドボディを作るには maya.cmds.rigidBody() 関数を使用します。

rigidBody () 関数のフラグ

active=True
アクティブリジッドボディを作ります。
衝突(collision)やフィールドなどのダイナミクスを有効にすることができきます。(デフォールト)
キーフレームの設定はできません。
passive=True
パッシブリジッドボディを作ります。
パッシブリジッドボディはダイナミクスに反応しません。
キーフレームの設定が可能です。
initialVelocity=(X, Y, Z)
初期の速度(デフォールトは 0.0, 0.0, 0.0)
bounciness=弾性係数
弾性の係数(0.0 〜 2.0, デフォールトは 0.6)
staticFriction=摩擦係数
抵抗力(摩擦)の係数(0.0 〜 1.0, デフォールトは 0.2)
他のリジッドボディに接触している場合に、 2 つのリジッドボディの間にどれだけの摩擦のような抵抗があるかを表します。

rigidBody 関数の使用例

プレーンに球が当たってバウンドするアニメーションです。

  1. 以下の Python スクリプトを makeRigid1.py という名前で作ります。
    import maya.cmds
    
    def makeRigid1():
        sname = maya.cmds.sphere()
        pname = maya.cmds.nurbsPlane()
        maya.cmds.scale(10, 30, 20)
        maya.cmds.rotate(0, 0, 115)
        maya.cmds.move(3, -8, 0, r=True)
    
        rname = maya.cmds.rigidBody(sname[0], active=True, initialVelocity=(10.0, 0.0, 0.0), bounciness=0.5, staticFriction=0.4)
        maya.cmds.rigidBody(pname[0], passive=True)
        gname = maya.cmds.gravity(pos=(0, 0, 0))
        maya.cmds.connectDynamic(rname, fields=gname[0])
    
  2. スクリプト エディタ の ファイル → スクリプトのロード によって makeRigid1.py を読み込んで、テンキーの Enter キーなどで実行します。
  3. スクリプト エディタ のインプットウインドウから makeRigid1() と打ち込んで実行します。
    [makeRigid1.mel の実行図]
  4. プレイバックしてアニメーションを実行します。
    [makeRigid1.mel のアニメーション実行図]

スクリプトの解説

import maya.cmds
maya.cmds モジュールをインポートします。
def makeRigid1()
makeRigid1() という関数の宣言です。
sname = maya.cmds.sphere(
NURBS の球を作ります。
sname[0] にトランスフォームノード、 sname[1] にインプットノードの名前が代入されます。
pname = maya.cmds.nurbsPlane()
NURBS のプレーンを作ります。
pname[0] にトランスフォームノード、 pname[1] にインプットノードの名前が代入されます。
maya.cmds.scale(10, 30, 20)
NURBS のプレーンを適当にスケールしておきます。
maya.cmds.rotate(0, 0, 115)
NURBS のプレーンを適当に回転しておきます。
このとき法線の向きが上に向くようにしないと、 球が素通りしてしまうので注意してください。
maya.cmds.move(3, -8, 0, r=True)
NURBS のプレーンを適当に移動します。
r フラグがついているので現在位置からの移動になります。
rname = maya.cmds.rigidBody(sname[0], active=True, initialVelocity=(10.0, 0.0, 0.0), bounciness=0.5, staticFriction=0.4)
sname[0] からアクティブリジッドボディを作ります。
各フラグの意味は以下の通りです。
sname[0]
リジッドボディにするオブジェクトの名前の入った変数
ここでは NURBS の球です。
active=True
アクティブリジッドボディを作ります。
initialVelocity=(10.0, 0.0, 0.0)
最初のスピードが 10.0 (X方向) 0.0 (Y方向) 0.0 (Z方向)
bounciness=0.5
弾性の係数は 0.5
staticFriction=0.4
摩擦係数は 0.4
maya.cmds.rigidBody(pname[0], passive=True)
nurbsPlane pname[0] からパッシブリジッドボディを作る。
ここでは NURBS のプレーンです。
gname = maya.cmds.gravity(pos=(0, 0, 0))
球を下方向に落ちるアニメーションさせるための 重力 フィールドを作ります。
pos=(0, 0, 0)
重力フィールドの位置
maya.cmds.connectDynamic(rname, fields=gname[0])
球から作られたリジッドボディ rname と重力フィールド grname[0] をコネクトします。

練習

参考


Prev | Next
Home | Contents
Mail