コリジョン
コリジョンとは
パーティクルと、ポリゴンや NURBS などのオブジェクトを衝突させることができます。
そのためには、collision コマンドを使用します。
collision コマンドのフラグ
- -resilience float
- 弾性を表す値(0.0 〜 1.0)
大きい値ほど良くはずむようになります。
デフォールトは 1.0 です。
- -friction float
- 摩擦を表す値(0.0 〜 1.0)
この値によって跳ね返る角度が変ります。
デフォールトは 0.0 です。
collision コマンドの使用例
以下のスクリプトによって、
エミッターから発生したパーティクルが NURBS プレーン に衝突して跳ね返りながら落ちてゆくアニメーションが作成されます。
- 以下の 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];
}
- の によって makeCollision1.mel を読み込みます。
- の下のウインドウから makeCollision1(); と打ち込んで実行します。
- プレイバックしてアニメーションを実行します。
上図はわかりやすくするためにパーティクルの レンダータイプ アトリビュートを 球体 に変えて表示しています。
スクリプトの解説
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`;
- パーティクルと衝突する NURBS プレーン を作ります。
-
scale 0 15 15;
- NURBS プレーン のスケール値を 15 にします。
-
rotate 0 0 45;
- NURBS プレーン を Z 軸で 45 度傾かせます。
-
collision -resilience 0.3 -friction 0.1 $plname[0] $pname[0];
- NURBS プレーン $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 フィールドによって落ちてゆくようにします。
弾性と摩擦を変更
たとえば、コリジョンの設定を行った後で、
弾性係数を 0.8、摩擦係数を 0.3 に変更するには以下のどちらかの方法で実行します。
- ジオメトリ単位で変更
ジオメトリごとに別々の数値を設定する方法です。
コリジョンされているオブジェクトを 1 つ選択しておき、
以下の MEL コマンドを実行します。
string $name[] = `ls -sl`;
string $sname[] = `listRelatives $name[0]`;
string $gname[] = `listConnections ($sname[0] + ".message")`;
setAttr ($gname[0] + ".resilience") 0.8;
setAttr ($gname[0] + ".friction") 0.3;
- パーティクル単位で変更
ジオメトリに関係なく、パーティクルごとに設定する方法です。
この方法を使うと、
geoConnector ノードからこのパーティクルの弾性と摩擦を変更できなくなります。
コリジョンしているパーティクルを 1 つ選択しておき、
以下の MEL コマンドを実行します。
ただし、ここではパーティクルがコリジョンしているオブジェクトが
1 つだけという前提で実行します。
string $name[] = `ls -sl`;
string $sname[] = `listRelatives $name[0]`;
string $gname[] = `listConnections ($sname[0] + ".collisionResilience[0]")`;
disconnectAttr ($gname[0] + ".resilience") ($sname[0] + ".collisionResilience[0]");
disconnectAttr ($gname[0] + ".friction") ($sname[0] + ".collisionFriction[0]");
setAttr ($sname[0] + ".collisionResilience[0]") 0.8;
setAttr ($sname[0] + ".collisionFriction[0]") 0.3;
練習
- 使用例の makeCollision1.mel を参考にして、makeCollision2.mel を作り collision の弾性 -resilience と摩擦 -friction の値を引数で変化させることができるようにしてみましょう。
(プロシージャの名前と引数)
makeCollision2(float 弾性の値, float 摩擦の値)
(実行例)
makeCollision2(0.9, 0.1); を実行した場合
練習課題
参考
Prev | Next
Home | Contents
Mail