日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年3月6日金曜日

構文 (1)

ヘルプにあるスクリプトの例をみていると、
print文で、"print"のあとに続く部分にいくつかのバリエーションがある。
ひとつは、
print $int;
もう一つは、( )を使った方法
print ($int + "counts");

( )無しはわかるが、( )付きの場合は一体どういったルールがあるのだろうか、
それについて調べてみた。
調べてみると、エクスプレッションに関して意外な発見があった。

今まで、エクスプレッションとは、リアルタイムにアトリビュートをアニメートする方法だと思っていた。
でも、mayaのヘルプをみるとその定義は間違いだった。

エクスプレッション、演算子および文(maya2009 online Help)
エクスプレッションとは、新しい値を導く一連の値と演算子です。
例:
3 + 5 // => 8
size("Hello") // => 5
size("Hello")*2 // => 10
(10 > 5) // => 1
(5 > 10) // => 0

MEL のコマンド構文でエクスプレッションを使用する場合、エクスプレッションをカッコで囲む必要があります。
また、クォーテーション マークで囲まない文字列を使用することはできません。
string $object = "cake";
setAttr $object.tx 2; // Wrong
setAttr ($object + .tx) 2; // Wrong
setAttr ($object + ".tx") 2; // Right


ここでやっと当初の疑問であった、( ) の使い方が分かった。
( )内にあるのは「エクスプレッション」だったのだ。
( )内には、値と演算子を入れることができる。

if文だと、
if ($x > 5)
 print("It's more than 5!"); <==ここは実行する内容。

というふうに、( )内に条件文がくる。
その条件は、「新しい値を導く一連の値と演算子」というエクスプレッションの定義にあてはまる。

比較演算では、なにも比べるだけで値をどこかに代入しているわけではないので、
「新しい値を導く」というのは間違っているようにみえるが、
表示はされていないが、そこには比較演算の結果が存在している。
それは、"true""False"かという結果である。


ついでに{ }だが、
これはブロック」呼び「エクスプレッションのグループ」のこと。
エクスプレッションを記述する場所には通常一つのエクスプレッションを記述するが、
ブロックは「一つのエクスプレッション」として扱うことができる。
複数行のエクスプレッションをひとつのエクスプレッションとして扱うことができるようになる。


例:
{
print("Hello there.");
print("Glad to meet you.");
print("So long!");
}


(注意事項:ブロック内に文が 1 つしかなくても、ブロック内のすべての文の末尾にセミコロンを付ける必要があります。)

一つのエクスプレッションとして扱われるなら、{ }だけでも、実行できるのではないかと思い
さっそく試してみたら、プロシージャーを使わなくても、{ }だけで問題なく実行できた。



このほか、{ }は、配列に値をまとめて代入する際にもつかわれる。(maya help)
これは、配列の「リテラル」といわれる。
$rip ={1, 2, 3, 4}
$rip ={"blue", "red", "black"}
のように表すことができる。


--------------------
追記;
前回の変数のスコーピングにかんして。
「プロシージャー」でスコーピーングするというよりも「ブロック」でスコーピングするというほうがより正確だ。

グローバル変数を回避する
ブロック内で宣言されたローカル変数はそのブロック内でしか認識されないため、ブロックは変数の適用範囲を制限するのにも便利です。
int $test = 10;
{
int $test = 15;
print($test+"\n");
}
print($test+"\n");
// Result:
15
10


実際、グローバルプロシージャを使うのも注意が必要なようす。
グローバル プロシージャを回避する

0 件のコメント:

コメントを投稿