Blenderであそんでみた

3D-CGソフトBlenderの小技や豆知識など。

Blenderの流体シミュレーションで「水の塊をばしゃんと落とす」解説編

f:id:hainarashi:20201124150718j:plain

※記事製作時のバージョン:Blender2.90.1

 

簡単な見本を作りながら、流体シミュレーションの使い方を紹介していくシリーズ。
第2回は、「水の塊をばしゃんと落とす」の解説編です。

 
前回の実践編では、実際にシーンを作成しました。
この解説編では、使用した機能やパラメーターについて詳しく説明します。

 

実践編はこちらのリンクからどうぞ。

hainarashi.hatenablog.com

 

ドメイン(Domain)

ドメインは流体シミュレーションの計算領域です。
液体も気体も、ドメインの範囲内だけでシミュレートされます。

f:id:hainarashi:20201124173009j:plain

ドメイン

 

ドメインは1つのシーンに複数配置できます。
その場合、シミュレーションの設定は各ドメイン毎に行います。

f:id:hainarashi:20201112210020j:plain

ドメインの複数配置

 

異なるドメインのシミュレーションは、お互いに影響を与えません。
「水をかけて炎を消す」といったシーンを作る場合は、そういう結果になるように、それぞれのシミュレーションのタイミングを手動で調整する必要があります。

f:id:hainarashi:20201112213259j:plain

ドメインのシミュレーション

 

分割の解像度(Resolution Divisions)

ドメイン空間の分割数です。

Mantaflowの流体シミュレーションは

  1. ドメインの空間を、格子状の「ボクセル」と呼ばれる単位に分割する。
  2. ボクセルの1つ1つが「流体の有無」と「流体の動きの向きと力」のデータを持つ。
  3. フレームの進行に従って、ボクセル間の相互作用の計算を積み重ねる。

という仕組みで行われます。
※ボクセルと併用してパーティクルも使われますが、ここでは簡単な説明に留めます。

 

分割の解像度の値が大きいほどドメインが細かく分割され、流体の形と動きがきめ細かく、リアルになります。
同時に、シミュレーションの計算時間とキャッシュ(※)サイズが大きくなるので、

  • 求める流体の品質
  • 使える時間とハードディスク容量

のバランスを考えて設定します。 

※キャッシュ:シミュレーションの計算結果データ。blendファイルとは別に保存される。

vimeo.com

 

なお、上の比較動画を見ると、最初に落下する液体の塊はどれも同じ大きさですが、最後に下に溜まる液体の量には差があります。
これは分割の解像度の値が大きいほど、最初に発生する液体パーティクルの量が多くなるためです。
ばしゃんと跳ねた後はパーティクルが分散するので、パーティクルの量に応じて液体の量が増えます。
現実の液体ではあり得ない現象ですが、シミュレーションの方式によってはこういう事もあります。

 

ちなみに、ボクセルのサイズはドメイン下の隅に表示されます。

f:id:hainarashi:20201206120126j:plain

ボクセルサイズ

 

タイプ

シミュレーションの実行方法です。

  • リピート
  • モジュール
  • 全て

の3種類があります。

f:id:hainarashi:20201117134725j:plain

タイプ

 

[リピート]

シミュレーションの自動実行です。

  1. ドメインのパラメーターを変更して、
  2. 開始フレームからアニメーションを再生する。

この2つの操作をすると、シミュレーションが自動で更新されます。

 

次のような変更では、シミュレーションは更新されません。

  • ドメインオブジェクトの移動・回転・スケール
  • フロー(流体の発生源)やエミッター(障害物)のパラメーター変更・移動など

これらの変更をシミュレーションに反映させるには、ドメインのパラメーターを操作する必要があります。
その際、実際に数値などを変更する必要はなく、「パラメーターにカーソルを合わせて入力状態にして、何も変更せずにそのまま Enter で確定する」という操作でOKです。

 

[モジュール]

シミュレーションの手動実行です。

  • パーティクルによる流体の「動き」のシミュレート
  • パーティクルを元にしたメッシュの生成

を個別に行います。

「データをベイク」をクリックすると、シミュレーションが実行されます。
その後で「メッシュをベイク」をクリックすると、メッシュが生成されます。
ベイクの済んだパラメーターはグレー表示になり、変更を受け付けなくなります。

f:id:hainarashi:20201124213628j:plain

ベイクのスイッチ

 

やり直したい場合は、ベイク後に表示される「データを解放」「メッシュを解放」をクリックします。
ベイク済みのキャッシュが削除され、パラメーターは変更可能な状態に戻ります。

 

ベイクの途中にEscキーを押すと、ベイクは中断されます。
ベイクが中断されると、「リジューム(Resume)」と「フリー(Free)」のボタンが表示されます。
リジューム」をクリックすると、中断したフレームからベイクが再開されます。
リジュームを行うには、後で説明する「リジューム可能」をベイクの前にONにしておく必要があります。

「フリー」は「解放」と同じで、中断までのキャッシュが削除されます。

 

[全て]

シミュレーションの手動実行です。
タイプの少し下に表示される「すべてベイク」をクリックすると、パーティクルとメッシュが一度にベイクされます。
それ以外の挙動はモジュールと同じです。

 

[タイプの使い分け]

基本的に「モジュール」を使います。

「全て」は個別のベイクができないので、試行錯誤に向きません。
「リピート」は、全てが自動更新なら良いのですが、手動更新が入り交じるので、かえって面倒になります。

いろいろ試した結果、「モジュール」で意識的にシミュレーションを更新するのが、一番シンプルで操作しやすいという結論になりました。

 

特に、レンダリングの前には必ず「モジュール」にしておくのが重要です。

「リピート」のままでもレンダリングはできるのですが、何かのはずみで、思わぬタイミングでシミュレーションが自動更新されてしまうことがあります。
流体シミュレーションはランダム性があるので、設定が同じでも、決して同じ結果にはなりません。
もしアニメーションレンダリングの途中でシミュレーションが自動更新されてしまうと、前後がつながらなくなってしまうので、最初からレンダリングのやり直しになってしまいます(実体験)。

 

リジューム可能(Is Resumable)

これをONにすると、ベイクの中断・再開ができるようになります。

マニュアルによると

Extra data will be saved so that you can resumed baking after pausing. Since more data will be written to drive it is recommended to avoid enabling this option when baking at high resolutions.

(一時停止後にベーキングを再開できるように、キャッシュにデータが保存されます。ドライブに書き込まれるデータが多くなるので、高解像度でベーキングする場合はこのオプションを有効にしないことをお勧めします。 ※原文を元に翻訳)

とのことです。

 

しかし、タイプがモジュールの場合はこれをONにしておかないとメッシュのベイクができません。
理由は分かりませんが、そういう作りになっています。
そのためモジュールを使う際は必ずONにします。

f:id:hainarashi:20201124174825j:plain

リジューム可能(Is Resumable)

 

メッシュ

流体のメッシュ使用のON・OFFを切り替えます。

Mantaflowは

  1. まずパーティクルで液体の動きを計算する
  2. その後でパーティクルを元に、液体のメッシュを生成する

という手順で液体を作ります。

メッシュをONにすると、液体のメッシュが生成できるようになります。
また、液体のメッシュがベイク済みでも、OFFにするとメッシュは非表示になります。

f:id:hainarashi:20201124220151j:plain

メッシュ

 

開始フレーム、終了フレーム

流体シミュレーションを行うフレーム範囲です。
アニメーションのフレーム範囲とは別に設定できます。

例えば「水門がゆっくり開き、やがて水が流れ出す」というようなアニメーションでは、水門が開くまでシミュレーションは必要ありません。
このような場合「水が流れ出す」のところからシミュレーションを開始するように設定して、無駄を省くことができます。

f:id:hainarashi:20201124175322p:plain

開始・終了フレーム

 

キャッシュディレクト

キャッシュディレクトリは、キャッシュが保存されるフォルダです。
ドメインに対して自動で設定されます。

f:id:hainarashi:20201202214629j:plain

キャッシュディレクト

 

[自動設定の場所]

キャッシュディレクトリが自動設定される場所は、次の2パターンがあります。

 

  1. blendファイルが保存されている
     → blendファイルと同じフォルダ

  2. blendファイルが保存されていない
     → tempフォルダ

※tempフォルダの場所は「編集 > プリファレンス > ファイルの場所」から確認できます。
 デフォルト位置は C:\Users\(ユーザー名)\AppData\Local\Temp\ です。

 

キャッシュディレクトリはblendファイルからの相対参照で設定されます。

1の場合、blendファイルとキャッシュフォルダを一緒に移動すれば、移動先でもシミュレーション結果をそのまま使うことができます。

2の場合、blendファイルを移動するとキャッシュフォルダとの相対位置が狂うので、シミュレーション結果が使えなくなります。

そのため、流体シミュレーションを行う際は、まず最初にblendファイルをどこかに保存しておくと、その後の管理がしやすくなります。

 

[フォルダ名は日本語不可]

キャッシュフォルダが作成されるフォルダツリーの中に1つでも日本語名のフォルダが含まれていると、キャッシュが保存されず、シミュレーションが正常に動作しなくなります。
特にPCのアカウント名を日本語で作成していると、ユーザーフォルダ名も日本語になるため、そのサブフォルダ全てがシミュレーション用に使えなくなります。
こういう場合は、どこか別の場所にシミュレーション用のフォルダを用意する必要があります。

 

[キャッシュフォルダ名]

キャッシュフォルダ名は、そのフォルダのパスを元に自動で生成されます。
同じフォルダに複数のblendファイルがあり、それぞれに流体シミュレーションを設定すると、キャッシュフォルダ名はどれも同じになります。
キャッシュフォルダ名が重複していると、別々のシミュレーションが同じキャッシュを参照するので、「AでベイクしたキャッシュがBから上書きされる」といった不具合が発生します。

こういう場合は重複を回避するため、先に作成されたキャッシュのフォルダ名とキャッシュディレクトリを手動で変更する必要があります。

 

フロー(Flow)

フローは流体の発生源です。
液体・煙・炎はフローから流れ出します。
※流体を消失させる出口にすることもできます。いずれ別の記事で解説します。

f:id:hainarashi:20201204220736j:plain

フロー

 

クイックエフェクトの初期設定では、フローの挙動は「ジオメトリ」になっています。
ジオメトリは、シミュレーションの開始時に「そのオブジェクトの形をした液体の塊」を発生させます。

フローオブジェクトはどんな形でもOKです。

f:id:hainarashi:20201203163800j:plain

いろいろな形のフローオブジェクト

 

フローオブジェクトをレンダリングしたくない場合は、アウトライナーレンダリング非表示に設定します。

f:id:hainarashi:20201203171022j:plain

フローのレンダリング表示切り替え

 

 

以上、「水の塊をばしゃんと落とす」解説編でした。

 

※添削・構成アドバイス:相方

 

twitter

灰ならし (@hainarashi) | Twitter