制御構造(if, switch)
MELにおけるifとswitch
MELにおいて条件・値によってコマンドを実行するかどうかを決めるには、C言語と同じように if, switchなどを使用する。
- ifの文法はC言語とほぼ同じである。
if(条件式)
{
MELコマンド;
.
.
}
if(条件式)
{
MELコマンド;
.
.
}
else
{
MELコマンド;
.
.
}
if(条件式1)
{
MELコマンド;
.
.
}
else if(条件式2)
{
MELコマンド;
.
.
}
.
.
.
else
{
MELコマンド;
.
.
}
- if文の条件式もC言語とほぼ同じものが使える。
== != < > <= >= && || ( )
- $x < 3
- $xが3より大きいときに正しい
- $y == 5 && $z == 7
- $yが5に等しく、かつ$zが7に等しいときに正しい
- $s != "test"
- $sが文字列testに等しくないときに正しい
- switchの文法もC言語とほぼ同じである。
ただし、switchの値1、値2、...の部分はC言語と違ってintの他にfloat, string, vectorなどを使うことができる。
switch(変数)
{
case 値1 :
MELコマンド;
.
.
break;
case 値2 :
MELコマンド;
.
.
break;
.
.
.
default :
MELコマンド;
.
.
break;
}
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;
}
}
- Script Editorの によってcircleObjects1.melを読み込む。
- Script Editorの下のウインドウからcircleObjects1(4, 6)と打ち込んで実行する。
- 半径1の球が半径4の円上に6個作られる。
- Script Editorの下のウインドウからcircleObjects1(6, 7)と打ち込んで実行する。
- 一辺1のキューブが半径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 ++)
- $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)の実行結果
- circleObjects3.melというMELスクリプトをswitchを使って以下のように作ってみよう。
circleObjects3(作るプリミティブの種類, プリミティブを並べる円の半径, プリミティブの個数)
プリミティブの種類は以下のように番号(int)で指定する。
- 1
- 球(sphere)
- 2
- キューブ(nurbsCube)
- 3
- シリンダー(cylinder)
(使用例)
以下のように順番に実行してゆくと図のようになってゆく。
- circleObjects3(1, 3, 4)
半径1の球(sphere)が半径3の円のまわりに4個作られる。
- circleObjects3(2, 6, 5)
一辺1のキューブ(nurbsCube)が半径6の円のまわりに5個作られる。
- circleObjects3(3, 8, 6)
半径1、高さ2のシリンダー(cylinder)が半径8の円のまわりに6個作られる。
まとめ
- MELにおけるif, switchはC言語と同じものを使うことができる。
- 条件式もC言語と同じである。
参考
Prev | Next
Home | Contents
abe@injapan.net