【Houdini】途中からシミュレーション結果に切り替える
Verは17.5.173です
少し久しぶりな気もする、Houdiniの内容です。
タイトルの通り、途中のフレームからシミュレーション結果を読み込みます。
サムネイル見たら予想はできそうですが、RBDによるシミュレーションを今回使用しました。
途中でシュミレーションに切り替えるやつ pic.twitter.com/PJKY3HHpRu
— moyasi@マテフォの中の人 (@torisutamoyasi) April 21, 2019
具体的にはこの様なものを作りました。
今回の動き、最初の伸びる部分は、SOPで動きを作っています。
高さなどを、操作できるようにしておいて、キーフレームで、時間に応じて変形するように作っています。
今回、例えとしてBoxを使います。
今回の目的としては
SOPで横に移動する動きの後に
DOPのシミュレーションによって、Boxが落下してバラバラになる
というのを作ります。
Boxの下にTransformを接続し
TranlateのZを時間で動くようにしました。
当然ですが、Z軸に向かってBoxが動きます。
この後にシミュレーションも入れるので、大きめにして、宙にも浮かせています。
シミュレーションなので、ボロノイで割る処理も追加しておきます。
Scatterのポイント数は100にしています。
この時点でシミュレーションを追加します。
シェルフから作りました。
DOPの中に衝突用のメッシュは置いておきましょう、特に理由がなければ
GroundPlaneで良いと思います。
SOPに戻り、シミュレーションを確認すると、このように割れています...が
Transformによって、時間で移動させていた部分が、シミュレーション結果に入っていません。
右上のワイヤーフレームが、Transformにて移動させた部分になります。
シミュレーションに読み込む際に、最初のフレームの情報を読み込んで
そこからシミュレーションを開始する用な仕様になっている様です。
シミュレーションの結果の後から、動きをSOPで追加はできるのですが。
場合によっては、それでは不都合な場合がどうしても出てくると思います。
なので、TimeShiftというノードを使います。
このノードの下にある三つのノードは、シェルフでシミュレーション追加したときに自動で追加されてものです。
ここのFrameという部分は、何フレーム目を表示するか?を設定する事ができます。
デフォルトでは、現在のフレーム数と連動しています。
ここを、30の固定にすると、常に30フレーム目の情報を持ってくることができます。
今回のように接続すると
OUTの前にあるノードで30フレームの位置から、シミュレーションを開始してくれます。
但し、TimeShiftで表示するフレーム数を固定してしまうので。
Transformで横に動かした動きは、30フレーム目を常に取得してしまうので
横への移動が一切なくなってしまいます。
なので、1~29フレーム目は、Transformで動かす挙動を作ることができません。
また、シミュレーションが1フレーム目から始まってしまうので
横に移動してから、という動きも作れなくなってしまいます。
TimeShiftはフレーム数を固定してしまっているので。
最初の1~29フレーム目では、TimeShiftを通らないように、この様にしました。
新しくOUT_simが出来ていますが
これはシミュレーションの結果を参照しやすくするために作りました。
switchノードによって、1~29フレームと、30フレームで読み込むノードを切り替えます。
29フレーム目に設定したら、switchノードのSelectInputに0のキーフレームを打ちます。
続けて、30フレーム目に1のキーフレームを打ちます。
これにより、フレーム数により、接続情報が切り替わるようになります。
切り替わるまでは出来ましたが
シミュレーションは1フレーム目から始まっていますので
動きが可笑しくなると思います。
上のBoxが29フレーム目の位置で
下のBoxが30フレーム目の位置になります。
これは、シミュレーションの結果を途中から表示してしまっているのが原因となります。
これの対処の為に、もう一つTimeShiftを追加しましょう。
今回は、30フレーム目から、1フレーム目のシミュレーション結果が欲しいので
$F - 29
と設定します、$Fが現在のフレーム数なので、そこから29を引き算しています。
これにより、30フレーム目にシミュレーションの1フレーム目を読み込むことができます。
今回はここまでとなります。