<- Back

●螺旋カーブを描く


銀河系を作るために書いた螺旋カーブを生成するMELスクリプト。

銀河の形は対数螺旋で、螺旋上の任意の点の中心からの距離"r"は、定数"B"のΘ乗で求められます。



"r"と"B"をそれぞれ変数$r、$Bとするとスクリプトは下記のようになります。

float $B = 2;
float $scale = 0.01;
float $div = 5;

string $cmd = "curve -d 1 ";
float $r, $x, $y, $v;

for($i = 0; $i <= 200; $i++) {

   $v = deg_to_rad($i*$div);
   $r = pow($v, $B);
   $x = $r*cos($v)*$scale;
   $y = $r*sin($v)*$scale;

   $cmd = ($cmd+"-p "+$x+" "+$y+" 0 ");

}

eval($cmd);
このスクリプトを実行すると下のような螺旋カーブが生成されます。



$Bは1以外の正の数とします。
2行目、3行目は螺旋の形状を決めるためのパラメータで、この数値を変えると螺旋の巻き数やCVの間隔等が変わります。
4行目で宣言している文字列はNurbsカーブを生成するコマンドの最初の部分(補足参照)。これに、for文で生成された文字列が追加され、最後のevalコマンドで実行されて、螺旋カーブが作られます。
for文の一行目は"deg_to_rad"で$iをラジアンに変換。2行目でそれを$Bに累乗します。
これでΘが$vのときの中心からの距離$rが決まりますので、この点を(x, y) = ($r, 0)と見なし、これをさらに$v度回転させて、最終的なCVのXY座標を求めています(for文の3、4行目。三角関数の公式を利用)。


<補足>

カーブを生成するMELコマンドは下記のような書式をとります(ただし1次のカーブ)。

curve -d 1 -p x1 y1 z1 -p x2 y2 z2 -p x3 y3 z3 -p x4 y4 z4 ....... -p xn yn zn;

"curve -d 1" に続いて、CVの位置を示す座標をひとつひとつ記述します。


<- Back