制御構造(ループ)
MELにおける繰り返しの実行
MELにおいて同じコマンドを繰り返して実行するときには、C言語と同じように for, while, do whileなどを使用する。
- for, while, do whileの文法はC言語とほぼ同じである。
最期のfor( in )は、リストの中の要素を一つづつ変数に代入してコマンドを実行するものである。
for(初期化 ; 条件式 ; 式)
{
コマンド;
.
.
}
while(条件式)
{
コマンド;
.
.
}
do
{
コマンド;
.
.
} while(条件式);
for( 変数 in リスト )
{
コマンド;
.
.
}
- 条件式もC言語とほぼ同じものが使える。
== != < > <= >= && || ( )
ループの使用例
球を原点(0, 0, 0)を中心に半径$radの円上に$num個並べるMELスクリプトをforを使って作ってみよう。
- 以下のMELスクリプトをcircleSphere1.melという名前で作る。
global proc circleSphere1(float $rad, int $num)
{
int $i;
float $r = 0.0;
float $add = 360.0 / $num;
for($i = 0; $i < $num; $i++)
{
sphere;
move $rad 0 0;
rotate -ws -p 0 0 0 0 $r 0;
$r += $add;
}
}
- Script Editorの によってcircleSphere1.melを読み込む。
- Script EditorからcircleSphere1(5, 6)と打ち込んで実行する。
- 半径1の球が半径5の円上に6個作られる。
スクリプトの解説
global proc circleSphere1(float $rad, int $num)
- float の引数($rad)とintの引数($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ループ内の処理。
sphere;
- NURBSの球を作る。
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;
- 次の回転角度を求める。
練習
- 上のcircleSphere1.melを参考にしてcircleSphere2.melというMELスクリプトを作り、球の半径も引数で変えることができるようにしてみよう。
引数の1番目に球の半径(float)を追加すること。
例えばcircleSphere2(3, 5, 6)を実行すると半径3の球が半径5の円上に6個作られる。
- 上のcircleSphere2.melを参考にしてcircleSphere3.melというMELスクリプトを作り、 球が2重に並ぶようにしてみよう。
ただし、内側と外側の球が接するように並ぶようにし、
内側の球が並ぶ円の半径が2番目の引数になるようにすること。
すべての球は同じ半径で良い。
例えば、circleSphere3(2, 5, 6)の結果は以下の図のようになる。
まとめ
- MELにおけるループはC言語と同じものを使うことができる。
ただし、forにはMEL独自のものがある。
- 条件式もC言語と同じである。
参考
Prev | Next
Home | Contents
abe@injapan.net