このシリーズの第3回チュートリアルでは、Blender 4.5 の Fluid シミュレーターを使った fire と smoke において、Bake ―つまり fire と smoke の物理シミュレーション― がどのように実行され、どのように保存されるかを解説します。
このチュートリアルは、Blender 4.5 における炎と煙の基礎に関する全10回のミニシリーズの一部です。エピソードの完全な一覧を見るには、ここをクリックしてください。
動画の書き起こし
皆さん、こんにちは!このシリーズの第3回チュートリアルでは、Blender 4.5 の Fluid シミュレーターを使った fire と smoke において、Bake ―つまり fire と smoke の物理シミュレーション― がどのように実行され、どのように保存されるかを解説します。Domain の simulation を一度計算すれば、シーン内の他の場所に複製しても再計算する必要がない方法も見ていきます。最後に、simulation の再生に Offset を設定し、炎の点火から始めるのではなく、すでに燃えている状態からアニメーションを開始できるようにする方法を紹介します。
今回のチュートリアルの開始シーンは、薪を入れた brazier(火鉢)です。これらは別々のメッシュで、薪は1つのメッシュとしてまとまっています。brazier は長方形の Plane の上に置かれていて、これが床の役割を果たし、後で他の brazier もここに配置します。World の Strength は 0 に設定されており、光源もないため、Rendered モードではシーンが真っ黒に見えます。
前回までの内容から、オブジェクトに炎を発生させるには Fire And Smoke Flow タイプの Fluid コンポーネントを割り当てる必要があることを知っています。そこで薪に Physics Fluid コンポーネントを追加し、その挙動を Inflow に設定します。これにより薪は各フレームで flame を発生させるようになります。

次に Cube を作成し、Flow コンポーネントを Domain タイプに設定してシーン全体を最初に囲みます。するとすぐに問題に気づきます。デフォルトの resolution が低すぎて Voxel が大きすぎるため、炎が emitter となるオブジェクトに比べて不自然に大きくなってしまうのです。
Resolution を 64 に上げても大きな改善はなく、simulation にも時間がかかるようになります。これ以上上げるのは試すまでもなく正しいアプローチではないと分かります。

最も分かりやすい解決策は、Domain をリサイズし、brazier とその上に広がる flame と smoke を収める程度の大きさにすることです。すると今度は resolution が効きすぎるほどで、むしろ過剰かもしれません。Resolution を 32 に戻しても炎は十分にくっきりしています。むしろ問題は、薪が fire を出しすぎていることです。

発生する fire の量を減らすには、Inflow オブジェクトの Fuel パラメータを調整します。直感的に、Fuel の値が大きいほど、各フレームで消費される燃料が多くなります。解決策はこの値を下げ、炎が適切な大きさになるまで調整することです。
前回までに説明したように、Baking(物理シミュレーションの計算)に関連するデータは専用のフォルダーに保存されます。そのパスは Domain オブジェクトの Cache セクションに表示されています。Domain を作成する前にファイルを保存してあるので、cache フォルダーは Blender プロジェクトファイルと同じディレクトリに作成されます。
Domain の Cache セクションでは、Domain simulation を計算するフレーム範囲を設定できます。これは必ずしもシーンのアニメーション全体のフレーム範囲と一致させる必要はありません。例えば、短い範囲だけ Bake して fire の見え方を確認したいときや、Fluid オブジェクトがカメラに映らないフレームではシミュレーションを計算する必要がないときに便利です。 Cache セクションの他のパラメータを見る前に、Domain、brazier、薪(Inflow オブジェクト)をひとまとまりのセットとしてコピーし、それをシーンに配置した場合を見てみましょう。前に見たように、シーン全体を覆う Domain を1つだけ使うと、良い flame を作るには非常に高い resolution が必要で、しかも無駄な空間が多く残ってしまいます。したがって、複数の brazier を追加する場合は、セット全体を複製するしかありません。
問題は、Timeline で Play を押すと Blender がすべての Domain に同じ cache フォルダーを使ってしまうことです。つまり、すべてが同じ simulation データを共有してしまうのです。もし全シミュレーションで同じパラメータを使いたいのであれば、Domain を少し回転させたり、それぞれ異なる Material を与えたりして、レンダリング時に flame の見た目を変えることで視聴者を「だます」方法もあります。
本当の問題は、Domain の resolution や他のパラメータを変更してから再び Bake を実行したときに発生します。例えば、背景にある Domain には高い解像度が必要ないので resolution を下げています。すると Blender は異なる特性を持つオブジェクト間で同じ volumetric data を共有してしまい、完全に混乱してしまうのです。

各 Domain ごとにデータを明確に分けたい場合は、simulation を実行する前に Domain ごとに別々の cache フォルダーを指定する必要があります。言うまでもなく、こうすると各 Domain のデータでディスクの使用量は大幅に増えます。どの戦略を採用するかはニーズ次第です。非常に大きな Domain をひとつか複数使って同じ simulation を複製するのか、あるいは Domain ごとに別々の cache を作成するのかを選ぶ必要があります。
これまで Blender は、Timeline で Play を押すたびに simulation の Bake を計算していました。しかし、これは唯一のモードではありません。実際には非常に便利なツールを使えるもうひとつの方法があります。ここでは話を簡単にするために、シーン内に Domain を持つ brazier をひとつだけ残し、他を削除しました。ただし注意してください。Domain を削除してもディスク上のデータは削除されません。これは良い点でもあります。なぜなら後でシミュレーションデータを保存して再利用できるからです。ただし今回はそのデータが不要なので、手動で削除します。
Domain の Cache セクションには Type メニューがあり、デフォルトでは Replay に設定されています。これがこれまで使ってきたモードで、frame 1 に戻って Play を押すたびに Blender が新しい Bake を再計算し、以前のデータを上書きします。

Modular モードでは、simulation の異なる側面を分けて Bake できます。これにより、シミュレーション全体をやり直さずに特定の部分だけを確認したり置き換えたりすることが可能になります。
All モードでは、シミュレーション全体を Bake しますが、その計算は Timeline ではなくバックグラウンドで行われます。Bake を開始するにはパネルの Bake All ボタンをクリックします。Blender は進行状況バーを表示します。計算が完了すると、Timeline で Play を押すとすでに事前計算されているため、はるかにスムーズに結果を確認できます。
simulation の設定を変更するには、まず Free All ボタンをクリックして既存のデータを削除する必要があります。その後パラメータが再び編集可能になり、変更できます。もちろん、その後もう一度 Bake All をクリックして Blender にシミュレーションを再計算させる必要があります。
使用中のフォルダーを確認すると、Modular や All モードを使った際に、どのようにモジュールや bake のステップが分けて計算・保存されているかが分かります。

All モードでは Offset パラメータが利用可能になり、すでに気づいているかもしれない問題を解決できます。これまでの fire simulation はすべて、アニメーションの最初のフレームで炎が点火するところから始まっていました。しかしこれは必ずしも望ましいわけではなく、すでに燃えている状態からアニメーションを開始したい場合もあります。
この問題を解決するには、Offset フィールドに負の数を入力します。ツールチップには、これは Bake が早く始まるという意味ではなく、最初のフレームでシミュレーションがその数のフレーム分すでに進んでいるかのように再生されると説明されています。アニメーションの長さは Frame Start と Frame End の間で指定されたフレーム数のままです。この場合、Timeline の最後の25フレームにはシミュレーションが存在しません。なぜなら、Offset によって Timeline の1フレーム目でシミュレーションの25フレーム目を再生するように Blender に指示したからです。

これを解決するには、Bake でより多くのフレームを計算し、シミュレーションが Timeline 全体をカバーするようにすればいいのです。そこで Cache セクションの Frame End を 275 に設定し、Free All をクリックしてから Bake All をもう一度実行しました。