噴水を作るツール 2

噴水の作り方

前回の噴水を作るスクリプトでは lifespan アトリビュートによってパーティクルが消滅する時間を決めていました。 それによって、水面に衝突した直後にパーティクルが消えるようなアニメーションを作りましたが、 水面が水平ではない場合には、跳ね返りが大きすぎたり、水面に届かないで消滅するパーティクルがでてきたりします。
そこで、パーティクルがオブジェクトに衝突したら、別のパーティクルを放出するようにしてみましょう。 そのためには event コマンドを使用します。

噴水作成ツールの例 2

  1. 以下の MEL スクリプトを makeFountain4.mel という名前で作ります。
    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;
    }
    
  2. Script EditorFile → Source Script によって makeFountain4.mel を読み込みます。
  3. Script Editor のインプットウインドウで、makeFountain4() を実行します。
    (makeFountain4() 実行後の図)
    [makeFountain4() 実行後の図]
  4. アニメーションを実行します。
    [アニメーション実行後の図]

スクリプトの解説

global proc makeFountain4()
makeFountain4 というプロシージャを宣言します。
circle;
水面にするために circle を作ります。
scale 5 5 1;
適当にスケールをかけます。
string $plname[] = `planarSrf`;
Planar によって水面を作ります。
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`;
エミッターを以下のフラグにしたがって作ります。
-pos 0 0.5 0
エミッターの位置は (0, 0.5, 0)
-type "direction"
エミッターの種類は "direction"
-dx 0 -dy 1 -dz 0
パーティクルの出てゆく方向は (0, 1, 0)
-rate 100
パーティクルでる割合は 1 秒間に 100 個
-spread 0.1
パーティクルの出てゆく角度は 0.1 度
-speed 10.0
パーティクルの速度は 10.0
string $pname1[] = `particle`;
エミッターから出てくるパーティクルを作成します。
connectDynamic -emitters $ename[0] $pname1[0];
エミッターとパーティクルをコネクトし、 エミッターによってパーティクルが作られるようにします。
string $gname[] = `gravity -pos 0 0 0 -magnitude 9.8`;
重力のフィールドを作成します。
フラグは以下の通りです。
-pos 0 0 0
フィールドの位置は (0, 0, 0)
-magnitude 9.8
重力係数は 9.8
connectDynamic -fields $gname[0] $pname1[0];
重力のフィールドとパーティクルをコネクトし、 パーティクルにフィールドが働くようにします。
collision -resilience 0.3 -friction 0.1 $plname[0] $pname1[0];
水面とパーティクルに対してコリジョンの設定を行います。
このコマンドによって geoConnctor ノードが作成されます。
フラグの意味は以下のとおりです。
-resilience 0.3
弾性係数は 0.3
この値が大きいほど、大きく跳ね返ります。
-friction 0.1
摩擦係数は 0.1
跳ね返ったときの角度が変わります。
connectDynamic -collisions $plname[0] $pname1[0];
水面($plname[0])とパーティクル($pname1[0])が実際に衝突するようにします。
setAttr ($pname1[1] + ".particleRenderType") 1;
パーティクルシェイプノードの particleRenderType アトリビュートを 1 にすることによって、 パーティクルの形を MultiStreak にします。
string $pname2[] = `particle -i 0.5`;
エミッターから出てくるパーティクルが水面に衝突したときに放出されるパーティクルを作ります。
フラグの意味は以下の通りです。
-i 0.5
パーティクル $pname2 の速度が、どの程度パーティクル $pname1 の速度を継承するかを決定します。
$pname2 の速度は -i の値が 0.0 であれば 0 になり、 1.0 であれば $pname1 の速度と同じになります。
event -em 5 -die 1 -target $pname2[0] -spread 0.2 -random 0 -count 0 $pname1[0];
パーティクル $pname1[0] が、水面に衝突したときに別のパーティクル $pname2[0] を放出するように設定します。
フラグの意味は以下の通りです。
-em 5
衝突したときに、いくつのパーティクルが放出されるかを決定します。
-die 1
衝突したパーティクルが消滅するかどうかを決定します。
1 (true) であれば消滅し、 0 (false) であれば消滅しません。
-target $pname2[0]
衝突するパーティクルから放出されるパーティクルを指定します。
-spread 0.8
放出されるパーティクルの広がる角度を指定します。
0.0 だと同じ方向、 1.0 だと 180 度の角度の範囲内で広がってゆきます。
-random 1
-em フラグで指定された数までのランダムな個数のパーティクルが作られます。
例えば、ここでは 1 から 5 個までのパーティクルがランダムに作られます。
-count 0
何度目の衝突までこのイベントを実行するかを決定します。 0 であれば全ての衝突でこのイベントを実行します。
setAttr ($pname2[1] + ".particleRenderType") 1;
パーティクルの形を MultiStreak にします。
setAttr ($pname2[1] + ".lifespanMode") 1;
パーティクルシェイプノードの lifespanMode アトリビュートを 1 にして、 Lifespan Mode を Constant にします。
setAttr ($pname2[1] + ".lifespan") 0.1;
パーティクルシェイプノードの lifespan アトリビュートを 0.1 にします。
これによってパーティクルが発生してから 0.1 秒で消滅するようになります。

練習

練習課題

参考


Prev | Next
Home | Contents
Mail