リジッドボディ
リジッドボディとは
リジッドボディ(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 コマンドの使用例
平面に球が当たってバウンドするアニメーションです。
- 以下の 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;
collision -resilience 0.9 -friction 0.1 $sname[0] $pname[0];
connectDynamic -collisions $sname[0] $pname[0];
}
- の によって makeRigid1.mel を読み込みます。
- の下のウインドウから makeRigid1(); と打ち込んで実行します。
- プレイバックしてアニメーションを実行します。
スクリプトの解説
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`;
- 球を下方向に落ちるアニメーションさせるための gravity フィールドを作ります。
- -pos 0 0 0
- gravityフィールドの位置
-
connectDynamic -fields $grname[0] $rname;
- 球から作られたリジッドボディ $rname とgravityフィールド $grname[0] をコネクトします。
-
collision -resilience 0.9 -friction 0.1 $sname[0] $pname[0];
- NURBS の球 $sname[0] と NURBS の平面 $pname[0] が衝突して跳ね返るようにするために collision の設定をします。
-
connectDynamic -collisions $sname[0] $pname[0];
- NURBS の球 $sname[0] と NURBS の平面 $pname[0] をコネクトして衝突すると跳ね返るようにします。
練習
- 使用例の makeRigid1.mel を参考にして、
makeRigid2.mel を作り rigidBody に変換するプリミティブオブジェクトの種類、
弾性係数 -bounciness と抵抗力(摩擦)係数 -staticFriction を引数で指定できるようにしてみましょう。
(プロシージャーの名前と引数)
makeRigid2(string オブジェクトの種類, float 弾性係数, float 抵抗力(摩擦)係数)
オブジェクトの種類はオブジェクトを作るコマンドを文字列であたえます。
(例)
makeRigid2("cone", 0.5, 0.2);
コーンが作られて、弾性係数が0.5、 抵抗力(摩擦)係数は0.2
(ヒント)
string で与えられたコマンドを実行するには eval を使用します。
(注意)
このスクリプトでは 1 番目の引数になるプリミティブオブジェクトは、
返り値として string の配列を返すものが与えられるという仮定で作成してください。
例えば、nubrsCube, ployCube, cylinder, polyCylinder, polySphere, nurbsPlane, torus, polyTorus, polyPlane などが string の配列を返します。
plane コマンドなどは string を返すので、
返り値を string の配列に代入しようとするとエラーになります。
できれば、 string を返すプリミティブオブジェクトにも対応できるスクリプトも作ってみてください。
練習課題
参考
Prev | Next
Home | Contents
Mail