COOK BOOK

houdini delicious recipes

Recipe

Skyline Smoke


タイトルはズバリ、今年11月12日公開予定のハリウッド映画「Skyline」の光る筋のことです。
トレーラーが公開されているので、どなたでも見ることが出来ます。
Skyline
トレーラーを見ながら感じたことは、こういう系のエフェクトって最近やたら多いなぁってことです。
こういう系というのは、krakatoa的な、モヤモヤ系のエフェクト全般です。
僕が勝手に思ってるだけですけど。

3DSMAXなら、お手の物でしょう。うらやましい!
Houdiniだと、どんな風にアプローチすべきだろうと考えた結果、僕の最近の十八番のDOP to POPかな〜、と思いました。

ちょうど前回の記事に書いたことだし、別バージョンとして作ってみようかと思い、試してみました。

なかなか難しいですね。
やはり、扱えるパーティクルの量に圧倒的な開きがあります。

パーティクルのみでやろうと思うと太刀打ちできません。

とりあえず、それらしく見えるように軽く調整して、コンポジットでごまかします。

結果論ですが、もう少しシミュレーション全体のレゾリューションを上げて、パーティクルを細かくレンダリングしてあげれば、さらによかったかもしれないですね。
少しボリューミーな感じになってしまいました。
本家はいい感じにウィスピーで、なかなかそれに近づけるのは難しかったです。

画の半分は、Optical Flareに助けられてる感はありますね、ラッキーです。



さて、簡単に解説していきます。

今回の大元になるシミュレーションは、PyroFX Wispy Smokeを使用しました。
3本の軌跡を作りたかったので、一括でコンテナを使うのではなく、3つに分けました。
少しコストが掛かるように感じますが、各々調整したり、レゾリューションを上げたりする場合、このほうが安価だと考えました。

R002_dops


当初、煙をちょちょっといじればそれらしくなるかと思ったのですが、そうは問屋がおろしてくれませんでしたw

念のため、のちのち使えるかもしれないので、UpResを試しつつ作業を進めます。

 PyroFXやUpResについては、今後詳しく解説出来るといいですね。
僕もまだほとんど未知の世界ですね。難しい。

ポイントになる点は、Velocity Fieldの準備と、UpResを含むFluid Simulationです。

まず、ソースに対しPyroをくっつけます。
このあたりは、シェルフからいけるので割愛します。

Pyroにはかなり細かいNoiseの設定があります。
特に重要なのは、Noiseの設定が2段階であるということです。
Pyroの強みはWaveletを利用してUpResするということにあります。
そのために、Low-Highで2段階の設定が必要になります。

ここはトライアンドエラーを繰り返していい感じに持っていくしかないですね。

うねりを強くするのか、サラッと流すのか、設定するための目標を意識して調整しましょう。

 今回は、多少細かめにうねりを加えました。

詳細はPyroを解明する際に取っておきます。(いつやるかはわからないですがw)

気をつけなければならない点があります。

Rest Positionに注意が必要です!
これは僕も全然気にかけていなかった部分で、レンダリングして気づいたんですが、Rest Positionがデフォルトだと、50フレームでリセットされるってことです。
これ、本当かwって思いました。
とりあえず今回は詳しく調べてないですけど、尺以上のフレームを入れて回避しました。

これ0とか-1でリセットしないとかできそうですけどね…調べねば。
ノイズを使うシェーダを使用しないでレンダリングする場合は関係ないですけど、ちゃんと設定しないと気持ち悪いですねw

どうしてこんな設定がデフォルトであるかは不明です。
何か僕が勘違いしている可能性も大いにあります。


R002_restpos




UpResの仕組みを簡単に図解します。仕組みと言っても流れのことですが。

 R002_whatupres


おなじみのVelocity抽出を今回はLowからしました。
Upからすると、結構重くなるので避けました。

が!しかし、結果、もう少しレゾリューションが欲しかったですね・・・ コンポジット時にそう思いました。
次回は重くともチャレンジしてみようと思います。


さて、今回のメインディッシュであるパーティクルは、(Pyroはちょっと豪華な前菜ですw)色付けされています。
これがメインディッシュたる所以と言ってもいいかもしれないです。

方法は多々ありますが、面白かったので採用です。

いつもならパーティクルを放出したあとに色付します。
ただ今回は、ソース自体に色をつけておいて、その部分から発生したパーティクルがあらかじめ着色された状態で放出されるようにしておきます。
なぜそうしたかというと、当初はボリューミーにライティングしようと思ったのですが、重いんです。
量が量ですので。ですから、少しでも立体感が欲しいので、ノイズで着色してごまかしました。
今回はそういった理由ですが、とてもベーシックなアプローチなので、いろんな場面で応用できますね!

R002_popcolor


レンダリングをする際に、軽くしたい場合はMantra Delayed Loadを使用して、中間ファイルを軽量化しましょう。
今回はちょっと突貫工事の為やってませんが。

本来は突貫工事の場合にはあえてちゃんと設定すべき項目ですね。
間際で何が起こるかわかりませんから。

又の機会に、Renderの細かいTipsをやりたいですね。

プロシージャルなレンダリングは気持ちがイイです。



最後にカメラの設定ですが、これもコンポジット時に必要だと感じ、追加で設定しなおしました。

レンズフレア用に出した素材が、フレームインする際、途切れてしまっていると、いきなり光りだしてしまいます。

それだとあまりうまくないので、余白を入れてあげます。
余白をつけるためには、画角を変えずにレゾリューションを上げる必要があります。

Houdiniの場合、カメラにレンダリングのレゾリューションがあります。
それがMayaと大きく異なる点です。
Mayaにはカメラスケールがあるので、余白をつけることは簡単です。
Houdiniだと、少し計算してあげる必要がありますね。

その設定方法ですが、まずもともとのカメラをリファレンスコピーします。
そうすることで、もともとのカメラ情報を維持しつつ、それ用のカメラを作成します。

次に余白を付けるための係数を定義します。
Houdiniのパラメータは自由にスペアを追加できるので、その機能を使ってカメラスケールのパラメータを追加してしまいましょう!

パラメータの右端上の方に、ギアのアイコンがあります。
そこから、Edit Parameter Interfaceを選択します。

R002_addparam1


Edit Parameter Interfaceでは、様々なデータタイプのパラメータを追加できます。
今回は、スケールの係数を作りたいので、Floatタイプでいいでしょう。
パラメータ名などを設定したら、係数の出来上がりです。

R002_addparam2


計算方法は単純です。
係数をResolutionに乗算します。
次に、係数をFocal Lengthに除算します。
これで画角を変えず、余白を作ることが出来ます。

もちろんDOFなどの、フィジカルな設定をしていれば破綻してしまいますので、 あくまでもこういう場合にのみ使用できます。

係数は、先程追加したパラメータのチャンネルを持ってきます。
今回は"camscale"と定義したので、チャンネル関数を使って、

ch("camscale")

で呼び出すことが出来ます。
このようにしておけば、複数のパラメータに係数を流しても、スペアパラメータ一括で制御することが出来ますね。

R002_camcal


なぜかカメラにアニメーション付けてしまったんですが、これは当初、背景を入れる前提で進めていた時の名残です。
まぁ、これはこれでよしとします。
ラスト、コンポジット調整して終了です。
ほぼコンポジットのおかげですけど。




デザートにBreakdownはいかがでしょう。





このレシピのデータです。

download_icon



JOBという環境変数を設定します。
メニューのEdit > Aliases and Variables > Variablesから、 JOBのValueをプロジェクトが置いてある場所のパスを指定してあげます。

それから、前回書いてなかったんですが、Windows環境で作業する場合、Unixコマンドが走るようにしておく必要があります。
僕は大体、レンダリングの際にpreRender,postRenderでスクリプトを走らせています。

コマンドはデータ内に.cmdファイルが有ります。
レンダーイメージのディレクトリに、mantraの名前でディレクトリを自動生成するためのunixコマンd、"mkdir"があります。

Houdiniは自動的に作ってはくれないので、僕はこれで回避していますが、unixコマンドが走らないとディレクトリが作れず、パスを参照できないためエラーになります。

回避するために、unixコマンドが走るよう、cygwinなどで設定しておきましょう。
面倒であれば、イメージパスを変えるか、あらかじめディレクトリ内にmantraと同名のディレクトリを作っておくなどしてください。

作業ディレクトリの癖とかもあるので、本来なら$HIPなどを利用したほうが手っ取り早いかもしれないですが・・・

人に配布するにはなかなか難しい壁がありますね。

それ故、わからないことがあればどんどん聞いて欲しいです。

ダイレクトにメッセージくれても構わないです!

Fire Ball



前回軽く触れた、シミュレーションをパーティクルに流しこむ方法を、少し詳しめに解説します。

この方法は、最近の僕の流行りで、これでもかって言うほど使ってます。
バカの一つ覚えってやつです。

普通にパーティクルを放出するのに少し飽きてしまったっていうのもありますし、フルイドを使ってみたいって言うのもあります。
僕的には非常にナイスなハイブリッド手法と言えるわけです。

とりあえず、何かしらの動画がないと始まらないと思ったので、簡単なものを作ってみました。

全然わからないです・・・すみません。
下手にカメラ動かしたので、余計に分かりづらいですね。
さらには、カメラワークのヘタさを露呈してしまっているという二重苦です。
そこはそっとしておいてくださいw

サイドから見ると少しはフルイドシミュレーションの面影があるんですが・・・。
まぁなにはともあれ、こんな感じで、演算結果を転送できますよってことです。

ポイントは、シミュレーション時に、Velocityを抽出するということです。
今回はSmoke Solverを使用しています。
その時に、Smoke Object > Guides > VisualizationからVelocityにチェックします。

V_vis


そうすることで、Velocityを同時に表示することが出来ます。
その時に大切な点は、Velocityタブの"Use Barbs on Vectors"と"Use Streamers"チェックを外すことです。

V_set


これによって、計算されるVelocityのベクトルは2点構成になって、のちのち変換する時に使用できます。
実際、この時点ではVelocityを可視化しているに過ぎず、アトリビュートとしてVelocityを持っていません。このただのラインをその2点を利用してベクトルをVelocityに変換してあげます。
そもそもUse Barbs on Vectors"って一体…それは、先っちょにカエシを付けますよ〜ってことです。
それによって、方向を明らかにするためです。


V_barbs


"Use Streamers"にいたっては、利用出来る気がしませんね。いわゆる流れを可視化していて、風洞実験的な雰囲気を醸し出したい時に使えます。これは断面になっていて、オフセットもかけられます。
画は面白いので、抽象的なアートとして再利用できそうですねw

抽出したVisualizationをDOP ImportでSOPに引っ張ってきます。
Visualizationにチェックをすることで、Geometry Data Pathでインポート出来ます。

dopimport


インポートしたデータを始点と終点に切り分けます。
Delete SOP のDelete by Rangeなどを利用すればすぐですね。幸い、ポイント番号はきっちり並んでいます。
万が一(ないけど)並んでない場合は、Sort SOPでBy vertex orderで並び替えてあげればOKなハズです。
イレギュラーな方法では、Carve SOPも使えます。
とまぁ、こんな感じで切り分けたら、終点から始点の座標を引き算してあげます。
これは簡単なベクトルの計算です。そうすることで、Visualizationしたライン上にベクトルを計算してあげることが出来ます。それをVelocityに流しこんであげればいいわけです。

vop


これでVelocityの変換は完了です。

次は流し込みの作業に入ります。
と言っても、とても簡単で、AttribTransfer POPを使用すれば一発です。
一個だけ気をつけなくてはいけないのが、Distance Thresholdの値です。
これは、影響範囲をどうするかという項目ですが、この範囲を間違えるとせっかくのシミュレーションの意味がありません。

では、どのような値を流し込むか説明します。
Smoke Objectのコンテナのサイズとレゾリューションを利用します。
これによって、Visualizationした時のVelocityのグリッドの最小距離を導き出せます。
今回はサイズの最大が20で分割が80ですので、
20 / 80 = 0.25
ということで、Distance Threshold = 0.25ということになります。

さて、これでほぼ解説は終了です。
この方法はいろいろな場面で利用出来ると思います。
もちろん、もっと最適な方法もあると思います。発見次第報告したいと思います。



このレシピのデータです。

download_icon



今後もこんな感じでデータを配布していければと思うんですが、さすがにシミュレーションのキャッシュまでは無理なので、そこは各々でやっていただければと思います。

また、これは非常に重要ですが、僕のやり方でJOBという変数を使ってプロジェクト管理をしています。方法は幾つもありますが、僕はこの方法を使っています。

JOBという環境変数を設定します。
メニューのEdit > Aliases and Variables > Variablesから、
JOBのValueをプロジェクトが置いてある場所のパスを指定してあげます。
現状だと、僕の環境がそのまま入っています。

これで、絶対パスを常に入力する必要がなくなり、相対パスで管理できます。
$HIPなどを使えば、勝手にhipがある場所を持ってこれますが、僕はhipのディレクトリが別に欲しいので、$JOBで管理しています。データの中身は、ディレクトリ構造を保ったままのからディレクトリが存在しますが、そのままで勝手に吐出されるようになっています。

もちろん、各自好きな方法に設定しなおしてもらって結構です。

おまけで、簡単なブレイクダウンです。


何か不明な点があればコメントください!

Profile
  • ライブドアブログ