(yamyam注)以下はBlender@2chアップローダで、2chのBlenderPart10スレ(JBDP倉庫)の974氏が公開されていたテキストを元に整形と改変(yamyam)したものです。ところどころにある訳注と脚注は、氏によるものです。
氏の意志に基づき、この文章を著作権放棄相当とします(注:画像は含まず)。公開された氏に深く感謝します。


元記事:Fluids simulation


流体シミュレーション



Free Surface流体シミュレーション


(訳注:Free Surfaceは自由曲面の事だと思うが、特殊な意味が有るかもしれないので以下そのまま表記する。
ちなみに「自由曲面」とは、大体の形をパラメータとして指定すると、どんなに細かく拡大しても滑らかであることを数学的に計算できる曲面の事。代表例は NURBS/Bezier Surface や Metaball。
自由曲面とよく対比されるのは「一見滑らかでも拡大するとカクカクなポリゴン Mesh」である)


Google summer of code プロジェクトの1つとして、Nils Thuerey氏は彼の流体シミュレーター、El'Beem を Blender に組み込みました。

これにより、物体(移動しないもの)との相互作用する、リアルな流体のシミュレーションが可能となりました。ただし、このようなシミュレーションはCPUとメモリに高いスペックを要求するため、PCが何時間も使えなくなる前に、先に低い解像度でテストするよう最初に警告しておきます。

この実装では、Lattice-Boltzmann 法を使用します。これはセル・オートマトンの一種で、流体のマクロ的な挙動をシミュレートします。この方法はシンプルさ、柔軟さ、効率的なところが魅力です。(訳注:セル・オートマトンとは、空間をセルと呼ぶ細かい領域(たとえば小さな立方体の集まり)に区切って、近いセルとの相互作用(だけ)をコマ送りで計算する手法)

この流体シミュレーションはその基本アルゴリズムに、free surface による流れのシミュレーションに最適化するため、様々な拡張を施したものを使用しています。
詳しいことはNils氏のホームページを、技術的な詳細は wikiをチェックして下さい。



ワークフロー(作業の流れ):




画像は Mike "MPAN3" Pan氏作



[wiki]//ワークフローのサンプルと、単純なシミュレーションの設定例(下記画像の説明)― 外側のボックスはシミュレーションのdomain(領域)を表す。斜めのボックスはObstacle(障害)である。最も下にあるボックスと雫は流体として設定されている。中央の画像は、シミュレーションされた表面のプレビュー表示である。最期の画像は再び Blender に読み込まれレンダリングされたものである。
[/wiki]



シミュレーションの作成


GUI1

GUI2
少なくとも、ひとつの Fluid もしくは Inflow Object が必要です。同様にシミュレーションスペースを包みこむ Domain Object も必要です。また、複数の Obstacle と、2つ以上の Fluid を使用することもできます。一度に使用できる Domain はひとつだけです。
Domain は Mesh でなければならない事と、使われるのはそのバウンディングボックスのみという事に注意して下さい。Domain はフレーム毎に流体シミュレーションの結果で置き換えられます。Obstacle はシミュレーション中に動かしてはいけません。

Object コンテキストの Fluid パネルで、各オブジェクトを適切に設定します。設定が終わったら Domain Object を再び選択し、[Bake]ボタンを押すと実際のシミュレーションが始まります。

Blender の GUI がしばらく使用できなくなり、ウィンドウ右上のプログレスバー(進行状況表示)だけが更新される状態になります。計算対象となるフレームは、Render コンテキストの Anim settings で決まります。[Esc]キーを押すと、シミュレーションが中断します。

その後、Output に指定されたディレクトリに、2つの .bobj.gz ファイルがフレーム毎にできあがります。通常、これらのファイルは大量にできるため、専用のディレクトリを指定しておくのがいいでしょう。



更なる詳細情報


- Elysiun.com の forum 内のデモムービー
- Blender mediawiki manualの流体シミュレーションの章
- チュートリアル1
- チュートリアル2

元記事:Fluids simulation
Last update: Dec 22 2005.
This section is maintained by Ton Roosendaal.

(yamyam注:ここからはアルファの時点ではあった、オブジェクトの種類とパラメータの解説です。240リリース時には前述の mediawiki manual に入れられ、ここからはなくなっていますが、まだ翻訳はされていないため、しばらく残しておきます)

■Domainオブジェクト: このオブジェクトのバウンディングボックスが、シミュレーションの境界線となる。
注意することは、オブジェクトの形状は全く考慮されないということ。バウンディングボックスの辺の長さだけが、影響を与える。

■Fluidオブジェクト: Domain オブジェクトのバウンディングボックス内にある、このオブジェクトのすべての領域が実際の流体としてシミュレーションで使われる。1つ以上の Fluid オブジェクトを Domain 内に配置する時、重なり合ってはいけない。そして、各面の法線が確実に外側を向くようにすること。

■Obstacle: このオブジェクトは、シミュレーションで障害物として使われる。Fluid オブジェクト同様、現時点では、Obstacle オブジェクト同士は重なってはいけない。



(yamyam注:以下は2chの氏のコメントの引用です。仕様変更などで変わっている部分もあるかもしれませんが、まだ検証していません)

引用:
追加メモ
・シミュレーション結果を保存したいときは、blendファイルごとフォルダを分けた方がいい。
 Output Directory/Filename-Prefixがうまく動作してないのか、
 別ファイルで計算してもgzファイルが上書きされてしまう。
・ワイングラスに水を注ごうと思ったが、サラサラした流体の表現は難しそうだ。
 Resolutionを100以上に上げればできそうだが、
 かなり高いスペックのPCでないと難しい。 おまけに斜めに流すと
 BoundingBoxがでかくなって、相対的にResolutionも下がる。

・透明な容器に流し込むと、容器内側の流体がでこぼこになってしまう。
 誰か、鉛直方向以外のAlphaを下げる方法を知りませんか?
 (カメラ座標じゃなくGrobal座標を元にしたNorマップにZ軸のBlendAlpha貼るみたいな・・・
 別Objectの座標だと水面の上下移動に追随できない・・・)