制御構造(if, switch)
条件によるコマンドの実行
MEL スクリプトを作成していると、ある条件が成り立つときだけに、
計算式や MEL コマンドを実行したいことがあります。
さらに、複数の条件があって、
それぞれの条件が成り立つときに、別の MEL コマンドを実行するということもあります。
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(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;
- 次の回転角度を求めます。
MEL スクリプトの書き方
MEL スクリプトをはじめとして、プログラミング言語のプログラミングを行うときには、
プログラムの書き方が重要です。
どんな書き方でも、
結果的に動作するプログラムが出来上がればよいと思っていては、
いつまでたってもプログラミングの腕が上達しません。
見たときに、わかりやすく、きれいなプログラムを書くことが上達の近道です。
見た目がきれいなプログラムは、
自然に、エラーになりにくく、エラーがあっても見つけやすいものになります。
また、何を実行しているかが理解しやすいプログラムになります。
最低限、以下のようなことを守って MEL スクリプトを作りましょう。
- ブロックがあったら、インデントを必ず付けてください。
{ があったら、その後は行頭にスペース・タブを追加します。
反対に、} があれば、追加したスペース・タブを取ります。
これによって、どこからどこまでがブロックの範囲かわかりやすくなります。
よく使われるインデントは、半角スペース 4 つ、
または、タブ 1 つです。
- 変数名・プロシージャ名はわかりやすく、他と紛らわしくない名前にします。
変数名は、何が代入されているか、
プロシージャ名は、何の処理をするかが、名前から推測できるのが理想です。
特に、外部変数やコントロールの名前など、
MEL スクリプトのいたるところで使われそうな名前は、
なるべく長い説明的な名前にします。
プロシージャや、制御構造のブロックの中だけで使われる名前は、
短めの名前でもかまいません。
ループのカウンタなど、習慣的に名前が決まっているものなどは、
その習慣に従います。
練習
- 上の circleObjects1.mel を参考にして、circleObjects2.mel を作り半径が 10.0 以上の時はコーン(cone)が作られるようにしてみましょう。
(それ以外は circleObjects1.mel と同じ)
circleObjects2(11, 8) の実行結果
- circleObjects3.mel という MEL スクリプトを switch を使って以下のように作ってみましょう。
circleObjects3(int 作るプリミティブの種類, float プリミティブを並べる円の半径, int プリミティブの個数)
プリミティブの種類は、以下のように番号(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 個作られます。
まとめ
- 条件によってコマンドの実行を制御するためには if, switch を使用します。
- 条件式はループ(for, while など)と同じものを使用します。
練習課題
参考
Prev | Next
Home | Contents
Mail