リジッドボディ

リジッドボディとは

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

リジッドボディには、アクティブとパッシブという 2 つの種類があります。

アクティブリジッドボディ
フィールドなどのダイナミクスによって、アニメーションされます。
パッシブリジッドボディ
キーフレームなどによって、アニメーションされます。

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

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

リジッドボディを作るには rigidBody コマンドを使用します。

rigidBody コマンドのフラグ

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

rigidBody コマンドの使用例

プレーンに、球体が当たってバウンドするアニメーションを作ってみましょう。

  1. 以下の MEL スクリプトを makeRigid1.mel という名前で作ります。
    global proc makeRigid1()
    {
           string $sname[] = `sphere`;
           string $pname[] = `nurbsPlane`;
           scale 10 30 20 ;
           rotate 0 0 115;
           move -r 3 -8 0;
    
           string $rname = `rigidBody -active -initialVelocity 10.0 0.0 0.0 -bounciness 0.5 -staticFriction 0.4 $sname[0]`;
           rigidBody -passive $pname[0];
           string $gname[] = `gravity -pos 0 0 0`;
           connectDynamic -fields $gname[0] $rname;
    }
    
  2. スクリプト エディタファイル → ソース スクリプト によって makeRigid1.mel を読み込みます。
  3. スクリプト エディタ のインプットウインドウから makeRigid1(); と打ち込んで実行します。
    [makeRigid1.mel の実行図]
  4. プレイバックしてアニメーションを実行します。
    [makeRigid1.mel のアニメーション実行図]

スクリプトの解説

global proc makeRigid1()
makeRigid1() というプロシージャの宣言です。
string $sname[] = `sphere`;
NURBS の球体を作ります。
$sname[0] にトランスフォームノード、 $sname[1] にインプットノードの名前が代入されます。
string $pname[] = `nurbsPlane`;
NURBS のプレーンを作ります。
$pname[0] にトランスフォームノード、 $pname[1] にインプットノードの名前が代入されます。
scale 10 30 20 ;
NURBS のプレーンを適当にスケールしておきます。
rotate 0 0 115;
NURBS のプレーンを適当に回転しておきます。
このとき法線の向きが上に向くようにしないと、 球体がプレーンを素通りしてしまうので注意してください。
move -r 3 -8 0;
NURBS のプレーンを適当に移動します。
-r フラグがついているので現在位置からの移動になります。
string $rname = `rigidBody -active -initialVelocity 10.0 0.0 0.0 -bounciness 0.5 -staticFriction 0.4 $sname[0]`;
球体 $sname[0] から、アクティブリジッドボディを作ります。
各フラグの意味は、以下の通りです。
-active
アクティブリジッドボディを作ります。
-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 です。
$sname[0]
リジッドボディに変換するオブジェクトの名前の入った変数です。
ここでは NURBS 球体の名前です。
rigidBody -passive $pname[0];
nurbsPlane $pname[0] から、パッシブリジッドボディを作ります。
ここでは NURBS のプレーンです。
string $grname = `gravity -pos 0 0 0`;
球体を、下方向に落とすための 重力 フィールドを作ります。
-pos 0 0 0
重力フィールドの位置です。
connectDynamic -fields $grname[0] $rname;
球体から作られたリジッドボディ $rname と、 重力フィールド $grname[0] をコネクトします。

アクティブとパッシブの切り換え

アクティブリジッドボディとパッシブリジッドボディは、 アニメーションの途中で切り換えることができます。
たとえば、1 フレーム目から 30 フレーム目までは キーフレームでアニメーションさせて、 31 フレーム以降はダイナミクスによってアニメーションさせることができます。
MEL コマンドによる実行方法は、MEL Tips の アニメーション方法の切り換え(ダイナミクスとキーフレーム) を参照してください。

Tips (ベイク)

アクティブリジッドボディによるアニメーションを、 キーフレームアニメーションに変換することができます。
GUI のメニューでは 編集 → キー → ベイク シミュレーション □ 、 MEL では bakeResults コマンドを使用します。

以下のコマンドは、NURBS 球体をアクティブリジッドボディに変換して、 重力フィールドでアニメーションさせています。
最後に、bakeResults コマンドで 1 フレームから 30 フレームまでを キーフレームアニメーションに変換しています。

string $sname[] = `sphere`;
string $rname = `rigidBody -active $sname[0]`;
string $gname[] = `gravity`;
connectDynamic -fields $gname[0] $rname;
bakeResults -simulation true -t "1:30" -sampleBy 1 -disableImplicitControl true -preserveOutsideKeys true -shape true $sname[0];

練習

練習課題

参考


Prev | Next
Home | Contents
Mail