はじめに
一番簡単に火を作る
pyro configure bonfire
もっとも簡単に火を起こせる
左側のノードが炎で、右側は火花か何かだ
最低限の火を熾す仕組み
上の例だとかなり複雑な仕組みで火ができているように思えるが、最低限の設定を考える。
これでも一応火が出るが、均一に出てしまう。要するにAttributeNoiseでムラを出している。
- オブジェクトを出すためのボリューム
- Pyrosource
- AttributeNoise
- VolumeRasterizeAttribute
- Pyrosolver
この5つが恐らく最低のセッティングだと思われる。
この時、一番目は任意で豚さんとかにすれば豚さんの形を燃やせる。
二番目の設定を見てみることにする。
Pyrosource
これは何か。色々いじってみるとinitializeボタンを押すとアトリビュートが付与されることが分かる。
どんな時にどれを使うのかは現状わからないが、文字通り受け止めれば、燃やすときはBurnなのか?
BurnとTemperatureというアトリビュートが作成される。
Smokeを選択するとDensity とTemperatureが作成される。
Colorを選択するとColorとAlphaが作成される。
Fuelを選択するとFuelとTemperatureが作成されるようだ。
それぞれ何に使うのかはこの時点では謎。
とりあえず、重要そうなのは燃やすときはBurnとTemperatureというアトリビュートが関与していそう。
表面に点をばらまくか、元の点を使うか、内部にもばらまくかの三通り選べる。
AttributeNoise
ここでAttributeNoiseが何をしているか考える。
Pyrosourceでデフォルトで入っている値は1であることに注目する。
インフォメーションからburnをクリックするとBurnの値を表示することができるようになる。
AttributeNoiseを掛けたあととかける前だとこのような差がある。
グラフやパラメーターを触るとノイズの分布が変わることが確認できる。
恐らく、ここでいい感じのムラを出すように設定している。
density,temperature,burnと三つの値を別々に設定している所を見ると、それぞれノイズの掛け方を変えることでランダムに見せたりと何か意図があるように思える。
VolumeRasterizeAttribute
ここで重要なのはボリュームにアトリビュートがきちんと入る事のように思えるので、Attribute欄に入れたいアトリビュートを全部追加する。
そして、重要な項目はVoxelsize。火の解像度に関わるのでこれを火の大きさにもよるが例えば0.01(1㎝)にしておく。重いようであれば大きくして解像度を下げたりできる。
coverageが何をしてくれるのかはこの時点では謎。
Pyrosolver
これが多分一番難解なノード
quickセットアップでいろいろ選べるようになっているが、なんに使うかわかるのはFireとExplosionとか。
実際設定を変えてみると、Sourcingという所のアトリビュートが変わるようで、Fireは下。
Explosionにすると下のように爆発する。
何が違うのかよくわからないが、爆発の方はDivergenceというFieldに値が入る模様。
炎をシミュレーションしたい時は大体が火か爆発だと思うのでとりあえずこの二つができれば及第点とする。ちなみにデフォルトのPyrosolverを入れてみると大分しょぼい。
一方で、BoneFireの設定はかなり良さそうなのでこの二つを比較しながらいじるべきパラメーターを精査していきたい。
まずはVoxelSizeとTime Scaleの値が調整されていることに気づく。Voxelsizeは恐らく火の解像度。
ボリュームの解像度と同じコンセプトだと思われるので、細かく小さくすれば解像度が上がり重くなる。
TimeScaleは調整してみてもいまいちわからないが、火の上がる速度なのか? 1近辺が良いように思える。大きくし過ぎると綺麗な火にならないし、小さいと遅いような気がする。
次にBoundsを見ていく。ここで重要なのはLimitMaximumSizeだと思われる。設定するとボックスからはみ出た火は計算されず、軽くなる。
BouondaryConditionsでも特定の方向でシミュレーションをカットできそう。
次にCollisionを見ていくが、特に変更がないので、これは何に使うかわからない。
その次にSourcing を見ていく。これもdensityの値が0.1になっているがデフォルトは1、その差は大げさに変えてみてもいまいちよくわからないが、恐らく火の密度?なのか、、、謎。
そもそもDensityが何のためにあるのかが現状理解できていないし、FlameのInitializeでもDensityアトリビュートが存在していなかったので、今後の課題とする。一応チャットGPTにも聞いてみたので結果を張っておく。
火の密度という事であってそうな感じがするが、実際の値をいじっても見た目に差が無いような気がする。
Dissipation, CoolingRate, FlameLifespanはどれも火がどの程度で消えるかのパラメーターのように思える。一番簡単なのはLifespanで、これで火の寿命がきまる。DissipationとCoolingRateは微妙な差異しか感じられなかった。
EmitFromFlameは煙が炎から出るかどうかを規定しているように思える。ススが出る場合はチェック。
次にShapeを見ていく。
Buoyancyは火の上がり方をゆっくりにScaleを小さい値にしているよう。
Windは風の強さ。適度に入れる。
Turbulenceは火のうねり方を規定するようで、大きめの値をいれ、PulseLengthは小さめを入れるとよさそうか。ControlFieldがデフォルトだとDensityになっていたので、Densityを使ってない場合は使っているFieldにしないと効果が出ない。
Shreddingは火が切れたりするようになるみたいだが実際色々下の値をいじってみたがどれをどうするとどうなるみたいな事が良く分からなかった。細かい調整に必要なのかもしれない。
FlameExpansionはその名の通りわかりやすい。炎の拡張具合を調整できる。
火の粘度。大きくすると立ち昇らない。
Lookで見え方の調整ができそう。
advancedとoutputはデフォルトでOKっぽい。
PyroBakeVolume
最後にPyroBakeVolumeノードで火の見え方の最終調整とシェーダーの作成ができるみたいです。
パラメーターがありすぎてどれがどうなるのかは実際にいろいろ試す必要がありそうです。
Fuelの事前調整
これまでは燃える所が固定されていましたが、それをアニメーションで動かすことで燃える所を変えることができるようです。
AttributeNoiseのAnimationでチェックを入れます。すると、フレームごとにノイズが動きます。
その他にもノイズのタイプを変えたり、スケールをElementSizeで調整したり、ずらしたり、PulseDurationで早めたり、Post-Processでクランプしたりできるようです。
燃える部分を変えたい場合はここの設定をいじればいろいろできそうです。