パーティクルのインスタンスを使用することによって、
パーティクルの各点にオブジェクトを配置して、
パーティクルの動きとオブジェクトの動きを連動することができます。
インスタンス化されたオブジェクトは、
移動・回転・スケールなどを個別にコントロールすることができます。
そのためには、パーティクルにアトリビュートを追加して、
追加されたアトリビュートをエクスプレッションなどでアニメーションさせてやります。
コーンをインスタンス化し、各コーンエクスプレッションによって回転させるプロシージャーを作ってみましょう。
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];
}
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];
if(frame == 1)
{
float $rand = rand(0,180);
myRotate = <<$rand, $rand, $rand>>;
}
if(frame == 1)
float $rand = rand(0,180);
myRotate = <<$rand, $rand, $rand>>;
dynExpression
-s ("if(frame > 1)"
+ "{"
+ " myRotate += <<0.001,0.002,0.003>>;"
+ "}")
-runtime $pname[1];
if(frame > 1)
{
myRotate += <<0.001,0.002,0.003>>;
}
if(frame > 1)
myRotate += <<0.001,0.002,0.003>>;
particleInstancer -e -name $iname -rotation myRotate $pname[1];
この使用例では、ダイナミックアトリビュートによって回転をコントロールしていますが、 その他のパラメータをコントロールしたい場合には particleInstancer コマンドに以下のようなフラグを使用します。