制御構造(if, switch)

MELにおけるifとswitch

MELにおいて条件・値によってコマンドを実行するかどうかを決めるには、C言語と同じように if, switchなどを使用する。

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
Home | Contents
Mail