2012年1月14日土曜日

ThinkingParticlesをつかってアニメーションオブジェクトを差し替えてみる。

TPを使ってインタラクティブにオブジェクトを差し替える作例です。

自分がTPを覚えようとおもったのはこういったことが効率的に出来ればいいなとおもったのがきっかけだったりします。
といっても難しいことは何も無いのですが、いくつか発見があり、忘れないようにしなければならないことがあったので記事にしました。

まずはムービーを見てください。


TP_AnimReplaceTest from take-imazu on Vimeo.


では解説です。

◆ Planeに配置されたパーティクルに対してアニメーションされたオブジェクトを割り当てています。
(配置しているオブジェクトはPlaneの脇にあるオブジェクトです)
Sphereが通り過ぎると(今回はDistansを使ってます)アニメーションが変わっているのが解るとおもいます。
これはアニメーションが変わったというよりオブジェクトそのものを差し替えています。
よく見ていただくと、BoxやTeapotのポリゴン数が変わっています。


◆まずはGenerateダイナミクスです。
ここはごく普通にPlaneオブジェクトのサーフェイスにPositionBornでパーティクルを配置しています。
(NodeヘルパーでPlaneオブジェクトを指定、SurfacePosヘルパーでFaceを指定)


◆次にShapeA_Assignダイナミクスです。
ここもごく普通にGeomInstanceノードでパーティクルに対してシーン内のオブジェクト割り当てているだけです。


◆次はShape-A_to_Bダイナミクスです。
ここではShapeAグループのパーティクルをSphereが近づくとグループBに送るようにしています。
(NodeヘルパーでSphereを指定、Distansで距離を指定)
今回はDistansノードを使用していますが、場合によってはInMeshノードでもいいと思います。
ここで大事なのはDistansノードでグループBに送ると同時にParticleDateノードでAgeを0にしてあげていることです。
(FrameヘルパーノードでAgeを0にしています。)

これはSphereオブジェクトが通り過ぎたときに差し替えたオブジェクトのアニメーションを0フレームからスタートさせたかったためです。
これが無いとグループBに送られた時のフレームでアニメーションを参照してしまい、アニメーションが途中から始まってしまいます。
今回ここをどう処理するか一番悩まされました。出来上がってみるととても単純でしたが…。

◆最後にShapeB_Assignダイナミクスです。
ここはShapeBグループに送られた後(Sphereオブジェクトが通り過ぎた後)のオブジェクトを割り当てなおしています。

◆ここで重要なのはShapeA_AssignダイナミクスのときGeomInstanceノードで割り当てたオブジェクトの順番と差し替えたいオブジェクトの指定する順番をそろえてあげることです。
ただし、そろえるだけでは駄目でGeomInstanceノードでShapeNumberとGroupノードをつなげてあげましょう。

オブジェクトの指定する順番をそろえなかったり、ShapeNumbeをつなげていないとオブジェクトが意図しないオブジェクトと指し代わってしまいます。

◆解説は以上です。
今回これをやりたかったのは、キャラクターが草むらを進むときに草を揺らしたりするアニメーションをテストしたかったのですが、草の倒れる方向や倒れるリアクションに自由度を持たせて自然に見せるにはもっと複雑な仕組みが必要そうです。

現時点の自分ではちょっと手に負えないかな…。
悔しいのでいずれ出来るようにがんばりたいとおもいます。

しかしヒキ絵だったり、たとえばキャラクターが歩いているときに足元で逃げる小さな虫とかに使う分にはそんなに難しく無さそうです。

ノードの詳しい解説などがもっときちんとできるようにもなっていければとおもいます。
解りづらい解説かとはおもいますが、少しでも何かのお役に立てれば幸いです。

0 件のコメント:

コメントを投稿