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

2009年5月12日火曜日

二つのオブジェクト間の距離を求める (2)

オブジェクトの座標値を得て、それをベクトルに格納するステップで使うことが出来るもう一つの方法はxformコマンドを使ったものだ。

xformはそのままでは、変換ノードの値を変更するために使われるだけだが
-queryフラグを付けることで、アトリビュートの値を取得することができる


getAttrコマンドが一度に一つのアトリビュートの値を取得するのに対して、
xformコマンドをqueryフラグを付けて使用すれば一つのコマンドで、translationX,Y,Zの3つをベクトルのままで取得できる。


使用するフラグをまとめてみると。

-query(-q):コマンドを参照モードに切り替える。どの値を参照するかは他のフラグで指定する必要がある。(詳細は当ブログ:構文 (2) -q -e フラグについて
-translation(-t):現在地の座標を得る為にしよう。translationの値を得るのでこれを指定する。
-worldSpace(-ws):ワールド空間の値として扱う。


コマンド全体としては以下のようになる。
xform -q -t -ws;

しかしこれを実行すると
// エラー: 照会では 1 つのオブジェクトしか許可されません。 //
となる。


二つ選択しているのだが、照会のステップでは一つづつ行う必要がある。
この解決策はオンラインヘルプの「コマンド構文」の項目で見つけることが出来た。

-query フラグを付記してコマンドを使用する場合、コマンドは指定されたオブジェクトのプロパティの値(他のフラグによって決まる)を返します。
sphere -query -radius "george";
// Result: 10 //


ようするに選択されたアクティブオブジェクトをそのまま使わなくても、オブジェクトの名前を指定してやればすむことだった。

{
string $name[] = `ls -sl`;
xform -q -t -ws $name[0];
}

を実行したところエラーはないので機能しているらしい。
この返り値(ベクトル値)をベクトルに格納し、それを表示するようにしたのが以下の物。

{
string $name[] = `ls -sl`;
vector $obj1Vec = `xform -q -t -ws $name[0]`;
print $obj1Vec;
}

ちゃんと値を表示してくれた。
-3.269747 6.209674 -0.642639

これを二つのオブジェクトに行えるようにした物が以下の通り。

{
string $name[] = `ls -sl`;
vector $obj1Vec = `xform -q -t -ws $name[0]`;
vector $obj2Vec = `xform -q -t -ws $name[1]`;
print $obj1Vec;
print $obj2Vec;
}



--------------------
ステップ4以後は同じなので詳細は省略するが、最終的な物は以下のようになった。

{
string $name[] = `ls -sl`;
vector $obj1Vec = `xform -q -t -ws $name[0]`;
vector $obj2Vec = `xform -q -t -ws $name[1]`;

vector $distVec = $obj1Vec - $obj2Vec;
float $dist = `mag $distVec`;

print ($dist + "\n");
}


先ほどのgetAttrを使った物に比べると行数が非常に少なくなった。

 

0 件のコメント:

コメントを投稿