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

2009年5月13日水曜日

eval 再チャレンジ

前回「二つのオブジェクト間の距離を求める (1)」でmagコマンドの返り値を$dist変数へ代入させようとした時、バッククォートと( )を使った方法はうまくいったが、evalコマンドを使った方法ではエラーになり結果を得ることが出来なかった。
float $dist = eval(mag $distVec);

変数の使い方になにか問題があるようなのだが、それが何なのかは今ひとつわからない。


二つのオブジェクト間の距離を求める(3)」では、
distanceDimension -sp $obj1Vec -ep $obj2Vec;
という記述で「引数の解析エラー」が起きた。

このときは、引数を変数のままではなくその値に戻して、コマンドと共にひとつの文字列にしてから、evalを実行することでうまく動作した。


これと同じ方法を上記のmagコマンドのケースにも使ってみることにした。

float $dist = eval("mag " + $distVec)

しかしまだエラーになる。

ひとつづステップを追ってにみていく必要があるようだ。
まず、返り値の文字列がちゃんとしているかどうか確認してみる。

{
vector $distVec = <<1,2,3>>;
$command = "mag <<" + $distVec + ">>";
print $command;
};

結果。
mag <<1>>


何も問題はなさそうなのでevalを使ってみる。
{
vector $distVec = <<1,2,3>>;
$command =eval("mag <<" + $distVec + ">>");
print $command;
}

// エラー: //
// エラー: Syntax error //



何がおかしいのか??


オンラインヘルプで、magコマンドの例をみると
mag <<7,>>;

自分のmagコマンドの値を含めた表記をみると
mag <<1>>

そう、「,」が抜けている!!


ならこうすればどうだろう?

{
vector $distVec = <<1,2,3>>;
$command =eval("mag <<" + $distVec.x + "," + $distVec.y + "," + $distVec.z + ">>");
print $command;
}


大成功!!
3.741657
と値が帰ってきた。


それにしてもなぜevalだけ、こんなに細かく指定してやらなくてはうまく動作するようにならないのか?

何を見落としているのだろう?

 

0 件のコメント:

コメントを投稿