パーティクルのインスタンス 1

パーティクルのインスタンス

パーティクルのインスタンスを使用することによって、 パーティクルの各点にオブジェクトを配置して、 パーティクルの動きとオブジェクトの動きを連動することができます。
インスタンス化されたオブジェクトは、 移動・回転・スケールなどを個別にコントロールすることができます。 そのためには、パーティクルにアトリビュートを追加して、 追加されたアトリビュートをエクスプレッションなどでアニメーションさせてやります。

インスタンスの使用例

コーンをインスタンス化し、各コーンエクスプレッションによって回転させるプロシージャーを作ってみましょう。

  1. 以下の MEL スクリプトを makeInstance1.mel という名前で作ります。
    global proc makeInstance1()
    {
    	string $pname[] = `particle -p -3 0 -3 -p -3 0 3 -p 3 0 -3 -p 3 0 3 -p 0 3 0`;
    	string $oname[] = `cone`;
    
    	select -tgl $pname[0] ;
    	string $iname = `particleInstancer  -addObject -object $oname[0] $pname[1]`;
    	addAttr -ln myRotate -dt vectorArray  $pname[1];
    	dynExpression
    		-s ("if(frame == 1)"
    		+ "{"
    		+ "	float $rand = rand(0,180);"
    		+ "	myRotate = <<$rand, $rand, $rand>>;"
    		+ "}")
    		-creation $pname[1];
    	dynExpression
    		-s ("if(frame > 1)"
    		+ "{"
    		+ "	myRotate += <<0.001,0.002,0.003>>;"
    		+ "}")
    		-runtime $pname[1];
    	particleInstancer -e -name $iname -rotation myRotate $pname[1];
    }
    
  2. Script EditorFile → Source Script によって makeInstance1.mel を読み込みます。
  3. Script Editor のインプットウインドウで、makeInstance1() を実行します。
    すると、以下のようにインスタンス化されたコーンが現れます。
    [makeInstance1() 実行図]
    この時点では、コーンの向きはランダムになっていないかもしれません。
  4. アニメーションを実行します。
    すると、インスタンスの各コーンが回転します。
  5. アニメーションを中止し、フレームを巻き戻します。
    すると、今度は各コーンの向きがランダムになっているはずです。
    [アニメーション後の図]

スクリプトの解説

global proc makeInstance1()
makeInstance1 という名前のプロシージャの宣言です。
string $pname[] = `particle -p -3 0 -3 -p -3 0 3 -p 3 0 -3 -p 3 0 3 -p 0 3 0`;
5 個の点をもつパーティクルを作ります。
このパーティクルの各点にインスタンスが作られます。
string $oname[] = `cone`;
インスタンスの元になるコーンを作ります。
コーンの名前は文字列配列 $oname に代入しておきます。
select -tgl $pname[0] ;
パーティクルをセレクトします。
string $iname = `particleInstancer -addObject -object $oname[0] $pname[1]`;
インスタンサーノードを作成して、パーティクルの点の位置にコーンを配置します。
このコマンドによってパーティクルインスタンサ−ノードが作られて、 その名前が文字列変数 $iname に代入されます。
各フラグの意味は以下のとおりです。
-addObject
インスタンスとしてオブジェクトを追加
-object $oname[0]
追加するオブジェクトの指定
ここではコーン($oname[0])
addAttr -ln myRotate -dt vectorArray $pname[1];
パーティクルに myRotate という名前のアトリビュートを追加します。
myRotate の型は vectorArray というベクトルの配列にしておきます。 この、一つ一つのベクトルがインスタンスの回転をコントロールします。
dynExpression
  -s ("if(frame == 1)"
  + "{"
  + " float $rand = rand(0,180);"
  + " myRotate = <<$rand, $rand, $rand>>;"
  + "}")
-creation $pname[1];
パーティクル作成時(-creation)のダイナミックエクスプレッションを設定します。
エクスプレッションの式は文字列の結合によって作られているので、 見やすくするために式の部分だけにしてみましょう。
if(frame == 1)
{
	float $rand = rand(0,180);
	myRotate = <<$rand, $rand, $rand>>;
}
if(frame == 1)
1 フレーム目に以下のコマンドを実行します。
frame は現在のフレーム番号を表す特別な変数です。
float $rand = rand(0,180);
0 から 180 までの乱数を作成して $rand に代入します。
myRotate = <<$rand, $rand, $rand>>;
先に追加されたアトリビュート myRotate に乱数の値を使ったベクトルの値を代入します。
このベクトルがコーンの X, Y, Z 方向の回転角度になります。
dynExpression
  -s ("if(frame > 1)"
  + "{"
  + " myRotate += <<0.001,0.002,0.003>>;"
  + "}")
  -runtime $pname[1];
アニメーション実行時(-runtime)のダイナミックエクスプレッションを設定します。
見やすいように式の部分だけにしてみます。
if(frame > 1)
{
	myRotate += <<0.001,0.002,0.003>>;
}
if(frame > 1)
1 フレーム目よりアニメーションが進んでいるときに、 以下のコマンドを実行します。
myRotate += <<0.001,0.002,0.003>>;
アトリビュート myRotate にベクトル <<0.001,0.002,0.003>> を加算します。
これによって 1 フレーム毎にインスタンスであるコーンの回転角度が X 方向に 0.001、 Y 方向に 0.002、 Z 方向に 0.003、 づつ増加します。
particleInstancer -e -name $iname -rotation myRotate $pname[1];
インスタンサ−ノード $iname に、 インスタンスの回転をコントロールするアトリビュートとして myRotate を使用するように設定します。
各フラグの意味は以下のとおりです。
-e
エディットモード
-name $iname
設定を変更するインスタンサ−ノードの指定
-rotation myRotate
回転をコントロールするアトリビュートの指定

Tips (particleInstancer のフラグ)

この使用例では、ダイナミックアトリビュートによって回転をコントロールしていますが、 その他のパラメータをコントロールしたい場合には particleInstancer コマンドに以下のようなフラグを使用します。

-position
インスタンスの位置
-scale
インスタンスのスケール
-shear
インスタンスの旋断
-visibility
インスタンスが可視かどうか

練習

練習課題

参考


Prev | Next
Home | Contents
Mail