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

2009年3月13日金曜日

練習 (3)

pointlightsの明滅のエクスプレッションがうまく作れなかったのが気にかかるので家に帰ってもやってみた。

for文は、もしかしたらエクスプレッションでは使えないのかもしれないと思ったので、
新しいやり方を使うことにした。

まずシンプルにして、
frame番号に応じて明滅するという点だけを実現することにした。
ひとつのスポットライトでそれができれば後はコピーでそれをライトの数だけ作ってやればよい。

まず作ったエクスプレッションは、
if (Frame == 1){
pointLight1.visibility=1
}else {
pointLight1.visibility=0
}


がこれもエラー
/ エラー: アトリビュートが見つからないか、変数に '$' が見つかりません: Frame //
// エラー: }else {
//
// エラー: Syntax error //
// エラー: } //
// エラー: Syntax error //
// エラー: } //
// エラー: Syntax error //
// エラー: An execution error occured in the expression expression1. //
// エラー: 編集後のエクスプレッションが無効です。 //

よく見るとframe」とすべきところがFrame」になっていた、大文字と小文字の違いだ。
でもそれだけではエラーがきえない。
色々試しているうちに、各行のステートメントの最後にセミコロンが抜けていたことに気がついた。

MEL ステートメントはすべて末尾にセミコロンを付ける必要があります。多くの場合、これは絶対条件です。 Mel Help)

if (frame == 1){
pointLight1.visibility=1;
}else {
pointLight1.visibility=0;
}

これで正解! 

ちゃんと動作してくれた。
ポイントライトがフレーム1でのみ点灯し他のフレームでは消えている。
あとはこれをポイントライトの数だけつくってやればいい。
フレーム番号=ポイントライトの番号でよい。

ただ、ここでこのエクスプレッションをコピペして、
フレーム番号とライトの番号を1行づつ手で変えていたのでは、
手でキーフレームをうっていくのと大差ない。

そこでエクスプレッションをMelスクリプトで作ることにした。
目的は
if (frame == 1){pointLight1.visibility=1;} else {pointLight1.visibility=0;}
if (frame == 2){pointLight2.visibility=1;} else {pointLight2.visibility=0;}



if (frame == 8){pointLight8.visibility=1;} else {pointLight8.visibility=0;}
というエクスプレッションをつくることなので、
先ほどのエクスプレションをもとに
for文とevalを使うことにした。

for文のエクスプレッション部の{ }を忘れたり、全体をブロックに入れて、変数のスコーピングをわすれたり "\n" を間違えて "/n"と書いたりして、何度もエラーにぶちあたったが、なんとか出来た。

{
for ($i=1; $i<9; $i++)
{$command = ("if (frame == " + $i +"){pointLight" + $i + ".visibility=1;} else {pointLight" +$i+ ".visibility=0;}");
print ($command+ "\n");
}
}


これをスクリプトエディターで実行すればスクリプトエディターのヒストリ欄に
以下のエクスプレッションが表示されるので、これをエクスプレッションエディターにコピペ。

if (frame == 1){pointLight1.visibility=1;} else {pointLight1.visibility=0;}
if (frame == 2){pointLight2.visibility=1;} else {pointLight2.visibility=0;}
if (frame == 3){pointLight3.visibility=1;} else {pointLight3.visibility=0;}
if (frame == 4){pointLight4.visibility=1;} else {pointLight4.visibility=0;}
if (frame == 5){pointLight5.visibility=1;} else {pointLight5.visibility=0;}
if (frame == 6){pointLight6.visibility=1;} else {pointLight6.visibility=0;}
if (frame == 7){pointLight7.visibility=1;} else {pointLight7.visibility=0;}
if (frame == 8){pointLight8.visibility=1;} else {pointLight8.visibility=0;}


ちゃんと動いてくれました!

余談だが、上記Melスクリプトの「else」の前に最初は全角のスペースが入っていたためエクスプレッションエディターでsyntaxエラーが発生していた。
実はMelスクリプト自体はこれでも動作し、上記のようなエクスプレッションが出力される。
しかしスペースが全角のため、エクスプレッションエディターにコピペするとエラーになってしまう。

それはMel内では、文字として処理され、エクスプレッションではコマンドとして処理されるからだろう。
しかしおそらくこれは日本語環境独自の問題ではないかと思う。

それにしても、最初はできないかと思ったが、なんとか粘って動作する物を作ることができてうれしい。 

 

0 件のコメント:

コメントを投稿