なんとなく、以前作った水のヤツに水車を追加してみました。
シンプルな構成なはずが、ちょいちょい色んなところに引っかかってしまったので、メモがてら書いてきます。
作業画面はこんな感じ。レンダラはRedshiftを使っているので、View用のマテリアルとRender用のマテリアルとを切り替えて使ってます。
DOPネットワーク内はこんな感じ。コリジョンと水車と水。
Feedback Scale
DOPネットワーク内で、Flipが他のシミュレーションに影響を及ぼすためには、Flip Solver(DOP)のパラメータ”Feedback Scale”の数値を設定する必要があります。
このパラメータ、デフォルトは0になっており、他に影響を与えません。数値を上げると影響度が強くなります。たぶん1が数値的にちょうどよい値。ここでは水車をもう少し強く回したかったので2にしています。
RBD Hinge Constraint(DOP)
水車を回すために、中心を固定して回転だけ可能なRBDを作るために、RBD Hinge Constrant(DOP)を使用しました。
RBD Hinge Constraint(DOP)は、名前の通りドアの蝶番のような拘束を作成するコンストレイントです。
オブジェクトのPositionを固定し、回転方向を制限するために使用しましたが、若干、本来の用途とは違う気もしてます。
もっと他の方法で、水車の回転を実現できるきもするのですが、他に方法も思いつかなかったので、これで。
RBD Hinge Constraint(DOP)は、上図のように水車の中心を貫くように配置しています。
これで位置固定、回転を一軸に固定できます。中心からずれるとガクンガクン回るのでちょうど中心に。
誤算だったのは、このコンストレイント、RBD Packed Object(DOP)で使えなかったことですね(H18)
破壊系のシミュレーションのノリで、すべてPackedで作ってたらRBD Hinge Constraint(DOP)で挙動がおかしくなって、作り直しました。
RBD Packedはシミュレーション爆速ですが、今回のように一緒に使えないノードもあるので、気をつけなきゃなと思いました。
dopimport
今回、FLIPとRBDを一つのDOPネットワーク内で使用したのだが、これをSOPに読み込むので、ちょっと手間取ってしまいました。
FLIPはDOP I/O(SOP)で、RBDはDop Import(SOP)でSOPに読み込み(さらに言えば、RBDはオブジェクト入れ替え用にポイントだけ)。
2コのノードそれぞれでキャッシュを取ってしまうと、同じシミュレーションを2回計算する羽目になり、とっても無駄です。
「はて、どうしたものか」とちょっと考えてしまいました。
結論としては、下図のようにふたつのImportをMerge(SOP)で合わせてからキャッシュを取り、それを後でSplit(SOP)で用途に合わせて分ける。
考えてみれば当然だし、なんだったらちょくちょく使ってるはずなのに、何故かこの時は頭からすっかり消えてました。
次、また忘れないように書いとく。
以上、また次回。
コメント