スパイラル 1
モデリングの目標
これから 3 回にわたって、卓上電話機についているコイル状のコードのような形を作る MEL スクリプトを作ってゆきましょう。
最終的には、任意のスプラインカーブにそったコイルが作られ、
エクスプレッションによってスプラインカーブを動かすとコイルの部分も、
そのカーブと同じように動くようにしてみます。
今回は手始めに直線的なコイル状の形を作る MEL スクリプトを書いてみましょう。
コイルを作るスクリプト 1
ここでは三角関数(sin, cos)を使って円上にカーブのコントロールポイントを作ってゆく方法によってスクリプトを書いてみます。
- 以下のプロシージャを makeSpiral1.mel と言う名前でファイルに書き込みます。
global proc makeSpiral1()
{
int $i;
int $numLoops = 10;
int $numCvs = $numLoops * 4;
string $crv = `curve -degree 3 -p 0 0 0 -k 0 -k 0 -k 0`;
for( $i = 0; $i <= $numCvs; $i++ )
{
float $x = 0.2 * $i;
float $angle = (float)$i/$numCvs * 6.28 * $numLoops;
float $y = sin($angle);
float $z = cos($angle);
if($i == 0 || $i == $numCvs)
{
$y = 0.0;
$z = 0.0;
}
curve -append -p $x $y $z $crv;
}
}
- で makeSpiral1.mel を読み込みます。
- Script Editor で以下のコマンドを実行します。
makeSpiral1();
スクリプトの解説
global proc makeSpiral1()
- makeSpiral1() というプロシージャーの宣言です。
int $numLoops = 10;
- ループする回数を決める変数の宣言です。
int $numCvs = $numLoops * 4;
- カーブのコントロールポイントの個数を決めて変数 $numLoops に代入しています。
string $crv = `curve -degree 3 -p 0 0 0 -k 0 -k 0 -k 0`;
- NURBS カーブを作って、その名前を $crv に代入しています。
- -degree 3
- NURBS カーブの次数
- -p 0 0 0
- コントロールポイントの座標
- -k 0 -k 0 -k 0
- NURBS カーブのノット
(コントロールポイントの数 + 次数 - 1) 個のノットが必要です。
ここでは、
1 + 3 - 1
で 3 個のノットが必要になります。
for( $i = 0; $i <= $numCvs; $i++ )
- $i を 0 から $numCvs まで $numCvs + 1 回分ループを実行します。
この for 文の中でコイル状にコントロールポイントを作ってゆきます。
float $x = 0.2 * $i;
- コントロールポイントの X 座標を計算しています。
ここでは 0.2 づつ X 座標を進めていますが、
コイルの間隔を変えたければ 0.2 を適当な数値に変更してください。。
float $angle = (float)$i/$numCvs * 6.28 * $numLoops;
- Y, Z 座標を計算するために現在の角度を計算しています。
$i の前の (float) が無いと $i/$numCvs が 0 になってしまうことに注意してください。
6.28 は円周率 3.14 の 2 倍で、円 1 周分の角度を表します。
ここでの角度の単位はラジアンで、6.28 ラジアン が 360度になります。
6.28 * $numLoops で、円を $numLoop 周だけ回転することになります。
float $y = sin($angle);
- Y 座標を sin 関数によって求めます。
float $z = cos($angle);
- Z座標を cos 関数によって求めます。
下図は角度が angle 半径が 1 の場合の sin, cos がどの部分に相当するかを表した図です。
-
if($i == 0 || $i == $numCvs)
{
$y = 0.0;
$z = 0.0;
}
- $i が 0 または $numCvs に等しい時、
つまり最初と最後は特別にY ,Z 座標は 0.0 にしておきます。
curve -append -p $x $y $z $crv;
- カーブ($crv)に $x、$y、$z のコントロールポイントを追加します。
練習
- 上の makeSpiral1.mel を参考にして makeSpiral2.mel を作り、ループの回数・コイルの半径・コイルの長さを引数によって変えることができるようにしてみましょう。
コイルの半径はコントロールポイントの半径なので実際のカーブの半径はそれよりも小さくなることに注意してください。
(プロシージャーの名前と引数)
makeSpiral2(int ループの回数, float コイルの半径, float コイルの長さ)
(使用例)
makeSpiral2(15, 1.5, 15);
(ヒント)
- $x = ... の部分でコイルの長さが 3 番目の引数と同じになるように計算します。
for 文が 1 回実行されるたびに X 軸方向にどれだけ進めばよいかを考えてください。
- $y = ... と $z = ... の部分でコイルの半径が 2 番目の引数と同じになるように計算します。
上にあった sin, cos の図は円の半径が 1 の場合です。
その半径を 2 倍にするにば $y, $z も 2 倍にしてください。
参考
練習課題
Prev | Next
Home | Contents
Mail