制御構造(if, switch)
条件によるコマンドの実行
プログラムを作成する時に、ある条件にしたがってコマンドの実行をするかしないかを決めたり、
この条件の時にはこのコマンド、違う条件の場合には別のコマンドを実行したいと思った場合には、
条件によってコマンドの実行を制御します。
MEL においては、ある条件が満たされる場合だけコマンドを実行するために
if 文や switch 文と呼ばれるものを使用します。
以下の条件式の部分には、前章「制御構造(ループ)」で説明したものをそのまま使用できます。
-  条件式が成り立つ場合に MEL 文を実行
if(条件式)
{
	MEL 文;
}
- 条件式が成り立つ場合には MEL 文 1 を実行し、成り立たない場合に MEL 文 2 を実行
if(条件式)
{
	MEL 文 1;
}
else
{
	MEL 文 2;
}
- 条件式 1 が成り立つ場合に MEL 文 1 を実行、
成り立たなければ条件式 2 を調べて、成り立つ場合は MEL 文 2 を実行、
以下、同様に else if(条件式) が出てくるたびに条件式を調べて
条件式が成り立っていれば MEL 文を実行してゆき、
どの条件も成り立っていなければ最後の else の部分の MEL 文 n を実行します。
if(条件式1)
{
	MEL 文 1;
}
else if(条件式2)
{
	MEL 文 2;
}
.
.    ← else if が並ぶ
.
else
{
	MEL 文 n;
}
-  switch 文は if 文に似ています。
	
 ただし、switch 文では条件式を使わないで、
	変数を値と較べて、実行するコマンドを決定します。
 変数の値を値 1 と較べて等しければ、MEL 文 1 を実行し、
	等しくなければ次に値 2 と較べて等しい場合は MEL 文 2 を実行します。
	以下同様に変数の値が等しくなる値を探して等しくなる部分の MEL 文を実行します。
	もし、すべての値が等しくならない場合は、最後の default の部分の MEL 文 n を実行します。
switch(変数)
{
	case 値1 :
		MEL 文 1;
		break;
	case 値2 :
		MEL 文 2;
		break;
	.
	.
	.
	default :
		MEL 文 n;
		break;
}
変数・値には int, float, string, vector が使用できます。
 ただし、変数と値は同じ型でなくてはなりません。
	例えば、変数に文字列を使った場合は、値も文字列にする必要があります。
if の使用例
if 文の使用例として半径 $rad が 5.0 以下の場合は円上に球を、半径が 5.0 以上の場合はキューブを $num 個並べる MEL スクリプトを作ってみましょう。
- 以下の 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;
	}
}
- スクリプト エディタ の  によって circleObjects1.mel を読み込みます。
- スクリプト エディタ のインプットウインドウに circleObjects1(4, 6) と打ち込んで実行します。
- 半径1の球が半径 4 の円上に 6 個作られます。
	
 ![[circleObjects1(4, 6)の画像]](../mel-ad01/circleObjects1-1.jpg)  
- スクリプト エディタ のインプットウインドウに circleObjects1(6, 7) と打ち込んで実行します。
- 一辺 1 のキューブが半径 6 の円上に 7 個作られます。
	
 ![[circleObjects1(6, 7)の画像]](../mel-ad01/circleObjects1-2.jpg)  
スクリプトの解説
- 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 ++)
- $num 回 for ループを実行します。
	
 以下は 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;
- 次の回転角度を求めます。
 
練習
-  上の circleObjects1.mel を参考にして、circleObjects2.mel を作り半径が 10.0 以上の時はコーン(cone)が作られるようにしてみましょう。
(それ以外は circleObjects1.mel と同じ)
	
 circleObjects2(11, 8) の実行結果
 ![[circleObjects2(11, 8)の画像]](../mel-ad01/circleObjects2.jpg)  
- circleObjects3.mel という MEL スクリプトを switch を使って以下のように作ってみましょう。
	
 circleObjects3(int 作るプリミティブの種類, float プリミティブを並べる円の半径, int プリミティブの個数)
 プリミティブの種類は以下のように番号(int)で指定してください。
	-  1
		
- 球(sphere)
	
-  2
		
- キューブ(nurbsCube)
	
-  3
		
- シリンダー(cylinder)
	
 (使用例)
 以下のように順番に実行してゆくと、実行結果が図のようになってゆくはずです。
	- circleObjects3(1, 3, 4)
		
 半径 1 の球(sphere)が半径 3 の円のまわりに 4 個作られます。
 ![[circleObjects3(1, 3, 4)の画像]](../mel-ad01/circleObjects3-1.jpg)  
- circleObjects3(2, 6, 5)
		
 一辺 1 のキューブ(nurbsCube)が半径 6 の円のまわりに 5 個作られます。
 ![[circleObjects3(2, 6, 5)の画像]](../mel-ad01/circleObjects3-2.jpg)  
- circleObjects3(3, 8, 6)
		
 半径 1、高さ 2 のシリンダー(cylinder)が半径 8 の円のまわりに 6 個作られます。
 ![[circleObjects3(3, 8, 6)の画像]](../mel-ad01/circleObjects3-3.jpg)  
 
 まとめ
- 条件によってコマンドの実行を制御するためには if, switch を使用します。
- 条件式はループ(for, while など)と同じものを使用します。
 練習課題
 参考
Prev | Next
Home
Mail