リジッドボディ
リジッドボディとは
リジッドボディ(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(); と打ち込んで実行する。
- プレイバックしてアニメーションを実行する。
スクリプトの解説
-
string $sname[] = `sphere`;
- 球(NURBS Sphere)を作る。
-
string $pname[] = `nurbsPlane`;
- 平面(NURBS Plane)を作る。
-
scale 10 30 20 ;
- NURBS Planeを適当にスケールしておく。
-
rotate 0 0 115;
- nurbsPlaneを適当に回転しておく。
このとき法線の向きが上に向くようにしないと、球が素通りしてしまう。
-
move -r 3 -8 0;
- NURBS Planeを適当に移動する。
-
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]
- リジッドボディにするオブジェクトの名前の入った変数
-
rigidBody -passive $pname[0];
- nurbsPlane($pname[0])からパッシブリジッドボディを作る。
-
string $grname = `gravity -pos 10 10 10`;
- 球をアニメーションさせる(下方向に落ちる)ためのgravityフィールドを作る。
- -pos 10 10 10
- gravityフィールドの位置
-
connectDynamic -fields $grname[0] $rname;
- 球から作られたリジッドボディ($rname)とgravityフィールド($grname[0])をコネクトする。
-
collision -resilience 0.9 -friction 0.1 $sname[0] $pname[0];
- 球($sname[0])とnurbsPlane($pname[0])が衝突して跳ね返るようにするために collision の設定をする。
-
connectDynamic -collisions $sname[0] $pname[0];
- 球($sname[0])とnurbsPlane($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 を使用する。
練習課題
参考
Prev | Next
Home | Contents
Mail