今回はエクスプレッションを利用して、
元になるカーブを動かすと、
コイルも同様に動くようにしてみましょう。
これによって、
元カーブをアニメーションさせることによって、
コイルも自動的にアニメーションさせることができるようになります。
エクスプレッションの式が複雑なので注意してみてください。
global proc makeSpiral7()
{
int $i;
float $numLoops = 10;
string $curv = `curve -d 3 -p 0 0 0 -p 3.0 0 -4.0 -p 7.0 0 -7.0
-p 13.0 0 -5.0 -p 17.0 0 -2.0 -p 19.0 0 0.0
-k 0 -k 0 -k 0 -k 1 -k 2 -k 3 -k 3 -k 3`;
int $numCvs = $numLoops * 4;
float $min = getAttr ($curv + ".min");
float $max = getAttr ($curv + ".max");
string $crv = `curve -degree 3 -p 0 0 0 -k 0 -k 0 -k 0`;
for($i = 0; $i < $numCvs; $i++)
{
curve -append -p ((float)$i) 0 0 $crv ;
}
for($i = 0; $i <= $numCvs; $i++)
{
float $p = (float)$i/$numCvs;
float $angle = $p * $numLoops * 6.28;
float $uoff = sin( $angle );
float $voff = cos( $angle );
if($i == 0 || $i == $numCvs)
{
$uoff = 0.0;
$voff = 0.0;
}
$p = $min + ($max - $min) * $p;
string $poc = `pointOnCurve -constructionHistory 1 -parameter $p $curv`;
string $expcom = ( "vector $nv = <<nnx, nny, nnz>>;\n"
+ "vector $tv = <<ntx, nty, ntz>>;\n"
+ "vector $npv = `cross $nv $tv`;\n"
+ "vector $pv = <<px, py, pz>>;\n"
+ "$vec = $pv + " + $uoff + " * $npv + " + $voff + " * $nv;\n"
+ $crv + ".cp[" + $i + "].xv = $vec.x;\n"
+ $crv + ".cp[" + $i + "].yv = $vec.y;\n"
+ $crv + ".cp[" + $i + "].zv = $vec.z;\n" );
expression -o $poc -s $expcom;
}
}
global proc makeSpiral4()
int $numLoops = 10;
string $curv = `curve -d 3 -p 0 0 0 -p 3.0 0 -4.0 -p 7.0 0 -7.0
-p 13.0 0 -5.0 -p 17.0 0 -2.0 -p 19.0 0 0.0
-k 0 -k 0 -k 0 -k 1 -k 2 -k 3 -k 3 -k 3`;
int $numCvs = $numLoops * 4;
float $min = getAttr ($curv + ".min");
float $max = getAttr ($curv + ".max");
string $crv = `curve -degree 3 -p 0 0 0 -k 0 -k 0 -k 0`;
for($i = 0; $i < $numCvs; $i++)
{
curve -append -p ((float)$i) 0 0 $crv ;
}
for($i = 0; $i <= $numCvs; $i++)
float $p = (float)$i/$numCvs;
float $angle = $p * $numLoops * 6.28;
float $uoff = sin( $angle );
float $voff = cos( $angle );
if($i == 0 || $i == $numCvs)
{
$uoff = 0.0;
$voff = 0.0;
}
$p = $min + ($max - $min) * $p;
string $poc = `pointOnCurve -constructionHistory 1 -parameter $p $curv`;
string $expcom = ( "vector $nv = <<nnx, nny, nnz>>;\n"
+ "vector $tv = <<ntx, nty, ntz>>;\n"
+ "vector $npv = `cross $nv $tv`;\n"
+ "vector $pv = <<px, py, pz>>;\n"
+ "$vec = $pv + " + $uoff + " * $npv + " + $voff + " * $nv;\n"
+ $crv + ".cp[" + $i + "].xv = $vec.x;\n"
+ $crv + ".cp[" + $i + "].yv = $vec.y;\n"
+ $crv + ".cp[" + $i + "].zv = $vec.z;\n" );
"vector $nv = <<nnx, nny, nnz>>;\n"
"vector $tv = <<ntx, nty, ntz>>;\n"
"vector $npv = `cross $nv $tv`;\n"
"vector $pv = <<px, py, pz>>;\n"
"$vec = $pv + " + $uoff + " * $npv + " + $voff + " * $nv;\n"
$crv + ".cp[" + $i + "].xv = $vec.x;\n"
$crv + ".cp[" + $i + "].yv = $vec.y;\n"
$crv + ".cp[" + $i + "].zv = $vec.z;\n" );
expression -o $poc -s $expcom;
makeSpiral7 によって作られるエクスプレッションの式は具体的にどんな式になっているのでしょうか。 それを確かめるためには以下のコマンドを実行してみてください。
実行すると expression1 というエクスプレッションノードに定義されている式が Script Editor のヒストリーウインドウに表示されるはずです。
makeSpiral7 では計 41 個のエクスプレッションが、 他にエクスプレッションを定義していない限り、expression1 〜 expression41という名前で作られているはずなので、 expression1 以外のエクスプレッションノードも同様に表示して較べてみてください。