ここ数日忙しかった仕事も軽く一区切りついたので Houdini の勉強も再開。と言ってもちょっと疲れているので今日は前半のみ。
- このチュートリアルは前半は Fluid とは直接関係がない、Houdini でのオブジェクトの作り方講座。正直、ここら辺は完全にすっ飛ばしてFX系の機能ばかりつまみ食いしているので助かる。
- tube から cookie オペレータやらいろいろ駆使してモデルの作成
- Geometry→DOP→Geometry とデータをやりとりしながら作業
- objレベルでネットワークを繋げるのは親子関係を作る時だけだと思っていたら、データの流れをわかりやすくするためにも使えるのか。なるほどー。
- オペレータ一つ一つの機能は調べないとわからないけど、ムービーを見ながら作業してても、今自分が何をやっているか程度は理解できるようになっているみたいだし、次に何をしないといけないのかも大体予想できるようになってきた
そんなこんなで、particle を作ってファイルに書き出す直前で今日のチュートリアルは終了。
デモリールにも採用されている、ゲル状のオブジェクトを切るというチュートリアル。
- Object Merge+ROP Output Driver で初期の Particle Fluids をディスクに書き出している
- Dop Import を使わない理由は?→試しに DOP Import で置き替えてみたらちゃんと動く
- 結局、特にどちらを使わないといけないということは無さそう。ただ、Object Merge を使った方がスマートに指定できる
- いろいろとファイルに書き出したりしているものの、結局Object Merge→Particle Fluid Surface と処理しているだけなのか
- となると、Particle Fluid Solver のパラメータがキモになるのかー
- viscosity(粘度)/Elasticity(弾性)/Plasticity(可塑性)、このあたりのパラメータの関係が直感的に理解できない…
いろいろ迷走して、Particle Fluid Solver の中身やら RBD Solver の詳細やらを調べ始めてしまったものの、結局私の手にはまだ負えないところまで行ってしまったらしく混乱するだけだった。
とにかく、Elasticity とか Plasticity を使うということだけは覚えておこう。
Particle Fluid の発生方法と、扱うことのできるパラメータの解説
- Particle Fluid Emitter の Source SOP で発生源のジオメトリを指定する
- Use Stream Emission をオフにして Emission Type を Volume にするとボリュームからパーティクルを発生させることができる
- その他パーティクル 関係のパラメータ諸々
今回も機能解説的な感じなので、さらっとおわり。
今回からはパーティクルベースの流体シミュレーションの話。
- AutoDopNetwork/sphere_object 中に Particle Fluid 関係のパラメータが集まっている
- Guides タブの “Show Guide Geometry” チェックをオフにすると描画がかなり速くなる
- Ground Plane の Physical タブの値で Particle Fluid との干渉具合を調整できる
今回はさらっと機能の解説をした感じ。
Voxel Fluid を扱うためのチュートリアルの最後。これまでの内容をきちんと理解していれば、さらっと流せる内容になっている。
- とりあえずVoxel Fluid とそれに干渉する RBD Object を作る
- RBD Object だけに重力が影響するようにしたほうが結果が判りやすい感じ
- Create Particle シェルフの Emitter ボタンで Particle Source を作る。
- できたParticle を選んで、Drive Particle シェルフの Advect by Volume をクリック
- Voxel Fluid の計算結果がParticle に影響するようになる
- POP Network 中にできた Advect By Volumes ノードが全てよろしくやってくれるらしい。
- Velocity Volumes パラメータ中の文がよくわからない。ちゃんと調べないと。
これで Voxel Fluid 系のチュートリアルは一段落。今後は 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 を指定。
できた!!これはすごい。面白い!!