今回からはパーティクルベースの流体シミュレーションの話。
- AutoDopNetwork/sphere_object 中に Particle Fluid 関係のパラメータが集まっている
- Guides タブの “Show Guide Geometry” チェックをオフにすると描画がかなり速くなる
- Ground Plane の Physical タブの値で Particle Fluid との干渉具合を調整できる
今回はさらっと機能の解説をした感じ。
Points を Fluid 中に滞在させるチュートリアル
- すごく使い勝手がいいよー
- 低解像度のシミュレーションから、より精細な動きを得られる
- scatter オペレータを使って Fluid Volume 中に Point を配置
- Embed in Fluid ボタンで Fluid Volume の動き情報を Points に転送するネットワークが作られる
- DOP Import 回りの動きが曖昧だったのでまとめてみた
- DOP Import の Imput(Points)が、AutoDopNetwork の sopgeo1 に転送される
- Geometry Copy でシミュレーション用のコピーを作る(これをしないと編集できない)
- ゴニョゴニョと Gas Solver でシミュレーション
- DOP Import が結果を 出力(Object Mask が効いているので余計なものは出力されない)
- これとは別に、温度のシミュレーション結果をキャッシュファイルに書き出しておく
- キャッシュファイルの値を RGB 値に変換する VOP SOP を作る
- チュートリアルでは file ノードをネットワークとは別に作っているけど File を読んでいることを覚えておくためだけに置いてるっぽい?
- シミュレーション結果には 8 つのボリュームが記録されている
- density : 1
- vel : 3
- rest : 3
- temperature : 1
- このうち使用するのは temperature なので Primitive Number は 7
- 最後に Copy で Points をオブジェクトに置換すると、色や回転などの値を持ったオブジェクトの集りができる
はー。今回は盛りだくさんだった。この内容を自分だけで作れるかっていうと、まだ自信が無い。
シミュレーションで計算した温度をレンダリング時の色に反映させる
- dopImport で temperature を smoke_object/render に取り込む
- シェーダネットワーク中の smokecolor を置き替える
- temperature は float 値なので、 H9.5 で導入された Ramp でRGB 値に変換する
- シェーダのパラメータGUIを編集したい時は、右上の歯車アイコンボタンを押して”Edit Parameter Interface”
- パラメータのGUIを更新するのは右クリックで”Promote Material Parameters”
- どのような温度が使われても大丈夫なように、Fit Range と Clamp で正規化しておくと便利。
- volumemax/volumemin 関数で、Volume の最大/最小値を取得できる。
null を smoke_object の中に置いただけだけど、何か影響するの?単に”こんなことできるよー”っていう説明しただけ?
前回のチュートリアルからの続き。Volume のアトリビュートを操作する。
- 今回は非常に判り辛いよー
- isooffset ノードが Volume Box を作っている。その中に見える モノは、あくまでも density というパラメータを視覚化したものらしい。
- isooffset ノードの下に name オペレータを追加して、操作したいアトリビュート名を指定する(今回はdensity,Cd.{x|y|z}(RGB))
- このオペレータ一つ一つが Volume Box を持っていて、更にその下に繋いだ Volume Mix オペレータで Voxelの値を指定する。
- 例えば、 Cd.x(R) パラメータ用のボリュームの値を 1 にすれば、赤い色のボリュームが定義される。
- 最後に4 つにわかれたツリーを Merge すると、density はそのまま density を、色は Cd.{x|y|z} の Voxel の値を使う。
- 試しに、density Volume をもう一つ作って値を 0.1 にして、元のdensity と Volume Mix で Add したらTea Pot の回りの空間も薄く色がついた。
今回は判りにくかったけれども、”density もタダのパラメータだよ”っていうことさえ理解できれば一気に腑に落ちる。むしろ、Houdini の徹底っぷりに感動さえ覚えてしまった。
Volume をレンダリングする
- Volume はVolumetric Shaderを割り当てないと、きちんとレンダリングされない
- Shader を割り当てるときも、普通はDnDでいけるけど Volumeはできない(アルファが効いてしまっているため)
- Geometry の Material タブで割り当てることができる
- 影をつけるには、Light の Shadows を指定する。Pixel Samples を上げると綺麗になるけど、遅くなる
- Mantra Node の Volume Step Size を調整するのも大事。Volume の Bounds と Resolution を元に計算しておく。
- Motion Blur を使うには、Mantra ノードの Sampling/Allow Motion Blur を ON にする
- これだけだと、影にアーティファクトが出るので Light のDepth Map Motion Blur もオンにする。
この回は結構サクサク進んだ。
余談だけど、ここで使っている Platonic Object の中身を覗いてみると吹き出しそうになる。内部で対応するプリミティブを生成するノードを全て保持していて、switch で切り替えているのだから。そのプリミティブすら、手続的に生成していたりして Houdini の徹底っぷりを実感することができる。
fluid シミュレーションの結果をジオメトリレベルのデータに出力する方法。
- smokeの発生源は、単に球を使うんじゃなくて Volume Mix を使ってちょっとだけノイズを入れるといい結果になるよー
- smokeコンテナ中のdopimport に設定されているGeometry Data Pathパラメータの名前は、Details View で確認できる
- smoke objectの Guides/Velocity/ShowGuide Geometry にチェックを入れると、Velocityを視覚化できる
- smoke object 中のDop Import を新しいジオメトリの中に Copy&Paste すれば、Velocity を視覚化したジオメトリが出来るよ(Cooooool!!)
- 手で一から作る場合を説明するよー
- Vorticle まではサクサク作る。
- その後、新しいGeometry を作って Dop Import を作る。
- DOP Network に /obj/AutoDopNetwork、Object Mask に`dopobjscreatedby(“/obj/AutoDopNetwork/smoke”)`�を指定、import Style を “Fetch Geometry from DOP Network” にする。
- Geometry Data Path に vorticles を指定。
できた!!これはすごい。面白い!!
生成した煙を様々な方法で制御するチュートリアル。
- Motion DOP の Velocity
- Pump Relationship DOP を使ってVelocityを与える(オブジェクトの形に依存しない)
- Drive Simulation タブのツールを使う (今回は Wind Force)
- Vorticle(Voxel+Particle?)。これがかなりイカす感じ。Voxel ベースの計算結果がParticle の動きに影響する仕組み。
- 何故かチュートリアル中に作成されるネットワークと手元で作られるものが一致しないけど結果は大丈夫なので気にしない。
- リジッドボディオブジェクトの動きに影響させる。Great!
- いろいろ試してたら煙がオブジェクトに反応しなくなった。”あれれ〜”と思って調べると、Merge DOPに入力する順番を入れ替えてしまったのがよくなかったみたい。Affector Relationship の値が Mutual(相互)になっているのに、実際は入力順に依存するのはちょっと納得がいかない。
- pin constraint を作った時に Merge DOP の入力が入れ換わってしまったみたい。ふむー。
- あーわかった。Network 上で “r”キー(入力入れ替えの HotKey)を押したからだ。3D View 上だと Trans だから気をつけないとハマるなぁ。
今日はここまで。いろいろ試してると、チュートリアル一つで一時間とか平気でかかる感じがする。先は長いぞっと。
前回に引き続き、オブジェクトから煙を生成するチュートリアル。煙を生成するだけではなく、noize()関数を使って作った煙との演算結果を使って新しい形を作ったりしている。
- 前回のレッスンの内容だと、問題があることがあるよー。
- 何が問題なのか、良く聞き取れない。煙を垂れ流すのじゃなく、オブジェクトの形の煙を作りたいこともあるんだよ!!って言ってる気がする。
- 今回は Smoke from Object ボタンを使って煙を作る。
- torus Object 内の isoOffset surface Node でボリュームを作成している。iso Offset は、入力されたジオメトリと指定された補完方法を基に何らかの形を定義する。今回は Fog Volume モードなので内部は満たされ、サーフェースの距離に応じて薄くなるボリュームが定義される。
- isoOffset の結果は、そのままボリュームとして扱うだけではなく、温度の定義にも使っている(Volume Ranp)。Ramp の値を調節することで、熱い煙も冷い煙も即座に作ることができる。
- Volume Mixを使うと、Volume に対して加減算などの演算ができる。但し、voxel しか演算対象にならないようで、オブジェクトに対しての演算はできないみたい。→Boolean オペレータがあるから、そっちを使えばOK.
Smoke Container を使って Voxel fluid シミュレーションをするための解説。最後にシミュレーション結果をキャッシュファイルに格納するところまで扱っている。
- コンテナを作るだけじゃ何も起きないよー(コンテナは只のコンテナだからね!)
- Container や Source を用意したら、merge DOP で一まとめにして、その先に繋いだオペレータではdopobjscreatedby() 関数で Container や Source を指定している。
- merge DOP で一まとめにしているといっても、データが完全にごちゃまぜになるわけではなく、単に小さい箱の集まりを大きな箱に詰め込んでいるイメージ。だからネットワークの先で必要なデータを寄り分けることができる。
- Smoke Solver DOP の Guide パラメータをいじることで、密度や温度など、表示方法をいろいろ変えることができる。
- 温度の単位は何? ℃でいいのかな?
- シミュレーション結果を保存するのには3(2?)種類の方法がある。
- File DOP を使う
- Smoke ジオメトリ の render Node に ROP Output Driver を繋げて使う
- render Node には Render flag のみが立っている(Ctrl+click で立てることができる)。
- ROP Output Driver の Render ボタンを押すとシミュレーション開始
- シミュレーションが終ったら File DOP で読み込んで、Blast に繋げることで再生できる。
ここはイントロダクションなので、さらっと流すかんじ。aero dynamics と hydro dynamics の違いとかを Voxel Fluids とParticle Fluid の違いを例に説明している。