« 2010年3月 | トップページ | 2010年5月 »

2010年4月

2010年4月16日 (金)

Spot御乱心。

またまた粗探しですよ。けけけけけ。


2011 で Spot Light に Interest がなかった場合の問題が XSI Base で指摘されてたんですがね。
http://www.xsibase.com/forum/index.php?board=12;action=display;threadid=42280

なるほど、やってみましたが、確かにヘン。


・Spot を取り出して Interest を削除した場合
・Infinite や Point を取り出して、後から PPG 内で Spot に変えた場合



いずれにせよ Interest が存在しない場合ということですね。
この状態で、ビューポートの1つを Spot から見るモードにして、Sキーでぐりぐりと動かしてみて下さい。なんか挙動がヘン。特にドリー(中クリック)で、かなりアヤシイ。 P キーでドリーしてもおかしい。急にすっ飛んで行く感じ。 ね? おかしいですよね? ね?

Spotwithnointerest

全く同じことを 7.5 でやってみたら、何も問題なし。2010 ではどうなんでしょう。


上記の XSI Base のスレッドでは、おかしいと言う人と正常だという人がいますが、同スレッド内で Softimage の luceric さんが「カメラツールに欠陥があるようだ。すぐに対処する」と言っているので、バグなんだと思います。


ということで、2011 では Interest なし Spot は、スポット自身のビューでナビゲート禁止。 禁止ですからね。違反しないで下さいね。

ま、Interest 無し Spot なんて俺めったにやらないし、ましてやその Spot を Spot ビューで
ぐりぐりするなんてのもやらないし、実害はないかなー。






..

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

2010年4月14日 (水)

骨プリミティブ問題。

XSI Base を読んでいたら、弐千拾壱で追加された Bone Primitive の問題が指摘されてました。
http://www.xsibase.com/forum/index.php?board=11;action=display;threadid=42274

スレッドの最初の書き込みに、Vimeo のビデオへのリンクがありますね。
見てみると、なるほど。


Bone Primitive は Duplicate Symmetry できない。
Bone Primitive をデフォーマにした Envelope は Mirror Weight できない。
Bone Primitive を Envelope のデフォーマにしても骨の長さ(骨プリミティブの length)は変形に影響を与えない(センターしか見ていない)。



ということらしいですね。 俺もちょっとやってみましたが、うむ、たしかにそう。シンメトリ複製できないって、どういう仕様だこれは。

上記 XSI Base のスレッドの中で、Softimage のチニーさんの話として、envelope.vbs を書き換えると Mirror Weight だけはできるようになるそうですよ。インストールパス以下から envelope.vbs を探し出し、書き込み不可属性を外し、473行目に On error resume next と書けばいいそうです。今までエラー処理に引っかかっていた部分を、エラーが出ても実行するという方式に改造するということなんでしょうね。俺はまだやってません。っていうかたぶんやらない。この envelope.vbs はおそらくはエンベローピングをする時に常に呼び出されるものだろうから、この改造で他のことに影響があったら嫌なのでね。 改造する人は自己責任でということになりますね。


3つ目の Length の話ですが、Bone Primitive の PPG にはちゃんと Length というパラメータがあります。
Implicitbone
でもエンベロープしてみると、ほんとだ、骨の長さがエンベロープ直後の初期 Weight に全く影響を与えていませんね。センターの位置しか考慮に入れていないようです。しかもエンベロープ後にこの Length の数字を変えても、つまり骨の長さを変えても、エンベロープは全く変形しません。SRT 以外には反応しないんですね。普通の Bone なら Length に反応するので、それこそが Bone の良い所なわけですが、この骨プリミティブはそういう挙動をしません。

でもまあ、この骨プリミティブは通常のボーンと違い、あくまでも Implicit プリミティブ ですからね。Length だのなんだのは単に表示上の大きさであって、実質的にはなんら影響力を持っていないということなんでしょう。この意味では null とも扱いは同じですね。昔からある Sphere やら Cube やらの Implicit プリミティブとも挙動は同じわけで、納得はできます。 Implicit Sphere をデフォーマにしたエンベロープで、Implicit Sphere の Radius 変えてもなんら変形しないのは昔から変わらないですもんね。これはそういうもんです。 上記 XSI Base のスレッドにも、やはりチニーさんの話として、ウェイト付けに関する Implicit の Bone の挙動は null と同じだ、というのが載っていますね。

でも、ヘタに骨らしい見栄えをしているから、通常の骨と同じような挙動をつい期待してしまいますわな。なるほど知ってて損のない有益な情報です。 ミゲルさん、Muchas gracias.



いやあ、XSI らしいですね。便利になったように見せかけておいて、いかにも出来そうなツラをしておいて、まあ実際に便利にはなっているんですが、シンメトリ複製できないだとかなんだとか、ごく基本的な所に落とし穴を残す。 実に XSI らしい。

七ちゃんから付いた Pass Override も実に便利で喜んで使っていたのですが、最近落とし穴に気づいて Orz してます。グローバルと共有された Mental Ray Options を Pass Override した後、その Pass で Mental Ray Options をローカル化したあたりからアヤシイです。これはもうちょっと検証を続けよう・・・・。


.

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

2010年4月10日 (土)

パーティクルのコリジョン。

ICE のパーティクルで、Simulate Rigid Bodies を使ってシミュレーションしてたんですがね。


パーティクル同士の衝突の判定がわからないんです。


パーティクル同士はちゃんとコリジョンしますよ。Simulate Rigid Bodies 使ってるから。でも、パーティクル同士が衝突しましたーってフラグを立てる方法がわからなくて。当たったら色変えるとか、そういうことがしたいわけですよ。

ポリゴンオブジェクトとの衝突なら、Test Collision with Surface があるので、これでできますね。でもパーティクル同士のが欲しいのです。


そんなコンパウンド、標準でないですかね?
俺が見落としているだけ?
プラグインでもいいんですが。


今回の場合は、Force やらなんやらが無しで、動き出したパーティクルは他のものと衝突しない限り等速運動を続けるという、実に特殊な状態でした。

となると。
等速運動を続けているということは、Particle Velocity が一定だということですよね。
で、コリジョンが起こると方向やスピードが変わる。つまり Velocity に変化がある。
Force とかもないので、Velocity に変化があるのはコリジョンした時だけ。
ということは前のフレームと比べて Velocity が変わったかどうかを判定すれば、コリジョンしたかどうかの判定になる。

というロジックのもと、やってみたんですがね。

でも上手く行かない。

↓こんなツリーで良さそうな気がしちゃうじゃないですか。
Getvelatprevframe
Get Data at Previous Frame を使って前のフレームの PointVelocity を取ってきているわけですよ。 で、それを Get Data で得られる PointVelocity=つまり現在フレームの PointVelocity ということになると思うんですが、この両者を比較する。数値が違えばコリジョン発生。のはずだと思ったんですがね。

でもコリジョンは思いっきり起こっているにも関わらず、この画像のように前のフレームと現在のフレームで返す値が同じになっちゃうんですよ。ビューポート上に表示させている2つの値が全く同じなのがわかると思います。 同じ値なので当然この判定には引っかからないわけです。このツリーの場合はベクターの長さ (length)=つまり速度だけ比較してますが、実際に衝突によって見た目ではっきりわかるくらい速度は変わっているわけですよ。なぜ同じ値になってしまうのでしょう。ここがよくわかりません。たぶん、ICE の構造というか、根っこのところで俺よくわかってないんだと思います。誰か教えて下さいマジで。


とか言っていたら、ICE フェチな人たちが助けてくれて、ストレートとは言い難い方法ではありますが似たようなことはできるようになりました。



とりあえずその成果を使って作ったテストムービー。 XSI 男同士が衝突すると、顔が変わります。

Room of Pain from junki the junkie on Vimeo.



その ICETree。
Roomofpain_icetree
Get Data at Previous Frame で前フレームの Velocity を取れないなら、現在フレームにおける Velocity を、現在フレームの値でアップデートされる前に退避させておき(つまりこれが前フレームの値)、その後アップデートされた値と比較するという考え方のものです。 なるほど、これでとりあえず衝突判定ができるようにはなりました。

あとは、あらかじめ XSI男の顔のバリエーションを用意しておいて、Instance Shape するだけです(コリジョン自体はこのジオメトリじゃなくて sphere か何かで判定させてますが)。 で、衝突したら Instance Shape の ID にランダム値をぶち込んでいます。つまり、衝突したときに Shape が変わるということです。 ・・・・んー でもこのムービーじゃあんまりわかんなかったか。色とかも変えないとわかりにくいね。

あと、壁とのコリジョンなどもろもろ仕込みがまずくて、パーティクル同士でコリジョンしてないタイミングでも顔が変わってしまう部分がありますね。ま、衝突だろうがなんだろうが Velocity が変わったら衝突したということにしちゃってるんだから、挙動としては正しいですわね。パーティクル同士が衝突した時にだけ Velocity が変わるように仕込めなかったのが悪いのであります。


いやあしかし、値のアップデートのタイミングを考えてあらかじめ逃がしておくなんて、こんなの俺考え付かないよ。今でもこのやり方の本当の意味がわかってない気がするし。ICE 難しいなあもう。


まあともかくですね、

・Get Data at Previous Frame の使い方よくわかりません。
 なぜ前のフレームと今のフレームで同じ値になっちゃうんですか。
 正しい使い方教えて下さい。

・っていうか、最初からパーティクル同士のコリジョンを検知する機能はないんでしょうか。
 知っている人教えて下さい。


マジで。お願いします。


ICE 迷宮は長くて暗いですね。鼻歌歌いながら組めるようになりたいですね。こんな程度でも俺、今日は頭使いすぎてなんだか体がカッカしてますよ。ビールでも呑んで冷却するか。



Huge thanks to m4g & msk.  I love you.






.

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

2010年4月 9日 (金)

自己完結 Curve Length。

以前ここに書いた jsCurveLength というプラグインはとても便利であります。 curve の長さを取得するスクリプトオペレータを仕込んでくれるもので、curve deform やら path アニメーションがらみのリグを組むときに実に重宝しています。

が、当然のことながら、このプラグインを使ったシーンを他の人に渡すときに、先方の XSI にもこのプラグインインストールされている必要があります。 中身はいわば XSI 標準の機能で完結したスクリプトオペレータを仕込むだけなのに、プラグインのインストールが必須になるのは不便と言えば不便です。


そんなときは darkvertex.comさんで公開されているこのスクリプトを使いましょう。
http://darkvertex.com/wp/2009/12/17/selfcontained-curvelength-operator/

curve を選んでこのスクリプトを実行するだけ。カスタムプロパティが作られ、curve の長さを取得するスクリプトオペレータが仕込まれます。つまり jsCurveLength と全く同じことをしてくれるものですが、プラグインの存在には依存していません。気にせずにシーンを配布できます。自己完結型です。スヴァらしい。



このお方、ええとブログ上では名前が見当たらないな。たぶん Alan Fregtman さんだと思います。 Alan さんありがとう。すげー便利です。


しかしこの darkvertex.com、なかなか濃いブログですね。じっくり探検せねば・・・・。




.

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

2010年4月 4日 (日)

プレイバック パート2。

去年に書いたまま放置してたやつを上げてみただけなんですがね。


XSI のビューポートを再生するとき、つまりアニメーションを確認したい時なんかで、表示上邪魔なものってあるじゃないですか。 Null とか bone とか Light とかそういうやつ。 純粋にアニメーションの確認をするのには不要ですよね。ジオメトリだけで見たいことってあるじゃないですか。

でもそのたびに Null を表示オフとか、レイヤでオフとかめんどくさいじゃないですか


Playback Part II。 邪魔者を消して再生するプラグイン。
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html

Pbp2_after_small

Pbp2_toolbar

Pbp2_ppg



必要なオブジェクトを Group に入れておいて、再生する時に Group を Isolate する、つまりGroup に入っていないオブジェクトを隠した状態にするという、そんだけのプラグインです。再生を終了させると表示状態も元に戻ります。

現在フレームから再生、最初のフレームから再生、そしてそれぞれに ALL(全コマ再生) と RT(リアルタイム再生) があるので合計4種類の再生になりますね。 俺の場合、最初のコマから再生をテンキーの 0 にショートカット割り当てています。 After Effects の RAM プレビューと同じ感覚で、というつもりです。

確かXSI 弐千拾からは、こんな機能が付いたんじゃなかったでしたっけ? オブジェクトごとのプロパティで、再生中は表示するとかしないとか決められるんだったと思います(俺はまだ七ちゃんなので使ったことないです)。 それに近いことが七ちゃんでもできるプラグイン、ということになるんでしょうかね。だから弐千拾以降を使っている人には完全に無用だと思います。たぶん。

これまで似たようなことをするものとしては、ビューポートキャプチャの時に邪魔なものをハイドする キャプちゃん!! ってやつもありました。これの、ビューポート再生バージョンという感じかなあ。

ちなみにキャプちゃん!! もこの半年くらい前に大幅に書き直して、しばらくテストに供していました。俺的には使用頻度が非常に高い。そのうちアップしようかな。






ぼうや、いったい何をおそわってきたの。

ごめんなさいごめんなさい 何も学ばずに歳を食ってしまいました
百恵たんごめんなさいごめんなさい Orz



百恵たん(;´Д`)

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

« 2010年3月 | トップページ | 2010年5月 »