« 自己完結 Curve Length。 | トップページ | 骨プリミティブ問題。 »

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.






.

|

« 自己完結 Curve Length。 | トップページ | 骨プリミティブ問題。 »

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: パーティクルのコリジョン。:

« 自己完結 Curve Length。 | トップページ | 骨プリミティブ問題。 »