« 乳Project。 不要フォルダ無しで新規Project作成なプラグイン。 | トップページ | クラスタから発射。 »

2012年6月29日 (金)

ICE で複数メッシュのマッチング。

久しぶりに XSI Base をのぞいてみたらなにやら危険サイト指定を受けていて焦ったが、どうやらすでに対処は済んでいるように見えました。 ほんとに大丈夫なのかな。 いったいどうしたのだろう。 どっかの阿呆がスパム的な何かを仕込んだのかな。




そんなことはどうでもよくて、ええと、頂点数も頂点の順番も全く同じ2つのメッシュで、片方のオブジェクトの頂点をもう片方に完全にマッチさせる(同一座標にする)には、とかなんとかの話が出ていたので、仕事したくない気分なので練習というか研究というかサボりというか確認のために、真似してやってみました。 このスレッド。

エリックさんは Switch Context を使えという。
やってみたらできた。
うん、簡単だ。

もし Switch Context を使わなければどうなるか、
をやってみたら、こうなった。
というメモですこの記事は。

Array_vs_switchcontext

クリックすると別ウインドウにでかい画像が出ます。


男が2人います。
男1がご主人様です。
男2は奴隷です。
奴隷の頂点は、ご主人様の頂点にぴったり一致して着いて行かねばなりません。

ということにします。



よって、従わせたいのは奴隷である男2の方なので、男2に ICETree を作成します。 その ICETree の中で、


 Get 男1のPointPosition → SwitchContext → 男2に SetPointPosition


とやればできました。 画像の の流れですね。 男1の頂点をぐにぐにいじると、男2の頂点も同期して動きます。 完全に一致して動いているように見えます。 なるほど、これ便利かも。


考えてみれば、ICE を使わずにこれをやろうとすると、Clone ってことになりますかね? でも Clone は頂点を数式的に指定してオフセットさせるとか簡単にできるわけじゃないし、ICE でやるメリットは大きそうな気がしますね。






ここでちょっと話が逸れますが、ツリー中の、この記事の本題とは関係ない部分について先に説明を済ませてしまうと、


前にもやった例の 「オブジェクト自身のSRT にも追従する」 をやりたいので、前半で Matrix と掛け算しています。 これで、頂点でなくオブジェクトを SRT した場合でも完全に追従します。たぶん。

それと、途中 Add を挟んで結果の頂点位置をちょいわきにオフセットさせてます。 これは単に、頂点位置が一致しているとビューポート上で二人の男がぴったり重なって見づらいからというだけです(まさにその頂点位置の一致こそがこのツリーの目的なんですがね)

それと、Aの流れとBの流れを確認するためにいちいちつなぎ直しが発生するのは面倒なので、if ノードで分岐させてます。 true にしている時はこっちの流れのツリーから来たデータがセットされ、false のときはこっち、という、確認を楽にするためのアレです。






本題に戻りますが、SwitchContext というのは魔法のようなノードで、その名の通り Context 違いでつながらないポート同士を無理にでもつなごうとするノード、という認識で合ってますかね? なんとなくそんな風に思っているんですが・・・・・ツッコミお待ちしております。ツッコミ歓迎です。



今回の場合、男1の頂点情報を男2の ICETree に持ち込みたいわけです。 最終的にセットされるのは男2の頂点情報ですから、その情報は男2が所有するものでなくてはなりません。 しかしこの例だと参照する元のデータは男1のものです。 男1のデータはそのままでは男2に入ってくれません。 なのでここになんらかのコンバートが必要になります。 そこで SwitchContext の登場。 こいつが男1の情報を男2のものとして変換してくれるという。  ええと、こんな解釈で合ってますかね? 間違ってたらどうかツッコミお願いします。




ってことで、上手く行っているように見えます。簡単だし、ノードが少なくて良い。




でもまあ、不思議な魔法でつなげているようで気持ち悪いと言えなくもない。 なので違う方法でできねえかなーってちょっといじってみたらできちゃったような気がしたのが、上の画像の の流れです。 男1の頂点位置をいじると男2の頂点も追従します。Bの SwitchContext でやった場合と全く同一の結果を得られます。たぶん。


このAの方法では、上流から流れてきた男1の情報を、Build Array from Set でアレイにブチ込んでいます。このアレイは男2の ICETree 上で構築しているものですから、これは最初から男2が所有する情報ということになります(中身は男1から来ているけれども)。よって下流のノード(男2の情報を要求しているノード)につなぐことができるようになります。 この辺の説明アヤシイかな。。。。


で、そのアレイの中の何番目のものをセットするか、の部分で Get Data を使って男2自身のVertex Index を参照しています。 頂点の順番情報ですね。  「アレイの中の最初の情報は自分自身の最初の頂点にセットするぜ。 アレイの中の10番目の情報は自分自身の10番目の頂点にセットするぜ」 ということですね。 つまり、男1も2も同じ頂点数、同じ頂点番号を持つということが絶対条件になっている ICETree ですね。





ってな解釈で合ってますかね?
分かってないのを見透かされそうで、毎回ビクビクもんですよ。 
ツッコミお願いしますね。



ま、多少解説が怪しくても、結果的にやりたいことが出来ていれば、こうしてメモしておけば後でカンニングできます。

でも、なんにせよ解説を正しく出来ないってことは理解してないってことだ、逆に言えば人に正しく解説できるってことはちゃんと分かってるってことなんだ、という思いがいつもあるので、美しい解説とか厳密に正しい解説を追及すること自体は良いことのはずだ、などと戯言をタレているヒマがあったらこのリテイク修正早くやれよブログ書いてる場合かよ仕事サボんなよ俺。



とかなんとか。





.

|

« 乳Project。 不要フォルダ無しで新規Project作成なプラグイン。 | トップページ | クラスタから発射。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: ICE で複数メッシュのマッチング。:

« 乳Project。 不要フォルダ無しで新規Project作成なプラグイン。 | トップページ | クラスタから発射。 »