リジッドボディ同士がぶつかった時に、
火花が散るというアニメーションを作ってみましょう。
また今回のスクリプトを応用すれば、火花の代わりに衝突時に穴を開けたり、へこみを作ることもできるようになります。
最初のスクリプトの火花は小さくて見にくいかもしれません。
それはパーティクルのアトリビュートを適切に設定していないからです。
それらのアトリビュートの設定は練習問題で行ないます。
また、衝突した後、火花がずっと出続ける問題も練習問題で解決しましょう。
なお、今回のスクリプトはプロシージャが 2 つ含まれているので注意して作ってください。
global proc makeSpark1()
{
string $gra[] = `gravity -m 9.8`;
polySphere;
move 1 10 1;
rigidBody -active;
connectDynamic -f $gra[0];
polyPlane;
scale 20 1 20;
rotate 0 0 -45;
string $rb = `rigidBody -passive`;
expression -o $rb -s ("makeEmitter1(\"" + $rb + "\", contactCount)");
setAttr rigidSolver.contactData 1;
}
global proc makeEmitter1(string $rigidbody, int $contval)
{
if($contval > 0)
{
string $pp[] = `rigidBody -q -contactPosition $rigidbody`;
string $pos[];
tokenize $pp[0] $pos;
string $emi[] = `emitter -pos $pos[0] $pos[1] $pos[2]`;
string $pname[] = `particle`;
connectDynamic -em $emi[0];
setAttr ($pname[1] + ".particleRenderType") 6;
setAttr ($pname[1] + ".lifespanMode") 2;
setAttr ($pname[1] + ".lifespanRandom") 0.5;
setAttr ($pname[1] + ".lifespan") 5;
}
}
(注意)
再度プレイバックする場合は衝突によって作られたパーティクルとエミッターを消去しておいてください。
global proc makeSpark1()
string $gra[] = `gravity -m 9.8`;
polySphere;
move 1 10 1;
rigidBody -active;
connectDynamic -f $gra[0];
polyPlane;
scale 20 1 20;
rotate 0 0 -45;
string $rb = `rigidBody -passive`;
expression -o $rb -s ("makeEmitter1(\"" + $rb + "\", contactCount)");
setAttr rigidSolver.contactData 1;
global proc makeEmitter1(string $rigidbody, int $contval)
if($contval > 0)
string $pp[] = `rigidBody -q -contactPosition $rigidbody`;
string $pos[];
tokenize $pp[0] $pos;
string $emi[] = `emitter -pos $pos[0] $pos[1] $pos[2]`;
string $pname[] = `particle`;
connectDynamic -em $emi[0];
setAttr ($pname[1] + ".particleRenderType") 6;
setAttr ($pname[1] + ".lifespanMode") 2;
setAttr ($pname[1] + ".lifespanRandom") 0.5;
setAttr ($pname[1] + ".lifespan") 5;
セレクトされたオブジェクトの名前を調べるには ls -sl コマンドを使用します。
ここでは、ls -sl によって 2 つのオブジェクト名が返ります。
string $objs[] = `ls -sl`;
と実行することによって
$objs[0]
に最初にセレクトされたオブジェクト名、
$objs[1]
に 2 番目にセレクトされたオブジェクト名が代入されます。
(ls -sl コマンドは makeSpark2 プロシージャの最初で実行してください)
後は、1 つ目の rigidbody コマンドの直前で $objs[0] を select コマンドでセレクトし、
2 つ目の rigidbody コマンドの直前で $objs[1] を同じように select コマンドでセレクトしておきます。
lineWidth, tailSize, tailFade はダイナミックアトリビュートなので
addAttr コマンドでパーティクル $pname[1] にアトリビュートを追加してやる必要があります。
addAttr コマンドを使用する場合に必要なフラグは以下の通りです。
現在のフレーム番号を知るには、以下のコマンドを使用します。
currentTime -q
このコマンドを使用して衝突時のフレーム番号を調べ、
そのフレーム番号より何フレームか後にエミッターの rate アトリビュートを 0 にしてください。
そのためには、エミッターにエクスプレッションを設定して、
ぶつかった時のフレーム番号から何フレーム後かをチェックして、
アトリビュート(rate)を 0 にします。