インスタンスで作った羽根などのオブジェクトを、フィールドによってアニメーションさせてみましょう。
proc string makeFeather()
{
string $file;
string $cname = `curve -d 3 -p 0 0 0 -p 0.2 0.2 0 -p 0.4 0.6 0 -p 0.6 0.4 0 -k 0 -k 0 -k 0 -k 1 -k 1 -k 1`;
if(`about -nt`)
{
$file = "C:/Program Files/AliasWavefront/Maya6.0/brushes/feathers/featherWhite.mel";
}
else if(`about -linux`)
{
$file = "/usr/aw/maya6.0/brushes/feathers/featherWhite.mel";
}
eval ("source \"" + $file + "\"");
string $fname = `getDefaultBrush`;
setAttr ($fname + ".globalScale") 5;
string $tname = `createNode transform`;
string $sname = `createNode stroke -p $tname`;
connectAttr ($fname + ".obr") ($sname + ".brs");
connectAttr ($cname + ".ws") ($sname + ".pcv[0].crv");
return $tname;
}
proc string [] makeParticle(int $num, float $min, float $max)
{
int $i;
string $pos = "";
for($i = 0; $i < $num; $i++)
{
float $x = rand($min, $max);
float $y = rand($min, $max);
float $z = rand($min, $max);
$pos += ("-p " + $x + " " + $y + " " + $z + " ");
}
return `eval ("particle " + $pos)`;
}
global proc makeInstance7()
{
string $pname[] = makeParticle(20, 0.0, 20.0);
string $oname = makeFeather();
select -tgl $pname[0] ;
particleInstancer -addObject -object $oname $pname[1];
addAttr -ln myRotate -dt vectorArray $pname[1];
dynExpression -s
("if(frame == 1)"
+ "{"
+ " $rand = rand(0,180);"
+ " myRotate = <<$rand, $rand, $rand>>;"
+ "}")
-creation $pname[1];
dynExpression -s
("if(frame > 1)"
+ "{"
+ " float $val = particleId % 5.0 / 20000.0 + 0.0001;"
+ " myRotate += <<$val, ($val * 2),($val * 3)>>;"
+ "}")
-runtime $pname[1];
particleInstancer -e -name instancer1 -rotation myRotate $pname[1];
select $pname[0];
string $gname[] = `gravity -magnitude 0.1`;
connectDynamic -f $gname[0] $pname[0];
}
proc string makeFeather()
string $file;
string $cname = `curve -d 3 -p -0 -0 0 -p 0.2 0.2 0 -p 0.4 0.6 0 -p 0.6 0.4 0 -k 0 -k 0 -k 0 -k 1 -k 1 -k 1`;
if(`about -nt`)
{
$file = "C:/Program Files/AliasWavefront/Maya6.0/brushes/feathers/featherWhite.mel";
}
else if(`about -linux`)
{
$file = "/usr/aw/maya6.0/brushes/feathers/featherWhite.mel";
}
eval ("source \"" + $file + "\"");
string $fname = `getDefaultBrush`;
setAttr ($fname + ".globalScale") 5;
string $tname = `createNode transform`;
string $sname = `createNode stroke -p $tname`;
connectAttr ($fname + ".obr") ($sname + ".brs");
connectAttr ($cname + ".ws") ($sname + ".pcv[0].crv");
return $tname;
proc string [] makeParticle(int $num, float $min, float $max)
int $i;
string $pos = "";
for($i = 0; $i < $num; $i++)
float $x = rand($min, $max);
float $y = rand($min, $max);
float $z = rand($min, $max);
$pos += ("-p " + $x + " " + $y + " " + $z + " ");
return `eval ("particle " + $pos)`;
global proc makeInstance7()
string $pname[] = makeParticle(20, 0.0, 20.0);
string $oname = makeFeather();
select -tgl $pname[0] ;
particleInstancer -addObject -object $oname $pname[1];
addAttr -ln myRotate -dt vectorArray $pname[1];
dynExpression -s
("if(frame == 1)"
+ "{"
+ " $rand = rand(0,180);"
+ " myRotate = <<$rand, $rand, $rand>>;"
+ "}")
-creation $pname[1];
dynExpression -s
("if(frame > 1)"
+ "{"
+ " float $val = particleId % 100.0 / 100000.0 + 0.0002;"
+ " myRotate += <<$val, ($val * 2),($val * 3)>>;"
+ "}")
-runtime $pname[1];
particleInstancer -e -name instancer1 -rotation myRotate $pname[1];
select $pname[0];
string $gname[] = `gravity -magnitude 0.1`;
connectDynamic -f $gname[0] $pname[0];
about コマンドは OS を調べるだけでなく、 以下のようなフラグによって様々な情報を調べることができます。
source は他の MEL コマンドと違う特殊なものなので、
使用する場合には注意が必要です。
例えば、makeInstance7.mel の makeFeather プロシージャーの一部を以下のように書き変えると、
if 文で場合分けしているにもかかわらず、
2 つの source コマンドが両方とも実行されてしまいます。
if(`about -nt`)
{
source "C:/Program Files/AliasWavefront/Maya6.0/brushes/feathers/featherWhite.mel";
}
else if(`about -linux`)
{
source "/usr/aw/maya6.0/brushes/feathers/featherWhite.mel";
}
このような場合は、 makeInstance7.mel のように、 読みこむ MEL ファイルをいったん変数に代入しておいて、 eval コマンドによって source を実行する必要があります。