スパイラル 1

モデリングの目標

これから 3 回にわたって、卓上電話機についているコイル状のコードのような形を作る MEL スクリプトを作ってゆきましょう。
最終的には、任意のスプラインカーブにそったコイルが作られ、 エクスプレッションによってスプラインカーブを動かすとコイルの部分も、 そのカーブと同じように動くようにしてみます。
今回は手始めに直線的なコイル状の形を作る MEL スクリプトを書いてみましょう。

コイルを作るスクリプト 1

ここでは三角関数(sin, cos)を使って円上にカーブのコントロールポイントを作ってゆく方法によってスクリプトを書いてみます。

  1. 以下のプロシージャを 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;
    	}
    }
    
  2. File → Source Script で makeSpiral1.mel を読み込みます。
  3. 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 のコントロールポイントを追加します。

練習

参考

練習課題


Prev | Next
Home | Contents
Mail