制御構造(if, switch)

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

プログラムを作成する時に、ある条件にしたがってコマンドの実行をするかしないかを決めたり、 この条件の時にはこのコマンド、違う条件の場合には別のコマンドを実行したいと思った場合には、 条件によってコマンドの実行を制御します。 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. Script Editor の File → Source Script によって circleObjects1.mel を読み込みます。
  3. Script Editor の下のウインドウから circleObjects1(4, 6) と打ち込んで実行します。
  4. 半径1の球が半径4の円上に6個作られます。
    circleObjects1(4, 6)の画像
  5. Script Editor の下のウインドウから 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;
次の回転角度を求めます。

練習

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

まとめ

練習課題

参考


Prev | Next
Home | Contents
Mail