MELの応用5 (スパイラル2)

コイルを作る2

今回は与えられたカーブにそってコイルが作られるようにしてみよう。
少し複雑なスクリプトなので、心して見て欲しい。

ベクトル

使用例のスクリプトではベクトルという新しいものが使われているので難しい部分があるかもしれないが、ベクトルを使用するとスクリプトが簡単でわかりやすくなるので覚えておくと良い。
(MELコマンドにはベクトルを引数にとるコマンドも多い)

ベクトルとは簡単にいえば、いくつかの数を並べたものである。
MELでは3つの数(変数でも良い)を<< 1, 2, 3 >>のように<<>>の間に並べる。
このベクトルを使うことによって座標の計算などを簡単に表すことができるようになる。
例えばX, Y, Z座標に2を掛ける計算は以下のようになる。

ベクトルは以下のように矢印で表されることが多い。

[image of vector example]

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

このスクリプトでは最初のコントロールポイントが(0, 0, 0)、最後のコントロールポイントが(X, 0, 0)でコントロールポイントの数が4つのNURBSカーブにそったコイルを作る。

今回のスクリプトは長いので効率良く作るようにしよう。
前回作ったスクリプト(makeSpiral1.mel)と半分くらいは同じなので、それをもとにするのが良いだろう。
似ている行はviのコピーの機能を使ってコピーしてから異なるところだけ書き換えるようにしよう。

  1. 以下のプロシージャをmakeSpiral4.melと言う名前でファイルに書き込む。
    global proc makeSpiral4()
    {
    	int $i;
    	int $numLoops = 10;
    	string $curv = `curve -degree 3 -p 0 0 0 -p 2.0 0 -6.0 -p 8.0 0 -4.0 -p 10.0 0 -0.0 -k 0 -k 0 -k 0 -k 1 -k 1 -k 1`;
    
    	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 $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;
    			$voff = 0;
    		}
    		string $poc = `pointOnCurve -constructionHistory 1 -parameter $p $curv`;
    		float $val[3] = `getAttr ( $poc + ".nn" )`;
    		vector $nv = << $val[0], $val[1], $val[2] >>;
    		float $val[3] = `getAttr ( $poc + ".nt" )`;
    		vector $tv = << $val[0], $val[1], $val[2] >>;
    		vector $npv = `cross $nv $tv`;
    
    		float $px = `getAttr ($poc + ".px")`;
    		float $py = `getAttr ($poc + ".py")`;
    		float $pz = `getAttr ($poc + ".pz")`;
    		vector $pv = << $px, $py, $pz >>;
    
    		$vec = $pv + $uoff * $npv + $voff * $nv;
    		curve -append -p ($vec.x) ($vec.y) ($vec.z) $crv;
    	}
    }
    
  2. File -> Source Script でmakeSpiral4.melを読み込む。
  3. Script Editor で以下のコマンドを実行してみる。
    makeSpiral4();
    [image of makeSpiral4.mel]

練習

参考


Prev | Next
Home | Contents
abe@injapan.net