前回の噴水を作るスクリプトでは lifespan アトリビュートによってパーティクルが消滅する時間を決めていました。
それによって、水面に衝突した直後にパーティクルが消えるようなアニメーションを作りましたが、
水面が水平ではない場合には、跳ね返りが大きすぎたり、水面に届かないで消滅するパーティクルがでてきたりします。
そこで、パーティクルがオブジェクトに衝突したら、別のパーティクルを放出するようにしてみましょう。
そのためには event コマンドを使用します。
global proc makeFountain4()
{
circle;
scale 5 5 1;
string $plname[] = `planarSrf`;
rotate 135 0 0 $plname[0];
string $ename[] = `emitter -pos 0 0.5 0 -type "direction" -dx 0 -dy 1 -dz 0 -rate 100 -spread 0.1 -speed 10.0`;
string $pname1[] = `particle`;
connectDynamic -emitters $ename[0] $pname1[0];
string $gname[] = `gravity -pos 0 0 0 -magnitude 9.8`;
connectDynamic -fields $gname[0] $pname1[0];
collision -resilience 0.3 -friction 0.1 $plname[0] $pname1[0];
connectDynamic -collisions $plname[0] $pname1[0];
setAttr ($pname1[1] + ".particleRenderType") 1;
string $pname2[] = `particle -i 0.5`;
event -em 5 -die 1 -target $pname2[0] -spread 0.8 -random 1 -count 0 $pname1[0];
setAttr ($pname2[1] + ".particleRenderType") 1;
setAttr ($pname2[1] + ".lifespanMode") 1;
setAttr ($pname2[1] + ".lifespan") 0.1;
}
global proc makeFountain4()
circle;
scale 5 5 1;
string $plname[] = `planarSrf`;
rotate 135 0 0 $plname[0];
string $ename[] = `emitter -pos 0 0.5 0 -type "direction" -dx 0 -dy 1 -dz 0 -rate 100 -spread 0.1 -speed 10.0`;
string $pname1[] = `particle`;
connectDynamic -emitters $ename[0] $pname1[0];
string $gname[] = `gravity -pos 0 0 0 -magnitude 9.8`;
connectDynamic -fields $gname[0] $pname1[0];
collision -resilience 0.3 -friction 0.1 $plname[0] $pname1[0];
connectDynamic -collisions $plname[0] $pname1[0];
setAttr ($pname1[1] + ".particleRenderType") 1;
string $pname2[] = `particle -i 0.5`;
event -em 5 -die 1 -target $pname2[0] -spread 0.2 -random 0 -count 0 $pname1[0];
setAttr ($pname2[1] + ".particleRenderType") 1;
setAttr ($pname2[1] + ".lifespanMode") 1;
setAttr ($pname2[1] + ".lifespan") 0.1;