制御構造(if, switch)

条件によるコマンドの実行

MEL スクリプトを作成していると、ある条件が成り立つときだけに、 計算式や MEL コマンドを実行したいことがあります。
さらに、複数の条件があって、 それぞれの条件が成り立つときに、別の MEL コマンドを実行するということもあります。
MEL においては、ある条件が満たされる場合だけコマンドを実行するために if 文や switch 文と呼ばれるものを使用します。

以下の条件式の部分には、前章「制御構造(ループ)」で説明したものをそのまま使用できます。

if の使用例

if 文の使用例として半径 $rad が 5.0 以下の場合は円上に球体を、半径が 5.0 以上の場合はキューブを $num 個並べる MEL スクリプトを作ってみましょう。

  1. 以下の MEL スクリプトを circleObjects1.mel という名前で作ります。
    global proc circleObjects1(float $rad, int $num)
    {
    	int $i;
    	float $r = 0.0;
    	float $add = 360.0 / $num;
    
    	for($i = 0; $i < $num; $i ++)
    	{
    		if($rad <= 5.0)
    		{
    			sphere;
    		}
    		else
    		{
    			nurbsCube;
    		}
    		move $rad 0 0;
    		rotate -ws -p 0 0 0 0 $r 0;
    		$r += $add;
    	}
    }
    
  2. スクリプト エディタ の ファイル → ソーススクリプト によって circleObjects1.mel を読み込みます。
  3. スクリプト エディタ のインプットウインドウに circleObjects1(4, 6) と打ち込んで実行します。
  4. 半径1の球体が半径 4 の円上に 6 個作られます。
    [circleObjects1(4, 6)の画像]
  5. スクリプト エディタ のインプットウインドウに circleObjects1(6, 7) と打ち込んで実行します。
  6. 一辺 1 のキューブが半径 6 の円上に 7 個作られます。
    [circleObjects1(6, 7)の画像]

スクリプトの解説

global proc circleObjects1(float $rad, int $num)
引数として $rad (円の半径)と $num (プリミティブの個数)をとるプロシージャの宣言です。
int $i;
for 文が、何度実行されたかをかぞえるカウンタとして使うための変数です。
float $r = 0.0;
球体を回転させるための角度を入れておく変数です。
最初は、回転させないので 0.0 を代入しておきます。
float $add = 360.0 / $num;
角度の増分を入れておくための変数です。
360 度(円の 1 周の角度)を球体の個数($num)で除算しています。
for($i = 0; $i < $num; $i ++)
$numfor ループを実行します。
以下は、for ループ内の処理になります。
if($rad <= 5.0)
{
	sphere;
}
else
{
	nurbsCube;
}
もし $rad が 5.0 以下なら sphere を実行し、 それ以外(else)の場合、つまり $rad が 5.0 以上なら nurbsCube を実行します。
move $rad 0 0;
球体を($rad, 0, 0)の位置に移動します。
rotate -ws -p 0 0 0 0 $r 0;
移動された球体をワールド空間内で(0, 0, 0)を中心として Y 軸周りに $r だけ回転させます
各フラグの意味は、以下の通りです。
-ws
球体をワールド空間で回転させます。
-p 0 0 0
回転の中心を(0, 0, 0)にします。
0 $r 0
X 軸周りに 0 度、Y 軸周りに $r 度、Z 軸周りに 0 度回転させます。
$r += $add;
次の回転角度を求めます。

MEL スクリプトの書き方

MEL スクリプトをはじめとして、プログラミング言語のプログラミングを行うときには、 プログラムの書き方が重要です。
どんな書き方でも、 結果的に動作するプログラムが出来上がればよいと思っていては、 いつまでたってもプログラミングの腕が上達しません。
見たときに、わかりやすく、きれいなプログラムを書くことが上達の近道です。 見た目がきれいなプログラムは、 自然に、エラーになりにくく、エラーがあっても見つけやすいものになります。 また、何を実行しているかが理解しやすいプログラムになります。
最低限、以下のようなことを守って MEL スクリプトを作りましょう。

練習

  1. 上の circleObjects1.mel を参考にして、circleObjects2.mel を作り半径が 10.0 以上の時はコーン(cone)が作られるようにしてみましょう。 (それ以外は circleObjects1.mel と同じ)
    circleObjects2(11, 8) の実行結果
    [circleObjects2(11, 8)の画像]
  2. circleObjects3.mel という MEL スクリプトを switch を使って以下のように作ってみましょう。
    circleObjects3(int 作るプリミティブの種類, float プリミティブを並べる円の半径, int プリミティブの個数)
    プリミティブの種類は、以下のように番号(int)で指定してください。
    1
    球体(sphere)
    2
    キューブ(nurbsCube)
    3
    シリンダー(cylinder)
    (使用例)
    以下のように順番に実行してゆくと、実行結果が図のようになってゆくはずです。

まとめ

練習課題

参考


Prev | Next
Home | Contents
Mail