不条理RefPlane。
唐突にスクリプトが振ってくる日曜日の夜、皆様いかがお過ごしでしょうか。
リファレンスプレーンと SRT が一致したヌルが降臨するスクリプト。
JScript です。
var oRefPlanes = Dictionary.GetObject( "RefPlanes" );
var oFuckinNull = ActiveSceneRoot.AddNull( "FuckinPlaneNull" );
oFuckinNull.posx.value = oRefPlanes.NestedObjects( "Transform" ).posx.value;
oFuckinNull.posy.value = oRefPlanes.NestedObjects( "Transform" ).posy.value;
oFuckinNull.posz.value = oRefPlanes.NestedObjects( "Transform" ).posz.value;
oFuckinNull.rotx.value = oRefPlanes.NestedObjects( "Transform" ).rotx.value;
oFuckinNull.roty.value = oRefPlanes.NestedObjects( "Transform" ).roty.value;
oFuckinNull.rotz.value = oRefPlanes.NestedObjects( "Transform" ).rotz.value;
oFuckinNull.sclx.value = oRefPlanes.NestedObjects( "Transform" ).sclx.value;
oFuckinNull.scly.value = oRefPlanes.NestedObjects( "Transform" ).scly.value;
oFuckinNull.sclz.value = oRefPlanes.NestedObjects( "Transform" ).sclz.value;
<過程>
RefPlane オブジェクトというものが存在するであろうことは、オブジェクトをピックして RefPlane を作った時にログされるコマンドを最初の手がかりに SDK ガイドを引けば、なんとなくわかって来ます。とっかかりはある。ここまで2分くらい。
RefPlane オブジェクトがシーンの中のどこにネストされているかは、カンでしかないんですがね、でもだいたいこういうのは、Explorer を Application モードにすりゃ出てくるんです。
シーンに依存せず、どんなシーンでもシステムの一部として必ず存在するオブジェクト、たとえば PlayControl オブジェクトとか ViewportCapture オブジェクトなんかもそうだけど、こういうのは Explorer の Application モードの下のどっかにありますね。 ってことで、こいつがシーングラフのどこに存在するかを確認するまでに、更に1分くらい。
そして、いきなりその名前で Dictionary.GetObject で取得できちまう。 RefPlane とか PlayControl とかって、唯一無二の存在であり、かつどんなシーンにも必ず存在するオブジェクトですから。 キムさんって言ったらフルネームで所属から言わないと見つからないけど、同じキムさんでも将軍様って言ったら所属も階級も言わずただ将軍様と言うだけで判別が付くのと同じです。
このオブジェクトはシーンごとによって変化したりせず、普遍の存在だぜということ自体は XSI をある程度以上使っている人ならすぐわかりますよね。 そしてそういうものは Dictionary.GetObject でいきなり名前言うだけでエラー出ずに安全に取得できるということは、スクリプトをある程度書いている人であればわかります。
ってことで、Dictionary.GetObject で RefPlane オブジェクトを取得し、Logmessage などで表示してみてちゃんと取得できていることを確認するまで更に1分。
oRefPlane の下に Transform プロパティというものがあり、その中に Reference Plane の SRT が格納されているということは、Explorer からクリックしてみて PPG を見ればわかります。 30秒。
・・・・・こっからが問題で。
Logmessage( oRefPlane.Transform.posx.value ) ;
などと書いてもダメなのです。エラー出ちゃうんです。 oRefPlane まで取得できてるから、あとは芋づる方式で取得できるはずなのに、ダメ。 Transform オブジェクトが取得できてないんですね。 このパターン、XSI のスクリプト書いてるとよく出くわします。理由はわかりません。 XSI 様の思し召しです。
Logmessage( oRefPlanes.Properties( "Transform" ).Parameters( "posx" ).value ) ;
でもダメでした。なんでやねん。Transform プロパティそこにあるやないの。アイコンはグラデだから Property のはずで、Properties ( [prpperty name] ) で取得できるはずなのに、できんのか。なんでやねん。
ここで5分くらい使います。
苦し紛れに、NestedObjects を試します。
Logmessage( oRefPlanes.NestedObjects( "Transform" ).posx.value ) ;
あっさり通りました。
Properties が通らなくて NestedObjects が通る理由が、俺にはわかりません。
ともかく、NestedObjects を使えば Transform オブジェクトを取得できて、かつその先の posx などのパラメータにまで届くことがわかりました。
なので書き直したのが、冒頭のスクリプトです。1分とか。
合計9分半だか10分くらいで書いたことになります。
NestedObjects みたいなファックな問題がなければもっと早い。
そしてここまで書いてから、
「 RefPlane.Transform までを最初からゲットできないの???」
という疑問が浮かびます。
ってことで、
var oTransform = Dictionary.GetObject( "RefPlanes.Transform" );
Logmessage( oTransform.posx.value );
こんな風に書いてみたら、通る! なんだよそりゃ。 Dictionary.GetObject の呪文を唱えるとき、 RefPlane でやめずに Transform まで含めれば良かったようです。
ってことで、
var oTransform = Dictionary.GetObject( "RefPlanes.Transform" );
var oFuckinNull = ActiveSceneRoot.AddNull( "FuckinPlaneNull" );
oFuckinNull.posx.value = oTransform.posx.value;
oFuckinNull.posy.value = oTransform.posy.value;
oFuckinNull.posz.value = oTransform.posz.value;
oFuckinNull.rotx.value = oTransform.rotx.value;
oFuckinNull.roty.value = oTransform.roty.value;
oFuckinNull.rotz.value = oTransform.rotz.value;
oFuckinNull.sclx.value = oTransform.sclx.value;
oFuckinNull.scly.value = oTransform.scly.value;
oFuckinNull.sclz.value = oTransform.sclz.value;
このように書き直しました。これで NestedObjects とかいうファッキンなことを書かなくても済みます。
でもこの挙動、納得行きません。
RefPlane まで取得できなたら、それ以下は芋づるで取得できるのが普通なのに、できません。 Transform プロパティをゲットしようとしているのに、その親オブジェクトから Properties を使ってもゲットできないのも、おかしいです。 NestedObjects でだけゲットできるって、おかしいです。 どうにかしなさい嘔吐デスクさん。
こういう不条理と戦うのが、XSI スクリプティングです。
全ては太陽のせいだそうです。
このブログ記事を書くのに20分だか30分。
これから3日くらいかけて、このスクリプトの名前を考えます。
.
| 固定リンク
コメント
すごい勢いでブログが!超有り難いです。
ツイッターでぼそっとつぶやけば誰か適当に返事するかしらーとか思ってたら
ガチ対応していただいて焦ります。
RefPlaneのプロパティ→回転値を地道にコピペしてましたorz
RefPlaneって普段使わなかったのですが、ポリゴンの法線方向もらう時に
コレ以外思いつかなかったのです。
そして移動をRefPlaneにスナップさせるとかで使うんでしょうけど
せっかく法線方向向いてるのに回転を一致させるとかは標準機能で無いのがなんともかんとも。
にしても超サポートしていただいて超感謝です。
ビールを箱で送らないといかんですねー。
投稿: マルプラ | 2011年10月31日 (月) 00時11分
(゚∀゚;) イイヒトダ・・・・
投稿: junki | 2011年10月31日 (月) 01時26分