リジッドボディ同士がぶつかった時に、
火花が散るというアニメーションを作ってみましょう。
また今回のスクリプトを応用すれば、火花の代わりに衝突時に穴を開けたり、へこみを作ることもできるようになります。
最初のスクリプトの火花は、小さくて見にくいかもしれません。
それは、パーティクルのアトリビュートを適切に設定していないからです。
それらのアトリビュートの設定は、練習問題で行ないます。
また、衝突した後、火花がずっと出続ける問題も練習問題で解決しましょう。
なお、今回のスクリプトは、プロシージャが 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 コマンドを使用する場合に、必要なフラグは以下の通りです。