コリジョン
コリジョンとは
collision コマンドによって
パーティクルと、ポリゴンや NURBS などのオブジェクトとを衝突させることができます。
collision コマンドで作られたコリジョンオブジェクトは、
以下のコマンドによってパーティクルなどにコネクトします。
connectDynamic -collisions コリジョンオブジェクト パーティクル;
collision コマンドのフラグ
- -resilience float
- 弾力を表す値(0.0 ~ 1.0)
大きい値ほど良くはずむようになります。
- -friction float
- 摩擦を表す値(0.0 ~ 1.0)
この値によって跳ねる角度が変ります。
collision コマンドの使用例
以下のスクリプトによって、
エミッターから発生したパーティクルが nurbsPlane に衝突して跳ね返りながら落ちてゆくアニメーションが作成されます。
- 以下の MEL スクリプトを makeCollision1.mel という名前で作成します。
global proc makeCollision1()
{
string $ename[] = `emitter -pos 0.0 5.0 0.0 -type "direction" -dx -1.0 -dy -1.0 -dz 0.0 -spread 0.5 -rate 3`;
string $pname[] = `particle`;
connectDynamic -emitters $ename[0];
string $plname[] = `nurbsPlane`;
scale 0 15 15;
rotate 0 0 45;
collision -resilience 0.3 -friction 0.1 $plname[0] $pname[0];
string $gname[] = `gravity`;
connectDynamic -fields $gname[0] $pname[0];
connectDynamic -collisions $plname[0] $pname[0];
}
- の によって makeCollision1.mel を読み込みます。
- の下のウインドウから makeCollision1(); と打ち込んで実行します。
- プレイバックしてアニメーションを実行します。
上図はわかりやすくするためにパーティクルの Particle Render Type アトリビュートを Spheres に変えて表示しています。
スクリプトの解説
global proc makeCollision1()
- makeCollision1() というプロシージャーの宣言です。
-
string $ename[] = `emitter -pos 0.0 5.0 0.0 -type "direction" -dx -1.0 -dy -1.0 -dz 0.0 -spread 0.5 -rate 3`;
- エミッターをつくります。
各フラグの意味は以下の通りです。
- -pos 0.0 5.0 0.0
- エミッターが作られる位置です。
- -type "direction"
- -dx, -dy, -dz フラグで指定する方向にパーティクルを放出します。
- -dx -1.0 -dy -1.0 -dz 0.0
- パーティクルの放出方向です。
- -spread 0.5
- パーティクルの放出角度を指定します。
0.0 から 1.0 の値を指定して、
0.5 が 90 度、1.0 が 180 度になります。
このフラグは -type が direction か curve の場合のみ有効です。
- -rate 3
- 毎秒のパーティクルの放出数を指定します。
-
string $pname[] = `particle`;
- エミッターによってパーティクルが追加されてゆく、
パーティクルオブジェクトを作ります。
-
connectDynamic -emitters $ename[0];
- 現在セレクトされているパーティクル $pname をエミッター $ename にコネクトします。
-
string $plname[] = `nurbsPlane`;
- パーティクルと衝突する平面 nurbsPlane を作ります。
-
scale 0 15 15;
- nurbsPlane のスケール値を 15 にします。
-
rotate 0 0 45;
- nurbsPlane を Z 軸で 45 度傾かせます。
-
collision -resilience 0.3 -friction 0.1 $plname[0] $pname[0];
- nurbsPlane $plname[0] とパーティクル $pname[0] にコリジョンの設定をします。
各フラグの意味は以下の通りです。
- -resilience 0.3
- 弾力係数
この値が 0.0 以上だと衝突したパーティクルが跳ね返ります。
0.0 以下だと貫通します。
1.0 以上、または -1.0 以下だと衝突後のパーティクルの速度が加速されます。
- -friction 0.1
- 摩擦係数
この値が 0.0 であれば摩擦の影響を受けないで、
衝突した面に平行に跳ね返ります。
値が 1.0 の場合は衝突した面に垂直に跳ね返ります。
-
string $gname[] = `gravity`;
- パーティクルをアニメーションさせるために gravity フィールドを作ります。
-
connectDynamic -fields $gname[0] $pname[0];
- gravity フィールドとパーティクル $pname[0] をコネクトして、
パーティクルが gravity フィールドによって落ちてゆくようにします。
-
connectDynamic -collisions $plname[0] $pname[0];
- nurbsPlane $plname[0] とパーティクル $pname[0] をコネクトしてパーティクルが nurbsPlane に衝突すると跳ね返るようにします。
練習
- 使用例の makeCollision1.mel を参考にして、makeCollision2.mel を作り collision の弾力 -resilience と摩擦 -friction の値を引数で変化させることができるようにしてみましょう。
(プロシージャーの名前と引数)
makeCollision2(float 弾力の値, float 摩擦の値)
(実行例)
makeCollision2(0.9, 0.1); を実行した場合
練習課題
参考
Prev | Next
Home | Contents
Mail