ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

Billowy Smokeを使った煙のチュートリアル(前半)

■Introduction to Houdini - PyroFX for FumeFX Artists

こちらのチュートリアルをやってみました。
同じ動画をvimeoでもアップされています。

煙や炎を学びたい人には最初にやるのに良いかも知れません。

 

はじめに


手順をメモっています。
和訳は大事そうな部分をバイリンガルな友人に聞きつつ行いました。
あとは想像なので間違っている部分もあるかと思いますが、その際にはそっとコメントなどで教えて頂ければ嬉しいです!

手元での使用バージョンはHoudini15
動画内のバージョンと食い違いがある部分は、Houdini15での表記に差し替えて書いています。

やたらカチカチと大きなクリック音がするのと、途中で犬の悲鳴に似た鳴き声が聞こえるのが気になって仕方ありませんが‥

 

手順についてのメモ(前半)


0:45
ビューポートの説明
ネットワークエディター上でのTabメニューで Geometry ⇒ 立方体を作成(XYZの文字入り)
スペースキーとマウスでカメラ操作が可能な点について解説
Sキーで選択ツールON

Geometryノードをダブルクリックして中に入る
1つだけ存在するノードを消し、代わりにSphereノードを作成
※デフォルト設定だとシェルフで作成したプリミティブは最上層のオブジェクトレベル/Sceneに作成されますが、Tabメニューから選べば直接現在の階層内に作成できます

2:05
ノード上で中ボタンを押すと情報が表示される
sphereノードはプリミティブ数が1つであることが確認できる

パラメータエディターでPrimitive TypeをPolygonに変える
Frequency(周波数/頻度/回数)を6にして分割数を増やす
ワイヤーフレームが表示されていないならShift + Wで表示できます

2:41
Edit>Preference>Hip File Options
Houdiniでの単位をここで変えることが可能
※デフォルトで長さの単位はメートル / 重さはキログラム

3:30
TabメニューでTransformを作成
左クリックでノード同士を繋げられる
ノード左右のフラグの解説
TabメニューでBox ⇒ 立方体を作成
sphereノードのテンプレート表示を解説後、Boxは消去

4:43
TransformノードのUniform ScaleXYZ均一にスケール調整
Iキー(IN?)でノード内の階層に入る
Uキー(UP?)でひとつ上の階層に上がる
オブジェクトレベルに戻ってノードの名前をemitterに変更

5:30
球体モデルを選択した状態で、シェルフのPyro Fx>Billowy Smoke(大波の煙)を選択
すると球体から煙を発生させるための膨大なネットワークが自動的に構築される
※選択していない場合は発生源となるオブジェクトを選択してEnterを押すよう促されます

ネットワークエディタ上でLキーを押すとノード整理
シーンビュー上でSpace + Fで選択中のオブジェクトにビューがフォーカスする
Space + Gでも同様 ※違いは何‥?
右クリックメニューで選択関係のショートカットを確認できる

7:28
アニメーションを再生すると煙が発生する
フラットな見た目になってしまっているのでライトを足す

7:40
シェルフLight and Cameras>Area LightをCtrl押しながらクリック
※Ctrlを押しながらだとシーンビューの視点の位置&角度でライトが作成されます

8:05
もう1つエリアライトを設置
色を水色に変える
Intensity(ライトの強さ)を弱くする

8:25
ビューポート右上の「no cam」からLook Through Light>arealight2を選択
ライト視点モードになる
しかしビューの視点を動かすとライト視点モードが解除されてしまう
ビューポート右端のバーのカギアイコン(Lock Camera)をクリックしてビューをロックする
するとライト視点モードでライトの位置を自由に調整できる
最後にロックを外せばOK
ライトの強さを微調整

9:28
再度アニメーションを再生してみる
※タイムラインで青くなった部分は計算済み
バウンディングボックスは煙の発生に応じて自動的に大きくなり指定サイズで止まる

9:50
emitterノード内(ジオメトリレベル)に入る
Smooth Shadedに変えるとバウンディングボックスが消え‥ません!(Houdini15)
グリッド表示をOFFにする
表示をHide Other Objectに切り替えると選択しているノード以外のオブジェクトの表示が消える
transform1ノードを選択して再生すると煙が広がらないのが確認できる
transform1の表示フラグをONにすると球体を確認できる
transform1より下のノード群はBillowy Smokeを追加した際に生成されたもの
create_density_volumeを選択すると球状に煙が発生しているのが確認できる
ノード上で中ボタンで情報を見て密度の値など確認

11:22
最上層(オブジェクトレベル/Scene)に戻る
emitterノードは名前を変えたが、ノードを選択してパラメータエディタの左上に本来の名前(Geometry)が表示される
arealight1ノードの正体は"Light"でpyro_simは"DOP Network"であることが分かる
DOP(ドップ)はDynamicsOperatorの略で、パーティクル、リジッドボディー、クロス、ファー、流体などを扱う

11:55
pyro_simノード内に入る(DOP/Dynamicsレベル)
pyroという名前のノードを選択すると正体は"Smoke Object"であることが分かる
そこでTabメニューからSmoke Objectを作成して、同じものであることを確認、消去

12:35
resize_containerの中に入る ※グレーアウトして触れなくなっている
今度はpyroの中に入る
"Empty Object"であるemptyobject7ノードを確認
pyroノードは標準機能として用意されたデジタルアセットであることの説明
※デジタルアセットとは調整用のパラメータを表に出して機能化したノード群のこと

13:08
pyrosolver1ノードは巨大なデジタルアセットである
見易くするためにネットワークエディタ右上の最大化ボタンを押して最大化して確認
"advect_fuel_modulate_heat"のノード群は燃料の移流や熱の制御を行う
"shape_operators_and_forces"のノード群は形状と力の制御を行う
"sharpening_dissipation"のノード群は尖らせながら細かく千切れさせる(?)
"combustion"はノード群は燃焼の制御を行うが、今回は炎を発生させないので説明しない

最大化を一旦戻す
パラメータエディタのタブ上で右クリックするとタブを切り替えられるリストが開く
もう一度ネットワークを最大化
最大化している時でもパラメータを変えたい時はB?(V?)キーでパラメータエディタを右上に表示できる(Houdini15では常に表示される仕様?)

15:18
TabメニューからPyro Solverノードを作成、こちらもデジタルアセット
フラグについて解説

ノードの入力ポートは左から右へ順に計算され、ノードの繋がりは上から下に順に計算される
※Houdiniでは計算のことをCookと言うようです
入力ポート上で中ボタンを押し情報を見ると何を入力するポートなのかが分かる
1つめ「Object」は発生させるオブジェクトを入力する(?)
何かオブジェクトを繋げる必要がある
2つめ「Pre-solve」はsolvingする前の計算
3つめ「Velocity Update」は加速度の更新
4つめ「Advection」(移流)はボリュームに対して乱流の追加効果を加える
ボリュームじゃないとダメ
5つめ「Sourcing(post-solve)」は発生するボリュームを入力する

最上層のemitterノード内の最後に繋いでいるNullノードに「OUT_density」と入力されている
※こちらを変数として扱いPyro Solverのソースとして参照している様子

19:00
resize_containerノードの説明
Reference Fieldの説明
Paddingでパーティクル同士の距離やボリュームの量を調整
Field Cutoffの説明

21:04
pyroノードのTwo Dimensionalにチェックを入れると二次元の流体になる
Division MethodをBy SizeにしてDivision Sizeを変えるとコンテナの分割数が変わる
Non SquareにするとDivisionsの値通りにXYZそれぞれ分割される
X Axis、Max Axisの解説
Max Axisは最も値の大きい軸をUniform Divisionの数で分割し、他の軸はそれに合わせる(XとZは5なので50分割される)
※確認する際は現在のフレームを先頭にしないと反映されないかも

23:10
中ボタンで情報を表示
デジタルアセットにバージョンがありOperator typeの項目でバージョンが確認できる
また、参照しているスクリプトのパスが確認できる


後半へ続く!