炎プロップ作成シーン配布＆解説

この記事はHoudini Advent Calendar 2020の22日目の記事です。

# 序文
* クリスマスプレゼント…というには少し早いですが、このような炎プロップを作る時に自分がよく使うシーン（アセット）を配布致します。
![T_ys_pyro_fire_02-06_matome_cmp_edit_02_h.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/dde51f6c-602d-610d-b2a8-b7fd8782dded.gif)

# 趣旨 
* とても良いことなのですが、Houdiniはメジャー・マイナー問わずバージョンアップ毎にどんどん機能がアップデートされています。
* 炎を作るPyro系のギミックも16.5以前や17系・18系・18.5系とそれぞれバージョンアップが行われており、慣れたHoudinistでしたらバージョンアップで追加・改修された要素の長所短所を理解し、使い分けることは造作もないことでしょう。
* しかし、そうした側面故にこれから勉強を始めようと思っている方は情報量の洪水で混乱したり、レガシーだけど有益な情報が共有されずに埋もれていくという事もあるでしょう。
* 本アセットはHoudini17の頃にベースを作成し、その後も17.5→18→18.5とバージョンが上がる毎に追加された良さげな要素を追加して改修していったものになります。なのでベースはレガシーで、時代と共に変化していったもののサンプルの一つになると思います。また「昔はこういう仕組みでやっていたことがあった」「レガシーだけど未だに使える」テクニックの資料にもなると思われます。
* 「使い込んだアセットをホイホイ配布して良いの？」と思われるかもしれません。ですが、Houdiniの良いところの一つは技術やシーンをシェアし、それによりコミュニティ全体がグレードアップされる好循環の文化を保持している点だと思います。自分も初学者の頃は先人の様々なシーンやアセットに助けられたので、今度は自分もその輪の一員として貢献しようと考えた次第です。


#シーン説明

### 基本部分

* シーンの基本的な構造は、SideFX社公式サイトに掲載されている私の[PyroTutorial](https://www.sidefx.com/ja/tutorials/pyrobasictutorial-fire1/)と同じです。
* 1から構造を把握したい場合や、当時のテクニックを参照・確認したい場合は上記チュートリアル動画をご覧いただければ幸いです。
 
![advent_2020_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/a51401c7-8b17-d356-cb33-015df4883831.png)

### 詳細解説
上記リンクや画像を見て頂ければ分かるかとおもいますが、ベースとなるHoudiniのバージョンが17.5です。ですのでそれ以降アセットとして使っていて改修していった部分を解説致します。

Houdini18で追加した要素はこちらの[CEDECで使用したスライド](https://www.klab.com/jp/blog/creative/2020/cedec2020.html)（リンク先の一番最初のスライド）の135ページ以降にも簡単に記載してあります。



* **簡単な使い方**
![houdiniadvent2020_02 (00000).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/2dca7037-2d94-7997-f9a0-41354f5f552d.png)
上記画像の様に、ROPに「ベースのシミュレーション」→「アップレゾ」→「レンダリング」を順番で回してくれるようなネットワークを組んであります。シーンを開いて「batch_all」ノードを実行すればそれだけで自動的に炎素材のキャッシュを取り、連番が書き出されるようになっています。キャッシュは「\$HIP/geo/\$HIPNAME/\$HIPNAME.\$OS」下に保存され、連番は「\$HIP/render/\$HIPNAME/\$HIPNAME.\$OS」下に書き出されるようにしてあります。<br>
とりあえず今すぐ何かしらの炎素材が必要という場合は、シーンをダウンロードしたら開いてROPの「bacth_all」ノードを実行すればOKです。

---

* **ネットワークビュー**
![houdiniadvent2020_12 (00000).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/20b28d8d-9c2e-799e-f793-de834ec50a5d.png)
画像の通り構造はシンプルです。
「1：エミッター作成」「2：ベースのsim」「3：アップレゾ」「4：アップレゾ後のポストプロセス」「5：レンダリング用オペレーター」「6：カメラ」といった感じでオペレーターを分けてあります。 

---

* **ソース・エミッター作成について**
![houdiniadvent2020_04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/a6d0ebb5-dc09-3089-6c90-96addd5a77fa.png)
[CEDECで使用したスライド](https://www.klab.com/jp/blog/creative/2020/cedec2020.html)にも記載してありますが、発生源はパーティクルをベースにしてそれに対してVelocity等を付与し調整したものを使用しています。これは何年も前に3dsmaxでFumeFXを使っていた頃から有用な手法で、Houdini18.5で実装されたPyroBurstSourceSOPも同系の仕組みなのでシミュレーションのソース作成において普遍的な型の一つだと思われます。<br>「原点からのみ発生する場合」と「それ以外」を使い分ける事が多いので、ベースのパーティクル発生用のPOPnetも最初から二つ用意してスイッチで切り替えられるようにしています。<br>炎のシミュレーション設定の方は私の手癖ではありますが既に済ませてあるので、基本的にはパーティクルでソースの任意の動きを作ってROPでバッチを回すだけで作業完了になります。

---

* **シミュレーションの設定について**
![houdiniadvent2020_06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/75535d65-b08d-0ea2-e62e-ba3c92f94f69.png)
こちらは基本的に触らなくても大丈夫なのですが一応補足致します。<br>[SideFX社公式サイトに掲載されている私のPyroTutorial](https://www.sidefx.com/ja/tutorials/pyrobasictutorial-fire1/)で説明している内容と重複しますが、炎のシミュレーションはソースとなるエミッターの形や動き・量や速度と、シミュレーションの際のtemperatureの動きがディテールの肝になります。<br>普段の炎素材作成時、私は基本的に上記画像の様にtemperatureのビジュアルだけを見て最終的な絵を予測して作業しています。また、慣れてくると最初の30フレーム位のtemperatureの動きを確認すればその後の動きが予測できるようになり、30フレーム位のプレビュー時点で良し悪しを判断して作業効率を高めることができるようになります。

---

* **マテリアル設定&OCIOについて**

基本的には下記画像の様にPyroBakeVolumeSOPで調整すれば問題ありません。
![201214_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/3453a456-9029-073a-9a24-ce20487f77ca.png)
OCIOはACESを使用しています。下記画像の様にオンになっているかを確認しましょう。
![houdiniadvent2020_00 (00000).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/65ee6444-9fe5-06e4-17ee-df953267b737.png)

OCIOの設定方法が分からない場合は[こちらの公式help](https://www.sidefx.com/ja/docs/houdini/io/ocio.html)をご参照ください。
ACESのコンフィグを持っていないという方は、[こちら](https://github.com/colour-science/OpenColorIO-Configs)や[こちら](https://github.com/imageworks/OpenColorIO-Configs)のGithubリポジトリをご参照ください。

---

* **マテリアル設定補足**

上記説明で使用しているPyroBakeVolumeSOPはHoudini18.5からの新機能なので、それ以前のバージョンではそれ以外の方法でシェーディングを行っていました。今となってはPyroBakeVolumeSOPが便利なので基本的にはそちらを使えば問題ないのですが、旧来のテクニックも時々引っ張り出すので念のため記載致します。

>* **マテリアル**<br>質感調整をしやすいようにスクラッチしたマテリアル。必要な要素やノードしか使っていないのでその分軽いのも特徴。
![houdiniadvent2020_10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/e8cfc02f-6615-9b6c-e2bb-ea9b62ec2fc6.png)
![houdiniadvent2020_11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/fc78fffa-a337-dd57-60c8-11d0c7013b43.png)
>* **青色で質感付け**<br>青ベースだと重なり部分の色味が赤橙ベースより綺麗に映るので、青ベースでレンダリングしてコンポで色調整を行う事で単に赤橙ベースでレンダリングするより炎の色幅を綺麗に見せるテクニック。PyroBakeVolumeSOPのおかげで少ない手数で赤橙ベースでも綺麗にレンダリングできるようになってきましたが、それでも未だに使う事があるテクニックなのでROPには設定を残してあります。<br>スクラッチしたマテリアルは基本的にこの青色ベースで使う事を想定して設計しています。
>![houdiniadvent2020_09 (00000).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/f975395e-e816-0b4b-899b-b559b87620a8.png)

---

* **レンダリング設定**

レンダラーはmantraを使用しています。
炎のようなVolume系のものはVDB化やVelocity等の情報のClampで軽量化できる事に加え、下記画像の様にジオメトリのレンダリングではオンにすべき「Ray Variance Anti-Aliasing」をオフにする等のオプティマイズによってレンダリング時間を高速化できます。<br>Alpha部分の滑らかさに影響を与える「Stochastic Samples」は、値を上げてもレンダリング速度に影響をあまり与えないのでこちらも品質を担保しつつ高速化に繋がります（ただし、該当Volumeをボリュームライトのように使う場合は結構レンダリング速度に影響を与えるので注意）。
![houdiniadvent2020_13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/caf99b3b-ccd2-cf79-7e42-233a3aea1143.png)

--- 

* **そもそも何故こういった手法を取るのか？**

経緯からお話しすると、Houdini17.5まではSparseSolverも無かったので今回紹介したシーンのように通常のPyroSolverでやりくりするしかありませんでした。 

Houdini18でSparseSolverが実装され、Pyro自体のアップデートもあって爆発や煙は17.5よりも作りやすくなりました。しかし、炎のディテールに関わるtemperatureの扱い方が変わり、従来のように扱うために調整していくうちに「これなら従来のアセットを改修して使えば良いか」と思い至り、爆発や煙はSparseSolverベースの新アセットを使うが炎は従来のアセットの改修版を使うという形に落ち着きました。
 
Houini18.5でPyro周りが更に強化され、temperatureも18より扱いやすくなって「さすがにこのアセットもお役御免か」と思いましたが、記事中でも何度も触れている新ノードのPyroBakeVolumeSOPと当アセットの相性が良く、「まだコレはコレでちょくちょく使えるな」と思って改修して今に至ります。
PyroBakeVolumeSOPの白眉な点は、各種情報によるマスキングで綺麗なシェーディングを行う仕組みがデフォルトで内臓されていることです。しかし、マスキングの初期設定のDensityは通常炎素材を作る時は疎かになりがちな要素で、そもそも最初からDensityを使わなかったり作業中に低解像度化されたり最終段階でオミットされたりします。そのためマスキングに使う段階で十分な質のDensityが残っていない場合が少なくないのですが、今回紹介したアセットの場合はアップレゾのために必然的にDensityが必要で且つアップレゾによって十分な質のDensityが自動で作られます。マスクの有無によってビジュアルがどう変わるかは下記の画像をご覧ください。
![houdiniadvent2020_01 (00000).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/ca3efa00-55eb-4953-a5a4-a803ca4107e4.png)
マスクがオンの状態だと濃淡のシェーディングが上手く乘っているのが分かるかと思います。マスクオフの状態からシェーディングを詰めて綺麗に見せることもできなくはないですが、「マスクオンほど綺麗にはならない。ケースバイケースになりがち。そもそもその状態なら青色ベースでレンダリングしてコンポで整えた方が綺麗」といった理由から、マスクオフを使うケースはあまりないでしょう。
従来のアセットにPyroBakeVolumeSOPを継ぎ足すだけでこのようにマスキングによる綺麗なシェーディングが行え、加えて同じような事を数ノードで完結するモダンなシンプルアセットにしようとすると意外と大変といった理由もあり、上述していますが「まだコレはコレでちょくちょく使いどころがあるな」と実感して使い続けている次第です。<br>
>PyroBakeVolumeSOPは元々爆発のシェーディングを簡単に行うために実装されたSOPだと思われます。Densityは簡単に言えば煙の情報で爆発には必ず存在するものなので、マスクにデフォルトのアトリビュートとして設定されているのは道理に適っています。



#配布シーン
* 配布するシーンのリンクは[こちら](https://drive.google.com/file/d/1sffYN9K2u1lpgHtKvifi8AGuqSycmqjd/view?usp=sharing)になります。
* Houdiniのバージョンは18.5.351です。
* この手のシーン配布でよくある文言になりますが「商用・非商用利用可。再配布・二次配布禁止」となります。