リジッドボディ
リジッドボディとは
リジッドボディ(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;
}
- の によって 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`;
- 球体を、下方向に落とすための 重力 フィールドを作ります。
- -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];
練習
- 使用例の makeRigid1.mel を参考にして、
makeRigid2.mel を作り rigidBody に変換するプリミティブオブジェクトの種類、
弾性係数 -bounciness と抵抗力(摩擦)係数 -staticFriction を引数で指定できるようにしてみましょう。
(プロシージャの名前と引数)
makeRigid2(string オブジェクトの種類, float 弾性係数, float 抵抗力(摩擦)係数)
オブジェクトの種類は、オブジェクトを作る MEL コマンドを文字列であたえます。
(例)
makeRigid2("cone", 0.5, 0.2);
コーンのリジッドボディが作られて、弾性係数が0.5、 抵抗力(摩擦)係数は0.2
(ヒント)
string で与えられたコマンドを実行するには、 eval を使用します。
(注意)
このスクリプトでは 1 番目の引数になるプリミティブオブジェクトは、
返り値として string の配列を返すものが与えられる、という仮定で作成してください。
たとえば、nurbsCube, polyCube, cylinder, polyCylinder, polySphere, nurbsPlane, torus, polyTorus, polyPlane などが string の配列を返します。
plane コマンドなどは string を返すので、
返り値を string の配列に代入しようとするとエラーになります。
できれば、 string を返すプリミティブオブジェクトにも対応できる、
スクリプトを作ってみてください。
練習課題
参考
Prev | Next
Home | Contents
Mail