« 2008年5月 | トップページ | 2008年7月 »

2008年6月

2008年6月30日 (月)

なっぢ。



XSI Base で i3DTutorials の新しいのを紹介していたので久しぶりに行ってみると、いつのまにかチュートリアルビデオが増えてた。ジャックさん頑張ってるな。
http://i3dtutorials.com/


で、何気なく見たチュートリアルビデオに Nudge な話題が・・・・。
オブジェクト選んで、もしくはコンポーネントを選んで、


  Shift + PageUp
  Shift + PageDown
  Shift + Home
  Shift + End


げげっ。こんなことできたんですか。いつからですか。知らなかったよっ。
スクリーンスペースで1ピクセルずつ移動させるそうで、つまり1回の移動距離はモニタの解像度と XSI 上でのズーム具合に依存するわけですね。引きで実行すればいっぱい動くし、寄りで実行すれば少しだけ動くということですね。 なんだ、こんな便利なことできるんなら早く言ってくださいよ Softimage さん。 あ、マニュアルにちゃんと書いてますね。。。。。 Orz


正直、i3D のチュートリアルは初心者向け過ぎるというか、マニュアルに書いてあることばかりのように思えるので(Digital Tutors と同じレベルか)あんまり買う気はしないんだけど、たまにこういう発見があるので、さんざん文句言いながらすいません、いいところだけ利用させてもらいますジャックさん。いつかすげーの出してくれたら買います。



そういえば 3DMastermind の Character In Motion は張りきって買ったんだけど、まだ全部見てないんだよな・・・。 一部のクリップが再生できない不具合もあるし、内容も思っていたよりは初心者向けで、テンション下降中。。。。 まずは最後まで見ないとな。。。。




| | コメント (0) | トラックバック (0)

2008年6月27日 (金)

えくすぽインポ。 えくすぽとインポなプラグイン。



Model をファイルに書き出す時、XSI 標準の Export > Model では、同時に1つしか吐き出せない。
emdl ファイルを読み込む時、XSI 標準の Import> Model では、同時に1つしか読み込めない。


ゴルァ。





えくすぽインポ。 えくすぽとインポなプラグイン。
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html


Expoimpo_expo_ppg

もともとは、1年か2年前に、Particle Type の複製のために作ったという。
Particle Type って、複製できないですよね? ね? ね? できないと言ってくれ。
なので、Particle Cloud を Model にぶら下げて一度書き出し、もう一回読み込み直すと Particle Type も新規で作られるという。

また、Model を(Model以外でもそうですが)複製したときって、マテリアルは常に共有状態になりますよね? 大抵の時はこれで都合がいいんですが、たまにマテリアルは新規にして欲しいことがある。例えば同じキャラなんだけど色違いにしたいとか。 そういうときはやはり一度書き出し、もう一回読み込み直すと、マテリアルは(同じ中身だけど)新規マテリアルになっている。
ちなみに Dulplicate オプションには、マテリアルを新規にするかどうか決める項目が無いですよね?  Property Sets は Copy と Ignore しかなくて、Ignore にすると共有どころかマテリアルが割り当てられてない状態になるし。 ね? そうですよね? ね? そうだと言ってくれ。 ま、オプションがあったとしてもそのたびにいじりたくないし。

あと、大量の Model があってイッキにファイルに書き出したいこともよくあったんだよな。でも XSI 標準の書き出しだと、一度に1つしかできないんですね。



そんなこんなで昔から単機能スクリプトとしてよく使っていたんだけど、最近たまたま某巨大XSIフォーラムで Model の書き出しと読み込みをイッキにやりたいという人がいて、せっかくなので単機能スクリプトたちの PPG などを整備して、このプラグインにまとめ直したという。




・・・・今思いついたんだが、1つだけ Model をインポートするときにも、マテリアルとかが共有されて欲しいこともあるな。つまり、インポートしたんだけども、Ctrl + D で複製したのと同じ状態にするということ。
これはえくすぽインポの読み込みで Share All オプションをオンにすればできるけど、このツールの場合そのフォルダの中にある emdl を全部読み込んじゃうからなあ。 これ、標準の機能でできないですよね? ファイルメニューから Import > Model ってやったときは、常に共有されないですよね? この挙動を決められるオプションはどこにもないですよね? ね? ね? ないと言ってくれ。

ってことで、1つだけ読み込むときに共有をオンにする機能も、いずれ付けよう。いずれ。



| | コメント (0) | トラックバック (0)

2008年6月25日 (水)

アオリ補正。アオリ補正なプラグイン。



ゴルァ。



アオリ補正。アオリ補正なプラグイン。
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html


Aorihosei_ppg

先日のアオリ補正の記事で書いた、アオリ補正作業の補助ツール。



メニューからアオリ補正。を選ぶと上の画像の PPG が出現。
カメラを選んだ状態で PPG のボタン押すと、DisplayInfo を使ってビューポート上に Optical Center Shift を表示。


・カメラを自動で水平にしてくれるから、少しラク。

・ビューポート上で Center Shift を操作できるから、少しラク。

・カメラのPPGから操作するとすごく敏感に反応していじりづらいけど、DisplayInfo のパラメータをドラッグすると反応が若干鈍感になるようだから、少しラク。

・その後カメラをどう動かそうが永遠に垂直線の垂直を保ちたいという人には、水平ロックのエクスプレッションを作ってくれるので、少しラク。


少しのラクがいっぱい積もると、少しラク。



| | コメント (0) | トラックバック (0)

2008年6月24日 (火)

墓場にのびボーンを埋葬。



スクリプトの墓場 Graveyardのびボーンを埋葬。
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html

1: ボーン1本だけ選択
2: オブジェクト1を選択
3: オブジェクト2を選択
4: のびボーンを実行
5: オブジェクト1または2を動かすと、骨のびのび。




よくある、どこまでも伸びるボーンを作るスクリプト。世の中にはもっといいものがあるんだろうけど、検索するのもめんどくさいし、まあ今はこれで十分だ的な。

やってることは、bone の length パラメータに ctr_dist エクスプレッションを仕込んでいるだけ(1と2の距離= bone の length)。

リグ作ってるときにたまに使っています。筋肉系、というほどの本格的なものはやったことないけど、間接の近くにのびるボーンを仕込んでなるべく潰れを回避しようとしたり。そういう補助ボーン的な使い方にしか使ってないかな。


書きっぱなしの投げやりなスクリプトにしちゃってごめんね。
いつか晴れて立派なツールになるといいね。
それまで、墓場で眠っててね。
南無。



| | コメント (0) | トラックバック (0)

2008年6月23日 (月)

アオリ補正。










アオリ補正の作業を少し楽にできないかなーと思ってツー ルを作っているんだけど、そのアオリ補正の話を少し。




先細りになっていない。垂直線はどこまでも垂直。


こういう絵、CGで簡単に作れますか。
あるいは、普通に写真撮れますか。


建築の写真やCG、あるいはアニメの背景画などによくあるパース。アオっているにも関わらず、先細りにならない絵。

先細りにならないということは、もともと地面に対して垂直なラインが、画面上で実際に垂直になっているということになります。









ロングレンズ(長玉)。 先細りは弱まったけど、そもそもこーゆー絵が欲しいのではない。

先細りにしないためにはロングレンズを使う=狭い視野角 (FOV)にするのもひとつの手ですが、そもそもそれは意図した絵と違う。ロングレンズの圧縮されたパースが欲しいわけではないっす。欲しいパースを得る ためにはある程度以上ワイドのレンズを使う必要があるっす。






アオリ補正しないと永遠に先細りのまま。

で、最初の画像の感じにしようと思って XSI上でレンズの視野角(FOV) いじったり、SキーZキーなどを総動員してカメラ位置や向きをいろいろいじっても、左の画像のような感じになるだけで、永遠に上の画像のパースにはならな いはずです。アオリ補正しないと無理っす。










新築分譲マンション の広告写真など建築パースの世界ではおそらく、先細りになると見栄えが悪いと認識されているのかな。まあそりゃそうだよな。  先細りを避けるにはアオら なければいい。でもアオらないと写真に建物全体がおさまらない。アオらずに建物全体をおさめるためにはカメラ位置を引くしかない。でも撮影場所の物理的な 制約で引きが取れない(後ろに下がれない)。 建物全体を入れないわけにはいかないから、引きが取れないならアオるしかない。アオると先細りになる。先細 りはヤダ。以下永久ループ。


なのでこういう時にアオリ補正をするわけで。


アニメの背景画の場合は、もちろん建築の例と同じく見栄えの問題もあるだろうけど、おそらく最大の要因は、ヨコ長やタテ長に描いた絵を2D的にタテヨコに 引くことに よってカメラの動きを表現する、いわゆる 2D-PAN を多用せざるを得ないからでしょう。 先細り的パースが付いている絵で 2D-PAN したらとても不自然な画面になりやすいですな。 画面の端に行くほど傾きは強くなるので、ある程度以上ワイドレンズな絵を真面目に描いたら、ヨコ長の端っ この方はとんでもなく傾いた線が出現するわけで、んなもん 2D-PAN したらヒッチコックさんやキューブリックさんが喜びそうな絵になっちまう。 ってことでワイドレンズにしつつも先細りパースを殺した絵を描くわけですね。 結果的にアオリ補正と似たようなことになってますね。たぶん。






じゃあ具体的にどう すればいいのか。

まず、被写体の垂直な線が写真上でも垂直になるための大前提として、
カメラがティルト(rot x)して はいけない。

つまりアオリでもフカンでもなく、カメラが地面と水平でなければいけない。
別の言い方をすると、「レンズとフィルム面を結ぶ直線」 と 「地面に対して垂直な線」  が、直角でなければいけない。
わかりにくいな。 要は、見上げも せず見下ろしもせず、まっすぐ前を見た状態ってことですな。

今手元にカメラを持っている人は、ファインダをのぞいてみればわかりますね。例えばビルのタテの線とか窓枠のタテの線など「地面に対して垂直」な線は、カ メラをまっすぐ水平に構えれば、レンズの焦点距離(視野角)に関係なく、また、カメラをどの方向に向けていても(上下は固定のまま)、永遠に垂直ですね。   レンズのディストーションはまた別の問題としてね。


あるいは XSI のカメラでももちろん同じなので、やってみればわかりますね。 右の画像。

cube でも取り出して適当に配置し、カメラを完全に水平にする。

こうすると、どんなにワイドレンズでも(FOV値が大きくても)、水平方向のどの方向に向いていても cube のタテの線は永遠に画面の中で垂直です。

しつこいようですが上下はもちろん固定ですよ。カメラ が水平でなければいけないので。



でもこうすると当然、ビルなどのタテに長い被写体は全体が写真に入らなくなったりするわけで。
そこでレンズの上下位置をシフトさせて、レンズとフィルムを結ぶ直線 をナナメにしてやると、被写体の垂直な線は垂直なまま、上の方まで画角に入ってくるわけですね。 レンズの上下位置が変わっても、レンズ面そのものは地面 に対して垂直を保っているので、被写体の垂直 線も変わらないまま写るわけですね。


実際の機材の話だと、大判カメラを使ってレンズとフィルム面を平行にずらす(シフトする)こと によって実現しますね。蛇腹が付いたカメラのレンズ面を上に上げる操作ですね。 これは ライズ と呼ばれていますね。

実は大判カメラはいじったことがないので本やインターネットで勉強した知識だけで言ってますが・・・。







スヴァらしくわかりやすい説明がありました。
大判カメラ写真教室。
http://www.komamura.co.jp/lecture/index.html


ウィキペディアの説明も写真入りでわかりやすいですね。
http://ja.wikipedia.org/wiki/%E3%81%82%E3%81%8A%E3%82%8A_%28%E5%86%99%E7%9C%9F%29


大判カメラじゃなくても、ベローズユニットってのを使えば 35mm一眼でもできるのかな。
http://zeiss.hp.infoseek.co.jp/na-bellows.htm





で、XSI でこれをやりましょう。




右の画像は上の3枚目と同じです。
アオリによって先細りパースになっている状態。
ここからスタートします。





アオリのカメラ。これを水平にしてやる。

このカメラをヨコから見ると、こうなっています。
アオってます。

カメラを水平にしないと被写体の垂直線が垂直に写らないので、まずはこれを修正。






Camera と Interest が同じ Y ポジション=水平

修正って言っても、超簡単。 Camera 自身の Y ポジションの値をコピーして、Interest の Y ポジションにペーストしてやるだけ。 これで、カメラ位置は変えないまま、世界に対して水平なカメラになる。

もし Interest の無いカメラであれば、rot x をゼロにすればよろし。






垂直になったのはいいが、建物が入ってなきゃ意味ねえぞゴルァ。

そのカメラから見た画像。

カメラが水平になったおかげで、建物の垂直線は完璧に垂直になった。

でもこのままでは建物が画角におさまっていない。
今度はこれを修正しないと意味ない。






これじゃ意味ねえんだよゴルァ

← カメラを水平に保ったまま位置をまるごと上にずらすんじゃダ メっすよ。 垂直は保たれてるけど、これじゃアオリの絵にならない。意味ないっす。







そこで、Camera と Interest の位置は変えないまま、レンズ面を上へシフト=ライズします。

カメラのプロパティの2つめのタブで Projection Plane をオンにして、一番下の Optical Center Shift の Y をいじってやりましょう。画角の中に入ってくるものがどんどんずれていきます。 

Optical Center Shift = 直訳すれば 「光学系の中心をずらす。」 うーむ。直訳が一番わかりやすい。


ためしに日本語 XSI でどうなってるのか見てみたら「オ プティカルセンター変動」。 うーむ、なんとも中途半端というか違和感のある日本語だ。相変わらずですねこのローカライズぶりは。この部分 のヘルプの 日本語記述も何やら怪しいぞ。わかって書いてますか翻訳者のあなた。そう、あなたです。 けけけけ。


Optical Center Shift はちょっといじっただけで大幅に変わるんだよねえ。 Shift 押しながらスライダをドラッグするか、数値を手打ちで入れましょう。






アオリ補正完了。 垂直線は完璧に垂直のまま、建物はちゃんと画面におさまっている。

建物が画面におさまるまでライズしてやれば、めでたく垂直線を 保った絵の出来上がりっす。アオリ補正っす。

レンズ面を平行にずらしているわけであって、カメラを上下に振っているのではないことに注意ですね。また、カメラ自身の位置も変わっていません。

ワイドなレンズで貼ったカメラプロジェクションマップのUVを見たことがある人ならばわかるでしょうが、あの永遠に広がるパースの一部分をカメラの画角で 切り取ってのぞいている状態と同じですね。切り取る位置を Optical Center Shift の X と Y をずらして移動させて行く、というのと同じだと思います。






完璧な垂直は違和感あるので、若干先細りを復活させて、一応完成。

でも、完全にティルト無し=完璧な垂直 は 少し違和感が強い気がするな。少しはナナメ線が出てきた方が落ち着くと思う。
ってことで若干先細りを復活させる。

ま、これは絵作りの意図によるので、唯一の正解はもちろんありません。








建築パースCGな人は、これがないと話にならないんじゃないんですかね? どうなんでしょう。



・・・・と、色々とエラソーに書きましたが実は、昔はアオリ補正の概念を知らず、垂直線がパースで先細りし過ぎることに不満を持ちつつもCGのカメラって ものはそういうもんだと勝手に思い込んで作っていました。 Max だったかな、このアオリ補正の機能があると誰かに聞いて、いいなあと思っていました。 その後 Optical Center Shift を知り、いじり始めた頃はこれで調整できる! と思っていたけどしくみをちゃんと理解していなかったので、当てずっぽうでした。 カメラや写真のことを勉 強していくうちに、だんだんわかってきた感じであります。


で、そんなときに XSI Base のこのスレッドに出会いまして。
http://www.xsibase.com/forum/index.php?board=6;action=display;threadid=27539

ああ、やっぱり Octical Center Shift するのね。なーんだ、簡単にできるじゃん、とわかり、概念もまさに写真のそれと同じだったので、ようやく頭の中でつながったのでした。そんなに昔のことで はありませ ん。このスレッドを立ててくれたどこぞの外人さんに感謝します。



-----------------------------------

本物のカメラや写真やフィルムをいじらずにCGのカメラばかりいじっていると、やっぱりダメなんだよなあ。俺もCGから入ったからなあ。 でも大 判カメラはなかなかいじる機会がないんじゃないの。いくらするんだろう。 デジタルなら、やはりデチイチにベローズかますことになるんだろうか。誰かやっ たことある人教えてください。



で、上記一連のアオリ補正作業を少し楽にしようとして(ま、もともと大した作業じゃないので効果は薄いけど)、スクリプトを書いてました。ほぼできあが り。ちょっとだけ工数が減る。ちょっとだけね。 そのうちここに載せます。たぶん。









| | コメント (0) | トラックバック (0)

2008年6月21日 (土)

乳Model。 Model を作るプラグイン。

俺様は XSI 標準の New Model の挙動が気に入らねぇんだよゴルァ。



乳Model。 Model を作るプラグイン。
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html

Nyumodel_menu



昔から気に入らなかったんだよね。
特にワールド原点じゃないところに作成するのが。
リグの可動パーツとかアニメーション用の親として仕込むわけじゃなし、
平均化した場所に作ってどうすんのよ。

それにねえ、選んだものは全部新規 Model にぶら下げてよね。
階層が違うとエラーを出すじゃない。
なんでこういう仕様にしたんだろうねえ。
ユーザがこうしろ、って言ってるんだから素直にそうしなさいよ。
ゴルァ。

XSI 標準とは若干挙動が違う俺的新規 Model 作成。
はい、そんだけですが、なにか。


| | コメント (0) | トラックバック (0)

2008年6月20日 (金)

淫さま。 淫スタンスなプラグイン。

                  
淫スタンス。
元の Model、つまり淫スタンスマスターの全ての属性を引き継ぐ影武者ですね。
淫スタンスマスターに加えた変更は全て反映されますね。
とっても軽いですね。
そりゃそうですね。淫スタンスはただの影武者で、実データはマスターだけが持っているんですからね。
同じものが大量に出てくるシーンなどでは淫スタンスを使うのが一番いいですね。
軽いし差し替えもラクですからね。
      
でも時には、ある淫スタンスにだけ独自の変更を加えたくなることもあ りますね。
でも淫スタンスはそれができませんね。マスターの全てを引き継ぎますからね。
こういうときはマスターを複製して、独立させたい淫スタンスに位置や回転を合わせるのがいいですね。
でも手でやるのはめんどくさいですね。
なので NetView に入ってる Instance To DuplicateInstance To Clone というスクリプトを使いますね。
すでに配置済みの淫スタンスを、その配置に合わせて複製やクローンにしてくれるのでとっても便利ですね。
      
じゃあ使いましょうね。
XSI のバージョンはもちろん最新の 6.5 もしくは 6.02 ですね。
      
  ぽちっ。
      
        あ゛れ゛?
      
      
実行したあと、何だか挙動がおかしくなりますね。
オブジェクトが選べなくなりますね。
エラーもログされてますね。
新規シーンを実行するまで、これはもう直りませんね。
5.11 ではちゃんと動くのに、6.xx ではこうなっちゃいますね。
ずいぶん昔に開発されたスクリプトなので、現在の XSI ではちゃんと動かないんでしょうね。
頭来ますね。
Softimage てめえ動かねぇもん入れんじゃねぇよゴルァ。
      
      
      
      
淫さま。 淫スタンスを複製やクローンにコンバートするプラ グイン。+おまけ機能。
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html
      

Insama_ppg


      
ずいぶん昔に作ったプラグインを再構築。 もともとは淫スタンスの差し替え(選択中の淫スタンスのマスターを変更)のためのツールだったのですが、再構築 しようと色々調べ始めた時点で、いつも使っていた NetView のスクリプトが効かないことに気づき、急遽ツールの目的を変更してこのようなツールになりました。 元々の目的だった差し替え機能を再構築するのは忘れて しまいました。そのうち追加しよう。
      
コンバート前の淫スタンスが持っていた様々な状態をなるべく再現するようにしています。 特に Partition や Group の再現が以前から欲しかったのでありました。
      
おまけ機能は、淫スタンスを選んで実行するとその淫スタンスが参照しているマスターを選んでくれる機能、逆にマスターを選んで実行するとそのマスターを参 照している淫スタンスを選んでくれる機能、淫スタンスを選んで実行すると同じマスターを持つ淫スタンスを選んでくれる機能、の3つです。 淫スタンスマス ターと淫スタンスの関係はスケマティックビューで Show > Associated Model Links をオンにするとオレンジの線で出てきますが、数が多かったりするとごちゃごちゃするので、一発で関連したものを選ぶ機能が欲しかったのでした。 あ゛れ?  その機能、標準機能には無いですよね・・・? (いつものことながらどきどき)。
      
      
      
群集系、というほどの数ではないにせよ同じものが動きのタイミング違いで5~6個とか出てくるようなときは、最初はほぼ必ず淫スタンスを使います。最初は ひとつのマスターから5~6個の淫スタンスを作って配置やカメラを決めてしまった方が、軽い状態で作業できるからです。その後で淫スタンス達を複製かク ローンにコンバートします。コンバート後はマスターに縛られずに自由に変更できるので、アニメーションのタイミングなどをずらします。 この作業のために、NetView のスクリプトは欠かせないものでありました。 5~6個なら最終的に全部独立した存在になってもそれほど重くありません(もちろん 元Model の内容にもよるが)。
      
もっと数が多いとき、例えば30人とかいるともう、それぞれ独立した複製やクローンにコンバートすると重くなりすぎるので、上の方法は採りません。 今度 はマスターを5~6個用意してそれぞれ淫スタンス化し、同じ淫スタンスを数回再利用して群れにします。上手く混ぜれば再利用はバレません。 この作業をす る時に、最初はやはり超軽い状態で作業したいので、1つのマスターから淫スタンスを30個作り、後からバリエーションの数だけ淫スタンスのマスターを用意 して差し替えます。この作業のために、上に書いた、もともとこのツールの主要機能であった差し替え機能が便利になります。 全部の淫スタンスを同じものに 変更したいならマスターの中身を変更すればいいだけですが、もともとマスターが1つである30人の淫スタンスのうち10人はマスターA、10人はマスター B、残りの10人はマスターCに差し替えたい、という時ですね。 ああ、やっぱりこの機能は必要だな。いずれ追加しよう。
      
もっともっと数が多いとき、例えば50人とかいるともう、通常の淫スタンスをする気にはなれません。パーティクル淫スタンスグループを使ってなんとかしよ うとします。全体の動きの制御がパーティクルで可能な種類のものなら、これが良いでしょう。
      
もっともっともっと数が多いとき、例えば500人いたら何がなんでもパーティクル淫スタンスで逃げ切ります。ものによっては Hair 淫スタンスも使えるかしら。
      
もっともっともっともっと数が多いとき、例えば1000人とかいて、かつそれぞれがそれっぽく動いてなければいけないなら、Massive とか買うしかないですか。高いんですけど。
      
もっともっともっともっともっと数が多いとき、例えば5000人とかいたら、冥界から黒澤明を召還します。
      
もっともっともっともっともっともっと数が多いとき、例えば10000人とかいたら、プロデューサーを恐喝して WETA デジタルに発注するための予算を出させます。
      
もっともっともっともっともっともっともっと数が多いとき、例えば100000人とかいたら、そういうコンテを描いた監督を殺します。
      
      
      
      
      
      

| | コメント (4) | トラックバック (0)

2008年6月18日 (水)

ClassID でもストーク。

                  
先日の GUID でストーク。 の記事でまたまた有り難い情報を頂きまして、さらに実験してみました。
      
      
以下をコピーしてスクリプトエディタに貼り付けるか、このファイルをダウンロードしてスクリプトエディタで開いて、実行。
      
                                                              
//Yes_Stalker5_GoGo.js
            
// ****** カスタムプロパティ作成
var oCProp = XSIFactory.CreateObject('CustomProperty');
oCProp.name = 'ストーカー ~ あなたを絶対逃がさない ~';
            
// ****** カスタムプロパティにパラメータ作成
oCProp.AddParameter3('sGUID',siString,'');                  //GUIDパラメータ作成
oCProp.AddParameter3('sCLSID',siString,'');                             //CLSIDパラメータ作成
oCProp.AddParameter3('sName',siString,'','','',false,true); //元の名前パラメータ作成
            
// ****** カスタムプロパティのUI 作成
var oLayout = oCProp.PPGLayout;
oLayout.AddItem('sGUID','GUID');                                                          //GUID パラメータを UI に追加
oLayout.AddItem('sCLSID','CLSID');                                                       //CLSIDパラメータを UI に追加
var oItem = oLayout.AddButton('GetGUID','GUID と CLSID取得。'); //ID取得ボタン作成(ボタンにはパラメータは無い)
oItem.SetAttribute(siUICX,300);                                              //ボタンの横幅(ピクセル)
oLayout.AddItem('sName','(元の)名前');                                 //元の名前パラメータを UI に追加
oLayout.AddSpacer(0,10);                                                   //すき間空けただけ
oItem = oLayout.AddButton('Stalk','ストーク。');                            //ストークボタン作成(ボタンにはパラメータは無い)
oItem.SetAttribute(siUICX,300);                                            //ボタンの横幅(ピクセル)
            
// ****** ボタンに機能割り当て
oLayout.Logic = GetGUID_OnClicked.toString()+
               Stalk_OnClicked.toString();
oLayout.Language = 'JScript';
            
// ****** ID取得ボタンをクリックした時に実行されるルーチン
function GetGUID_OnClicked()
{
    if (Selection.count !=0)
    {
        // ****** 選択中のオブジェクト(最初の1個)から GUID と CLSID をゲット
        var oDataRep = XSIUtils.DataRepository;        //DataRepositoryオブジェクトを取得(IDにアクセスするため)
        GUID = oDataRep.GetIdentifier( Selection(0), siObjectGUID ) ;     //GUID取得
        CLSID = oDataRep.GetIdentifier( Selection(0), siObjectCLSID);                //ClassID取得
       
                    // if ( Selection(0).type == "customparamset")
                    // 上のように type で 特定しようとすると、Self-installed 形式のプロパティが customparamset として
                   // 認識されない模様。 従って、下のように、classname を使うと、全てのカスタムプロパティ
                   // (上記 type == "customparamset" でヒットするものも含む)がストークできますた。
            
            
        if (classname(Selection(0)) == 'CustomProperty')
        {
            CLSID = '{76332571-D242-11d0-B69C-00AA003B3EA6}';
        }
       
                     //    一方、Custom Operator の方は・・・・
                    //    classname で CustomOperator とすると、Self-installed オペレータだけでなく、
                   //    普通のスクリプトオペレータもヒットする(当たり前か)。
                    //    しかし、普通のスクリプトオペレータと Self-installing カスタムオペレータ を
                   //    ひとくくりに {72936430-9B0C-4167-8CA7-C30FC2188BB9} としてしまうと
                    //    ストークした時に普通のスクリプトオペレータの方だけ引っかかってくれない。
                    //    なので、
                   //
                    //       1:Self-installing カスタムオペレータの type は、常にオペレータの名前になっているっぽい
                    //       2:普通のスクリプトオペレータの type は、常に ScriptedOp ( = siScriptedOpType) になっているっぽい
                   //
                    //    この2点を利用して、
                   //
                    //        Classname が CustomOperator であり、
                   //        かつ type が siScriptedOpType ではない = それは Self-Installed カスタムオペレータである
                    //        従って CLSID に {72936430-9B0C-4167-8CA7-C30FC2188BB9} を授けよう
                   //
                    //    としたら↓上手く行っているように見えます。
            
            
        if (classname(Selection(0)) == 'CustomOperator' && Selection(0).type != siScriptedOpType)
        {
            CLSID = '{72936430-9B0C-4167-8CA7-C30FC2188BB9}';
        }
       
        PPG.sGUID.value = GUID;                                      //GUIDパラメータに、さっきゲットした GUID の値をぶち込む
        PPG.sCLSID.value = CLSID;                     //CLSIDパラメータに、 さっきゲットした ClassID の値をぶち込む
        PPG.sName.value = Selection(0).fullname;    //名前パラメータに、現在の名前をぶち込む
    }
    else    //何も選んでないくせに ID 取得ボタンを押すアフォな人に向けたメッセージ
    {
        var Msg = XSIUIToolkit.MsgBox('つけまわす人を選んどけっての。( ゚Д゚)オラ!',siMsgOkOnly,'ストークする気あんのかゴルァ');
    }
}
            
// ****** ストークボタンをクリックした時に実行されるルーチン
function Stalk_OnClicked()
{
    if (PPG.sGUID.value != '' && PPG.sCLSID != '')
    {
        //    FindObjects コマンドを使って、シーン中 Class ID が一致するものだけを oFindColl に格納 (XSICollection)
        var oFindColl = FindObjects( null, PPG.sCLSID.value );
        var oDataRep = XSIUtils.DataRepository;
        Flag = 0;                                           //発見フラグ初期化
        for (var i=0; i<oFindColl.count; i++)
        {
            //oFindColl の中身をループ。ひとつずつ GUID の値を変数 CurrItemGUID にぶち込む
           CurrItemGUID = oDataRep.GetIdentifier( oFindColl(i), siObjectGUID ) ;
            
                        //    すでに Class ID が一致するものだけに絞り込まれている。後は GUID が一致すれば桶。
                        //    でもこれって、FindObjects コマンドが Class ID だけじゃなくて、
                       //    直接 GUID を受け付けてくれればもっと楽なんじゃなかろか?
            if (PPG.sGUID.value == CurrItemGUID)
            {
              Flag ++;                              //    発見フラグ勃起 ピコーン
              SelectObj(oFindColl(i));                      //    選ぶ
              InspectObj(oFindColl(i));        //    表示する
              CenterSelection(null,true);    //    ビューの中央に持ってくる
              FrameSelection(null,true);    //    しかも寄る
              Msg = 'みーつーけーたーわーよー   ヽ(°▽、°)ノエヘヘヘヘ';
               
               //    名前が変わっていた場合
              if (oFindColl(i).fullname != PPG.sName.value)
              {
                   Msg += '\r\n\r\n' + '名前を変えても無駄よう~   ヽ(°▽、°)ノ ケケケケケケ';
                   Msg += '\r\n\r\n' + '元の名前 = ' + PPG.sName.value;
                   Msg += '\r\n'     + '今の名前 = ' + oFindColl(i).fullname;
              }
              else
               {
                   Msg += '\r\n\r\n' + oFindColl(i).fullname;
               }
              var Msg = XSIUIToolkit.MsgBox(Msg,siMsgInformation ,'ストーク成功。');
              break;
            }
        }
        if (Flag == 0)  //発見フラグが立たない=死亡。
        {
            var Msg = XSIUIToolkit.MsgBox('・゚・(つД`)・゚・  どこへ行ったのっ !!!',siMsgCritical,'あなたの大切な人は死にますた。');
        }
    }
    else    //ID を取得してないのにストーク。ボタンを押すアフォな人に向けたメッセージ
    {
        var Msg = XSIUIToolkit.MsgBox('つけまわす人を決めとけっての。(#゚Д゚)ドルァ!!',siMsgExclamation,'ストーク する気あんのかゴルァ');
    }
}
            
InspectObj(oCProp,null,null,siLock);
            
            
      
前回のスクリプトでは ActiveSceneRoot.FindChildren としていましたが、前回も書いたとおり、このメソッドは X3DObject に対するメソッドであり、返ってくる値も X3DObjectCollection です。 つまり、ストーク対象が3Dオブジェクトに限られるわけで、3Dオブジェクトではない Group やら Pass やら Visibility(プロパティ)やらなんやらは、せっかく固有の GUID を持っているのにストークできないことになります。もしこういう人たちを好きになってしまったらどうすればいいのでしょう。 ストークできないなら死んだ ほうがマシです。
      
というのが問題だったわけですが。
      
      
有り難き情報を元に、頂いたスクリプトを若干いじってこのようにしました。
      

Yes_stalker5_gogo_ppg

要は、FincChildren メソッドの代わりに、FindObjects コマンドを使えばいい、ということですよね?
ね? ね? そういうことですよね? 勘違いしてませんよね?
      
FindObjects コマンドの説明は、以下(SDKマニュアルよりコピペ)。
----------------------------------------------------------------------------------------
      説明
      
オブジェクトをタイプで検索します。
      
      スクリプト構文
      
      
        FindObjects ( [Path],  [Type] )
      
      パラメータ       
                                                                                                                                                                                                              
 
            
パラメータ
            
            
            
            
説明
            
            
Path
            
            
String             
            
            
オブジェクトのパス名(実装されていません)
            
            
Type
            
            
String             
            
            
オブジェクトのクラスID。このGUIDは、各オブジェクトのタイプをユニーク に識別します。たとえば、Phongシェーダの各インスタンスは同じクラスIDを持ちます。このIDはLambertシェーダのIDとは異なります。クラ スIDは、SPDLファイルのReference行またはDataRepository.GetIdentifierか ら特定できます。
            
      
      
      

戻り値

      

検出されたオブジェクトを持つXSICollectionオ ブジェクトを戻します。

----------------------------------------------------------------------------------------
      
      
1つ目のパラメータが「実装されていません」ってのが謎というかアフォですが。
      

で、どうやらこのコマンドは、シーンの中から、指定した ClassID を持っている人を探してくれるらしい。 ならば、先にストークしたい人の ClassID をゲットしておいて、実際にストークする段階でこの FindObjects コマンドを使ってその ClassID を持つ人だけに絞り込み、その中から GUID が一致する人を探せばいいということですよね? ね? ね? そういうことですよね? 勘違いしてませんよね?
      
FindChildren メソッドは X3DObject に限られるのに対し、FindObjects は ClassID という、X3DObject 以外の人たちでも必ず持っている ID を元に検索をかけるので、あらゆるものが検索対象になり、結果も X3DObjectCollection ではなく XSICollection として返してくれる、とゆーことだと理解しました。 ね? ね? そういうことですよね? 勘違いしてませんよね?
      
でも、上記スクリプトのコメントの中にも書きましたが、もしこの FindObject コマンドが ClassID だけではなく GUID を受け付けてくれれば、いちいち絞り込みすることなくいきなり FindObjects(null, GUID); ってやれば一発で1つのものを特定できるような気がするんですが、どうですかね。 その場合、ヒットするものは唯一無二の物のはずなので、戻り値は Collection じゃなくて SceneItem になるのかな?  ま、現在このコマンドはそういう仕様になっていないのでダメなわけですが。
      
      


それと、これも上記スクリプトの中のコメントに詳細を書いていますが、Self-Installed 形式のプロパティだけは Type == "custompset" で識別できませんでした。 Self-Installed 形式ではなく、シーンの中で手動で作ったカスタムプロパティはこれで認識できましたけど。 なので Type をやめて Classname == "CustomProperty" を使ってみたら、Self-installed もそうじゃないのもちゃんとストークできました。ううむ。これでいいんだろうか。
      


一方、カスタムオペレータの方は・・・。
      
SDK Explorer などで見てもわかりますが、Self-Installed 形式のカスタムオペレータも、Self-Installed 形式ではない通常のスクリプトオペレータも、 Classname は CustomOperator になっています(下の画像線)。
      

Customopclassnameortype


しかし、これを利用して Classname == "CustomOperator " とくくってしまうと、後で FindObjects コマンドでストークした時に、通常のスクリプトオペレータの方だけが引っかかってくれません。つまり通常のスクリプトオペレータの ClassID は{72936430-9B0C-4167-8CA7-C30FC2188BB9} ではない、ということになると思います。 ううむ。なんでですか。
      
そこで他に両者の違う点を探してみると、Classname は同じ CustomOperator でも Type は違っていることに気づき(上の画像の黄色線)、カスタムオペレータを作る別のプラグイン(デュアルQとか)で試しても常にこの結果になるように見えたの で、判別するときに Classname だけでなく Type も併用することにしました。すると、ちゃんとストークできるようになりました。 ううむ。これでいいんだろうか。
      
と、なんだか暗中模索状態ですが、ともかく前回のように3Dオブジェクトに限定されるようなことはなくなったので、進歩したと思います。氏に感謝いたしま す。
      
でも基本的にシロートが十分とは言えない質と量で実験した結果をもとに書いていますので、何かとんでもない落とし穴や勘違いがあるかもしれません。そうい う場合は是非指摘して下さい。
      
      
      
      
      

| | コメント (0) | トラックバック (0)

2008年6月17日 (火)

GUID でストーク。

                  
先日のプロキシセレクトプラグインの話で有り難きコメントを頂き、早速実験してみました。 オブジェクトの名前や Model 階層が変わっても、どこまでも、いつまでも、執拗に追いかけられるサンプルです。
      
  粘着質でしつこい女。 どこまででも追ってくるストーカー。
  名前を変えても、住所(Model階層)を変えても、必ず追いかけてきます。
  こうなったらもう、死ぬ(Delete)しかありません。
  嫌な女です。
      

Stalker_guid_ppg


スクリプティングに興味のある方は、オブジェクトが適当に多いシーンを開いて、以下のスクリプト(JScript)をスクリプトエディタにペーストして実 行してみて下さい。                                                
//Stalker.js

// ****** カスタムプロパティ作成
var oCProp = XSIFactory.CreateObject('CustomProperty');
oCProp.name = 'ストーカー ~ あなたを絶対逃がさない ~';
            
// ****** UI 作成
var oLayout = oCProp.PPGLayout;
oCProp.AddParameter3('sGUID',siString,'');
oCProp.AddParameter3('sName',siString,'','','',false,true);
oLayout.AddRow();
    oLayout.AddItem('sGUID','GUID');
    oLayout.AddButton('GetGUID','GUID取得。');
oLayout.EndRow();
oLayout.AddItem('sName','(元の)名前');
oLayout.AddSpacer(0,10);
var oItem = oLayout.AddButton('Stalk','ストーク。');
oItem.SetAttribute(siUICX,300);
            
// ****** ボタンに機能割り当て
oLayout.Logic =    GetGUID_OnClicked.toString()+
               Stalk_OnClicked.toString();
oLayout.Language = 'JScript';
            
// ****** 選択中のオブジェクト(最初の1個)から GUID をゲット
function GetGUID_OnClicked()
{
    if (Selection.count !=0)
    {
        var oDataRep = XSIUtils.DataRepository;
        GUID = oDataRep.GetIdentifier( Selection(0), siObjectGUID ) ;
        PPG.sGUID.value = GUID;
        PPG.sName.value = Selection(0).fullname;
    }
    else
    {
        var Msg = XSIUIToolkit.MsgBox('つけまわす人を選んどけっての。( ゚Д゚)オラ!',siMsgOkOnly,'ストークする気あんのかゴルァ');
    }
}
            
// ****** Scene_Root 以下のすべてのオブジェクトから、GUID が一致するものを探す
function Stalk_OnClicked()
{
    if (PPG.sGUID.value != '')
    {
        var oChildren = ActiveSceneRoot.FindChildren();
        var oDataRep = XSIUtils.DataRepository;
        Flag = 0;
        for (var i=0; i<oChildren.count; i++)
        {
            GUID = oDataRep.GetIdentifier( oChildren(i), siObjectGUID ) ;
            if (PPG.sGUID.value == GUID)
            {
               Flag ++;
               SelectObj(oChildren(i));
               CenterSelection(null,true);
               FrameSelection(null,true);
               Msg = 'みーつーけーたーわーよー   ヽ(°▽、°)ノエヘヘヘヘ';
               if (oChildren(i).fullname != PPG.sName.value)
               {
                   Msg += '\r\n\r\n' + '名前を変えても無駄よう~   ヽ(°▽、°)ノ ケケケケケケ';
                   Msg += '\r\n\r\n' + '元の名前 = ' + PPG.sName.value;
                   Msg += '\r\n' + '今の名前 = ' + oChildren(i).fullname;
               }
               var Msg = XSIUIToolkit.MsgBox(Msg,siMsgInformation ,'ストーク成功。');
               break;
            }
        }
        if (Flag == 0)
        {
            var Msg = XSIUIToolkit.MsgBox('・゚・(つД`)・゚・  どこへ行ったのっ !!!',siMsgCritical,'あなたの大切な人は死にますた。');
        }
    }
    else
    {
        var Msg = XSIUIToolkit.MsgBox('つけまわす人を決めとけっての。(#゚Д゚)ドルァ!!',siMsgExclamation,'ストーク する気あんのかゴルァ');
    }
}
            
InspectObj(oCProp,null,null,siLock);
            
      
で、1つだけオブジェクトを選んで GUID取得。 ボタンを押して下さい。 
その後、ストーク。 ボタンを押してみて下さい。 GUID を確保したオブジェクトをストークできるはずです。
次に、そのオブジェクトの名前を変えて、またストークしてみて下さい。まだストークできるはずです。
次に、オブジェクトを他の Model 階層にぶち込むなどして、またストークしてみて下さい。ストークできます。
次に、そのオブジェクトを削除してからストークしてみて下さい。今度はストーク失敗するはずです。
      
ということで、削除しない限り、名前が変わろうが住所が変わろうが、GUID は唯一かつ不変であるため永遠に関係を保てる、という風に見えます。 試しにそのオブジェクトを複製して新たに GUID を取得してみると、ちゃんと別の GUID が割り当てられています。マニュアルによると、日付や場所やネットワークカードのIDを使って乱数を発生させて GUID を決めているようです。
      
これを利用すると、先日のプロキシセレクトプラグインの「名前を変えたりするともう関係が保たれていない」の問題を解決できそうな気がします。 Thiago さまに提案してみようかしら。どきどき。
      
有用な情報のヒントを下さった氏に感謝します。
      
      
      
      
ところで全然別の話なんだけど、スクリプティングにに詳しい方に質問させて頂きます。
上記のスクリプトで、シーン内の全てのオブジェクトを取得するのに
                                                              
var oChildren = ActiveSceneRoot.FindChildren();
            
を使っているのですが、これだと3Dオブジェクト(X3DObject)しか取得できません。 GUID は 3Dオブジェクトに限らず Pass だろうが Group だろうが Property だろうが何にでもあるわけで、その証拠に上記のストーカースクリプトにおいて、Pass だのなんだの3Dオブジェクト以外のものを選んでいてもちゃんと GUID を取得できます。しかしその後のストークの段階で ActiveSceneRoot.FindChildren(); を使うことによって捜索対象を3Dオブジェクトに自ら限定してしまっているため、ストークできないことになっています。
      
このように、Pass だろうが Property だろうが全てを対象に、つまり XSI のシーン内に存在するありとあらゆるものをひとまとめに取得する方法はあるでしょうか?  ActiveProject.ActiveScene.GetEverything(); みたいなことができればいいのですが。
      
詳しい方がいらっしゃいましたら、何卒教えて下さいませ。
      
      

| | コメント (1) | トラックバック (0)

2008年6月16日 (月)

乳カメラ。お乳なカメラを作るプラグイン。

                  
User ビューはなんでレンダリングできねえんだよゴルァ。
リジョンができるなら通常のレンダリングもさせろやゴルァ。
Right ビューとかも同じだよゴルァ。
真横からパース無しでレンダリングしたいこともあるんだよゴルァ。
いちいち Ortho カメラとか作ってられっかよゴルァ。




乳カメラ。
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html
      

Nyucamera_menu

      
      

昔、 ほんの一時期だけ Max を使ったことがあるが、パースビューっていうんだっけ、XSI でいう User ビューから通常のカメラに変換できるのが便利だな、と思った記憶があります。ずっと前から作ろうと思いつつ作りそびれていたんだけど、最近やっと書きまし た。まだ初期バージョンなので不具合あるかも。

      

多くのパラメータの値を複製するので、重いです。一瞬待たされます。まあ一瞬ですが。

      

      
      

      

以下、スクリプトな話。
      

      

XSI のパラメータの構成ってのは、あるパラメータの状態でダイナミックに変わることがあるように見える。例えば Rotoscope の Image Placement を Attatched to Camera にするか Fixed にするかで PPG 内に出てくるパラメータが変わりますな。Fixed の方にしないと Width とか Height とかは出てこない。

Rotodynparam


これが、ある状態の時は表示上出てこないだけで、実際にはパラメータとして(裏に)存在しているのなら問題ないんだけど、どうやらパラメータの有無すら変 わってしまっているように見える。
      
試しにどれかカメラを1つ選択した状態で以下を実行してみると(JScript)、
                                                              
// Rotoscopy Options の全パラメータを取得
var oRotoParams = Selection(0).Properties('Camera Rotoscopy').Parameters;
            
// その数を表示
Logmessage(oRotoParams.count);
            
      
結果は 8 などと表示される。8個のパラメータコレクションになっているということですね。
しかし、そのカメラの Rotoscopy Options を開いて Image Placement を Fixed にし、同じくスクリプトを実行してみると、今度は 14 などと表示される。14個のパラメータコレクションになってますね。
      
Image Placement の状態によって全体のパラメータの数が変わるので、つまりインデックスで追いかけることができなくなる。つまりコレクション内の特定のアイテムを oRotoParams(n) という風に数値で指定しても、Image Placement の状態によっては違うパラメータオブジェクトが返って来るという事になりませんか。なりますよね。なるでしょう? なると言ってくれ。
      
乳カメラでパラメータ値の複製をループ処理していないのは、このせいです。ループ処理しようとするとエラーが出て止まる。おそらく、上記のようにパラメー タの構成(数・順序)がある状態に依存するためだと思います。新旧カメラ同士でパラメータの構成が変わっていると、例えば新の10個目のパラメータが旧の 10個目のパラメータと一致していなかったりして、 siInt4 であるべき所に siBool をぶち込もうとしてエラー、とかそういう感じじゃないですかね?
      
ともかく数値でループできないもんだから、パラメータの名前を調べて逐一ぶち込んで行くという原始的で、ソースも長く・汚くなるアフォなやり方をしていま す(まあ、それすらスクリプトでコード書き出すようにして手間は省いてますけどね)。 少しでもすっきりさせようと思ったら、変わってしまうパラメータを 数値か名前で特定し、その部分だけ条件分岐して処理し、それ以外は普通に数値でループすればいいのかなあ。それもめんどくさいので、条件分岐はしかたなく させているけどループ処理は入れていません。
      



これって上に書いたように、たとえ UI 上に表示されない状態があったとしても、パラメータの数や順序が永遠に変わらない仕様になっていれば何にも問題ないんじゃないんですか? それは素人考え ですか? 俺の勘違いですか? なぜこのような仕様にしたのですか? Softimage さん、弁明をレポート用紙3枚にまとめて明日までに提出してください。
      
      
      
      

| | コメント (0) | トラックバック (0)

2008年6月13日 (金)

マッチョ Transform。マッチョするプラグイン。

                
XSI 標準の Match All Transforms。 とてもよく使う機能。
でも、ピックセッションなのが気に入らない。
      
 マウスは、はるか長い距離を旅して、やっとオブジェクトを選ぶ
 マウスは、はるか長い距離を旅して、やっと Transformメニュー > Match All Transforms にたどり着く
 マウスは、はるか長い距離を旅して、やっとピックすべきオブジェクトにたどり着く
      
これじゃ大変なんだよゴルァ。  最近はモニタの解像度も上がり、しかも横長になったりしているので、マウスの移動距離は長くなる一方である。
      
 先にマッチョ先を選ぶ。
 次にマッチョされる人たちを選ぶ。
 マッチョ実行。
      
こっちの方が楽じゃない?
      
      
マッチョ Transform。
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html

             

Machotransform_menu



マウスがあっちこっちにさまようのが嫌という理由だけで作った。
ついでに Local も付けてみた。 Local はたぶんXSI 標準には無いと思う。
      
ピックセッションは、基本的に嫌い。
先に選んでおく方が好き。
ツールの性質上、時にはピックセッションの方がわかりやすい場合もある。
そういう場合を除いては、なるべくピックセッションを撲滅したい。
ピックセッションがあると書くべきコードも長くなるしね。
      
      
      
      

| | コメント (0) | トラックバック (0)

2008年6月10日 (火)

プロキシセレクトプラグインが2発も。

                  
XSIBlog を読んでいたら、プロキシセレクトプラグインの話が。
      
      
プロキシパラメータのように、オブジェクトごとに「代理」を作って、 代理を選ぶと代理にリンクされたオブジェクトも選ばれるというもの。 おお、前からこ ういう機能、欲しかったんだよ。だって複雑なリグだとビューポートでコントローラ選ぶの大変じゃない。シノプティックとか作るのはめんどくさいじゃない。  いつもスケマティックに頼ってるけど、スケマティックだと普段はいじりたくないコンストレイン先の Null とかアップベクターとかをコントローラの子供にせざるを得ない場合(大抵そうなんだが)、いじりたくないのにスケマティックには表示されるわけで、不便 じゃない。だからこういう、別オブジェクトから特定のオブジェクトを選ぶってのが欲しかったんですよ。いえーい。
      
XSIBlog の記事を読んでみると、もともと Softimage|NET の方で話題にあがったことを受けて Patrick Boucher さまが開発を始めた模様。すると、最近売れっ子っぽいあの Thiago Costa さまが Softimage|NET の同じスレッドに参加していて、彼も触発されて同じようなプラグインを独自に書いたそうで。 ということでいきなり2種類のプロクシセレクトプラグイン。
      
Patrick さまバージョンは XSIBlog のこの記事で。
Thiago さまバージョンは Softimage|NET のこの記事で。
      
      

Tcproxyselect1

画像は Thiago さまバージョン。代理オブジェクトを選ぶと、リンクされたボーンも自動的に選択されます。
どちらも、選択の切り替わりを検知する Event を仕込んでやっているようです。




                                                       
Thiago さまバージョン
            
1. 代理オブジェクトを選んで Get > Property > ProxySelect(#)
2. 代理オブジェクトにできた PPG(自動的にポップアップする)の中で、リンク先を選ぶ
            
※Get > Property > ProxySelect Preferences でこのプラグインの効果をシーン全体でオン・オフする
  (Preferece > Custom > tc_ProxySelect_Options を表示する)
            
            
Patrick さまバージョン
            
1. リンク先を選んで、Get > Property > ProxySelect(#)
2. ピックセッションが始まるので代理オブジェクトをピック
            
※ MCP の Select メニュー以下に、効果をオン・オフする項目3つあり
(選択中のオブジェクトがあればそれだけが対象、何も選択していないとシーン全体が対象)
            
            
(#)
どっちも Get > Property > ProxySelect なので、両方インストールしてるとどっちがどっちなんだかわけわかりません。スクリプトいじれる人はメニュー項目の名前を変えち まった方がいいかもしれません。自分はひとまず、片方をワークグループに、片方をユーザプラグインとしてインストールしてメニュー項目の横に表示される w と u の違いで見分けているという刹那的かつものぐさ的な対処法でやっていますが、何か。
            
            
Thiago さまバージョンの方はコントロールがよりきめ細かで、代理を選択すると代理の方は選択から外すかどうか、ブランチ選択かノード選択か、リンク先のプロパ ティを表示するかどうか、などが決められます。
お二人で、代理とリンク先のどっちを選んでプロパティを与えるかが逆になってますね。これは好みの問題でしょう。
      
      
      
しかし使ってみると若干問題というか、使いにくいと感じる部分もあり。
      

・複数選択
      
Thiago さまバージョンは代理の選択を外すかどうかを決められる。外した場合は、代理を選んだ瞬間に代理の選択は外れてリンク先のみが選択された状態になる。自分 はこの使い方がしたい。なぜならば自分はコントローラを選びやすくするために使いたくて、キーフレームを打つのはコントローラなんだから、代理は選択から 外れてくれないと代理にもキーフレームが入ってしまって邪魔になる。 
      
ってことで代理は選択から外れてもらうモードにしたのだが、この方法だとイッキに複 数を選択することができないことが判明。ドラッグして矩形選択しても、 1つにしか効かないのです。Shift で選択追加も効かない。っていうか最初に代理を選択した時点で選択がリンク先の方に切り替わるので、Shift で選択を追加しても元の代理に追加したのではなく、今このプラグインによって選ばれ たリンク先に追加していることになるんでしょうかね。パッと見それとは ちょっと違う挙動に見えるんだが・・・。 いずれにせよ最初の代理を選んだ時点でリンク先に選択を切り替えることがこのプラグインの目的なんだから、こ りゃどうしようもないわな。 解決しようと思ったら、イベントで選択が切り替わる方式をやめて(そういうモードでも作って)、先に代理を好きな数だけ選ん でおいて、コマンドを起動したら対応する複数のリンク先を選択する、みたいな仕様にしないとダメかしら。 両足を同時に同じだけ回転させたい、みたいな、複数を選びたくなることは多いからなあ。これは痛いかも。
      
Partick さまバージョンは、そもそも複数選択ができないように見える。複数の代理をドラッグでイッキに選ぶと、リンク先ではなく代理たちが複数選択される。  Shift で選択追加すると、まさに上に書いた挙動=もとの代理に追加ではなく、プラグインによって選択されたリンク先に、Shift でクリックした代理が追加される、という状態になる。
      
ちなみに Thiago さまバージョンで代理を選択から外すモードの場合、選択はすぐにリンク先に切り替わるため永遠に代理オブジェクトを選択できなくなります。このため に Preference で、シーン全体でこのイベントをオフれるようになっています。また、Exploer からもオフにできます。代理オブジェクトを展開するとカスタムプロパティがぶら下がっているので、それを表示すればいいだけです。ここのカスタムプロパ ティからは個別にオフれることになります。 Patrick さまバージョンの場合はそもそも常に選択がリンク先に切り替わるので(代理オブジェクトを選択状態のまま残しておけない)、 Select メニューの3つの項目でオフにする機能がついています。また、同じく Exploer からカスタムプロパティをほじくることでもオフれます。
      
      
・名前
      
両方とも、リンク後にリンク先のオブジェクト名を変えたり別 Model 階層に入れたりすると、リンクが切れてしまう。名前で追いかけている ので、そりゃそうだわな。 となると、自分の使い方では完全にセットアップを終えて最 後にこのプラグインでリンクしてやる、というワークフローになるな。後で変えたくなったときにやっぱり不便だろうなあ。オブジェクト名に頼らずにリンクを 維持する方法はあるのかしら。 スクリプトオペレータでできる気もするが、どうだろう。
      
      
・パフォーマンス
      
選択という最も頻繁に起こるイベントをトリガにしているので、つまり XSI さまが常に選択状態の変化を監視しているので、もしかすると全体的にパフォーマンスが重くなっているかもしれない。というか原理的には重くなっているは ず。
      
あと、Thiago さまバージョンで代理の選択を残すモードの時、例えば10個くらいの複数オブジェクトをイッキに選ぶと、リンク先が全部選ばれるまで一瞬待たされます。 選 んだ代理オブジェクトのカスタムプロパティを探して、パラメータ読み取って、リンク先を探して、全部選ぶ、っていう一連の動作をやっているわけで、まあこ れも仕方ないわ なあ。 C++ とかで書けば速くなるかしら。
      
      
      
今度色々質問とか要望とかしてみようかしら。特に Thiago さまはこういうこと活発にやるし、聞いてもらえそうな気がする。なんとなく育っていきそうな、楽しみなツールであります。
      
      
っていうか標準機能にしてくれ Softimage さん。
      
      
      
      
      

| | コメント (2) | トラックバック (0)

2008年6月 9日 (月)

親子ゲッチュ。家庭内紛争なプラグイン。


選択中のオブジェクトのひとつ親を選ぶ機能。
XSI の標準のやつは、右側の小さい三角が3つ並んだボタンの、上を押す。
でもこれ、複数のオブジェクトには効かないのね。
しかもボタン小さくて押し間違うよゴルァ。

選択中のオブジェクトから子供を選ぶ機能はないのかな。ゴルァ。




親子ゲッチュ。

http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html

Oyagetyouaction

上の画像は親ゲッチュの挙動。

現在選択されているオブジェクトから、その親や子を選択するためのツールです。
そんだけ。

Null が親で、その子供に並列でずらずらずらっといっぱいオブジェクトがぶら下がっているようなときに、親の Null だけを選んで子ゲッチュすると子供がイッキに選択される。というような使い方をよくしています。エクスプローラを展開して選んだり、スケマティックで矩形選択するのさえめんどくさいという人間です俺は。 だって、子供が50個とかある時はエクスプローラもスクロールしないといけないし、スケマティックもでっかく出さないとできないじゃないですか。親だけ選べばいいなら楽じゃないですか。ええ。ものぐさですよ俺は。

親ゲッチュはもともと、標準のやつだと複数オブジェクトに効かないのにキレたので書いたものでした。あと、選択をブランチにしたいことが多かったので。



こないだの記事に書いた Selectionボタンメニュー
に入れてみました。
でもショートカット作らないとあんまり便利じゃないですね。




| | コメント (0) | トラックバック (0)

2008年6月 7日 (土)

Selection で右。

XSI インターフェース右側(MCP)の Selection メニュー。
便利だからよく使う。

でもさっき、間違えて右クリックしてしまった。
すると。

Selectionrightclick

げげっ。 なんだこれはっ。

右クリックすると、こんなメニューが現れるんですね。
特定のジャンルのプロパティだけを表示させるんですね。
なかなか便利そうですね。
知っていましたか?
知っていましたか。
常識ですか。
そうですか。

知らなかったですよ。
今気づきましたよ。
Orz


| | コメント (0) | トラックバック (1)

2008年6月 6日 (金)

EKC。熱血野郎とミラーマンのプラグイン。

                  
大量のオブジェクトがある。少ないコントローラで大量のオブジェクトを動かすために、大量のエクスプレッションが必要である。しかし大量すぎるので、いち いち全部のオブジェクトにエクスプレッションを書くことなど不可能である。従ってエクスプレッションをひとつ書く。あとはアニメーションアイコンの右ク リックからコピー&ペーストしたり、あるいは SAC などを使って、大量のオブジェクトにエクスプレッションを複製する。複製後に、ものによってはマイナスの値を掛けたり、2倍にしたり、フレームオフセット を仕込んだり、様々な調整をする。この調整が進むに連れて、オブジェクトごとにだんだん違うエクスプレッションになっていく。エクスプレッションの中身が 違ってくるだけでなく、そもそもエクスプレッションを仕込むパラメータを変えることもよくある。 ひたすら黙々と続ける。リギングとは地道な作業なのであ る。
      
やっとの思いで作業を終える。
アニメーションのテストをする。
問題が発生する。
どうしても元のコントローラを差し替えなければいけないことがわかる。
      
コントローラの名前や階層を変えたいのではない。違うコントローラオブジェクトにリンクしたいのである。さんざん調整した後なので、すでにオブジェクトご とに違う内容のエクスプレッションになってしまっている。また、コントローラはひとつでも、あるものは roty に、あるものは posx に、などとエクスプレッションが仕込まれるパラメータもまちまちになってしまっている。
      
つまり、新しく書き直したエクスプレッションを単純に複製する、ということはもはや不可能なのである。
      
納期はせまる。
万策尽きる。
マシンを破壊する。
      
      

EKC。 熱血野郎とミラーマンのプラグイン。
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html

Ekc_ppg


使い方は説明ビデオがあるのでだいたいわかると思います。
      
      
      
以前 this_model の問題について書いたけど、もともとはこの this_model を削除するために書いた簡単なスクリプトだった。大量のオブジェクトに this_model 付きのエクスプレッションを仕込んでしまっていて、手で this_model を削除していくうちにブチ切れて書いたという。
ついでに this_model だけではなく任意の文字列を削除したり置換したりできるようにしたら意外と便利だったので、少し整備してみた。冒頭のワーキングシナリオは後から分かった 副産物のようなものだが、今ではむしろその使い方の方が多くなってきているかもしれない。先日のロケンローする XSI 男くんのエクスプレッションを調整していたときにも、「あ、このとなりのコントローラの方がバスドラの音をよく拾ってるな、リンク先変えたいな」とか、 「全体的に動きが小さすぎたな。rotz は全部 * 2 を追加したいな」のような場面で役立った。
      
その作業の中で思ったのが、検索でヒットしたものを置換するだけでなく、無条件で文字列追加とかの機能もあると便利なはずである。いずれバージョンアップ しよう。いずれ。
      
バグや不味い仕様があれば教えてください。
      
      
      
      

| | コメント (0) | トラックバック (0)

2008年6月 4日 (水)

All Right Now。XSI男のロケンロー。

                  
前の記事に書いたサウンドビジュアライザなプラグインがバージョンアップして て、キーフレームを書き出せるようになっていた。 キーフレームにさえできればこっちのもんだぜ けけけけけ。
      
ということで早速実験。


All Right Now   ~ XSI男のロケンロー
(AVI / Xvid Codec / 21MB)

      

Arn_ss

      
シーン中、カメラ以外に手付けキーフレームは一切ありません。オーディオファイルからこのプラグインを使って自動で取り出したキーフレームが全ての動きを ドライブしています。人間も、パーティクルも、シェイプも、ライトも。  あー おもしれー。
      
大きな問題点は、必ず音と映像がズレること。処理速度の問題なのか、映像(キーフレーム)の方が数フレーム遅れる。まるごとオフセットされるならずらすだ けだから調整は楽だけどそうではなく、映像の方が若干長い尺になってしまうように見える。 しかたないので書き出したキーフレームをミキサーで縮めまし た。
      
      
      
一応、手順を。。。。
      
1: iTunes フォルダとかを漁って、mp3 を発掘する
2: 後でアニメーションミキサーに入れることも考えて、wav にする(ミキサーって mp3 ダメだよね?)
3: 2バイト文字などが入らないファイルパスに置く
4: このプラグインを使って任意のコントローラオブジェクト(10個くらい?)にアニメーションを付ける
5: ミキサーでいじるために、コントローラのアニメーションを Action化する
6: ミキサー上に wav とさっきの Action を読み込み、Action にスケールかけて音と合うように調整する
   タイムラインのスクラブやプレイバックでちゃんと音が聞こえるので、ズレなくなるまでクリップの
   プロパティで根気良く調整。
7: 音が合ったら後は心置きなく、動かしたいものを好きな方法でコントローラにリンクしまくる
8: QuiciTime など音も入るフォーマットでキャプチャしてテストしながら、ムービー完成
      
      

シーンのスクリーンショット。クリックで拡大。
      

Arn_sceness



もちろん思ったとおりの動きになんてならないけど、まあただの遊びなので。たまに偶然音と口が合ったりして嬉しい。 基本的に出たとこまかせ。調整は大し てしてません。 
      
このプラグインは、音のダイナミックレンジ全域をオブジェクトの数で割っているように見えます。イコライザで特定の周波数域だけ取り出すのと同じ原理だと 思います、たぶん。なのでオブジェクトが多いほど細かい周波数域を取り出せるように見えるのですが、細か過ぎるとかえって欲しいアタック音が取り出せない 感じがします。ちなみに後ろにいる緑の XSI男たちは元の音をそのまんま Scale Y に反映しているので、よくあるグラフィックイコライザを見ているのとほぼ同じことになっています。
      
ということを踏まえて曲はあえて「音と音の間」の多い、シンプルな曲を選びました。 ごちゃごちゃした曲だとコントローラの動きも曖昧に なってしまうだろうから。 もちろんトラックごとに分かれたオーディオを用意してそれぞれ別のコントローラに食わせてあげれば精度は上がるだろうけど、自 作の曲でもない限りトラックごとに分かれたオーディオファイルなんて手に入らないよねえ・・・。 バスドラとスネアとボーカルだけでも分かれていれば、こ ういう用途には使いやすくなる気がするんだけど。
      
でも最近なら、ボーカルだけ取り出すとかそういうソフトウェアもありそうな気がする。
誰か教えてください。
      
      
Dedicated to ポールロジャース。
Huge thanks to 作者の miga さま。
      
      
      
      
      

| | コメント (3) | トラックバック (1)

2008年6月 1日 (日)

Hot Stuff

またまたアツいプラグインが・・・・。
http://www.xsibase.com/forum/index.php?board=29;action=display;threadid=36312


よくあるサウンドビジュアライザの XSI版ですね。いやー、面白い。オブジェクト選んで、PPG 内でリストにぶち込み、mp3 を指定して Play を押すと始まります。はははは。おもしれー。


インストールが手動だったり、シーンを保存して開きなおすと mp3 ファイルのパスのフィールドが空っぽになっていたり(でもちゃんと再生する)、もっとも痛いことにアニメーションへの書き出し(プロットも)が出来ないなど、現在は超ベータの状態ですが、いずれちゃんと対応していくみたいですね。 ま、現状ではアニメーションの書き出しができない以上、ただの音楽プレーヤです。

早くアニメーション書き出し対応しないかなあ。これは遊べそうだなあ。俺の場合は仕事で使うことはなさそうだけど・・・。




とりあえずテストしてみた。

Xsimangroove

XSI男のグルーヴ。
(音付きAVI / Xvid Codec / 10MB)

やあ XSI 男くん、なんだかご機嫌だね。
アニメーション書き出しに対応したらもっとご機嫌なダンスをさせてあげるよ。
けけけけけけ。




| | コメント (0) | トラックバック (0)

« 2008年5月 | トップページ | 2008年7月 »