(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氏作
- Blender でシーンを作成する際、複数のオブジェクトに流体シミュレーション内での役割、例えば Fluid(流体)や Obstacle(障害物)などを指定できます。
また、別の単体のオブジェクトのバウンディング・ボックス(オブジェクトをXYZ軸それぞれの最小値・最大値で囲った直方体)を、箱型のシミュレーション領域(Domain)を決定するのに使用します。
- シミュレーション全体のパラメータ、例えば粘度(Viscosity)や重力(Gravity)は、この Domain オブジェクトに対して設定できます。
- [Bake]ボタンを使用すると、(Mesh の)幾何学的な形状と設定がシミュレータにエクスポートされ、流体シミュレーションが実行されます。流体の表面が Mesh として(プレビュー用データと一緒に)各アニメーションのフレーム毎に生成され、ハードディスク上に保存されます。
- その後、現在のフレームに相応しい流体の表面がディスクから読み込まれ、Blender で表示/レンダリングされます。
[wiki]//ワークフローのサンプルと、単純なシミュレーションの設定例(下記画像の説明)― 外側のボックスはシミュレーションのdomain(領域)を表す。斜めのボックスはObstacle(障害)である。最も下にあるボックスと雫は流体として設定されている。中央の画像は、シミュレーションされた表面のプレビュー表示である。最期の画像は再び Blender に読み込まれレンダリングされたものである。
[/wiki]
シミュレーションの作成
少なくとも、ひとつの 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 simulationLast update: Dec 22 2005.
This section is maintained by Ton Roosendaal.
(yamyam注:ここからはアルファの時点ではあった、オブジェクトの種類とパラメータの解説です。240リリース時には前述の mediawiki manual に入れられ、ここからはなくなっていますが、まだ翻訳はされていないため、しばらく残しておきます)■Domainオブジェクト: このオブジェクトのバウンディングボックスが、シミュレーションの境界線となる。
注意することは、オブジェクトの形状は全く考慮されないということ。バウンディングボックスの辺の長さだけが、影響を与える。
- Simulation & Preview mesh Resolution: 最初のシミュレーションの緻密さ。
Preview 〜 はオブジェクト表示だけに影響する((=シミュレーションには影響しない))。
注意:(Simulation meshの)Resolution によって必要なメモリの量が急激に増える。
Resolution 32では5MB、64で40MB、128で250MB以上になる。最大値は200で850MBになる。
もし Domain が立方体ではない場合は、最も長い辺に対して Resolution が適用される。他の辺の Resolution はその長さに応じて小さくなる。
- Real-world size: 実際の世界における domain オブジェクトのサイズをメートルで表す。
- Gravity vector: 重力加速度の強さと向き。現時点では、主な成分は負のZ軸方向で単位は m/s2(メートル÷秒の2乗)。
- Start and time: Blender の開始/終了フレームの間で何秒分シミュレーションするか。
- Viscosity(粘り気): 流体の濃さを表す。手で入力する場合、この値は1.0前後の小数と負の指数で指定する。
- GUI display mode(GUI表示モード): Bake されたシミュレーションを Blender の GUI でどう表示するか。
- Render display mode(レンダー表示モード): GUI 表示モードと同じで、レンダリング出力に対する指定。
- Bake directory: Bake された曲面 Mesh を出力するディレクトリ。
- Bake: 実際に流体シミュレーションを行う。
■Fluidオブジェクト: Domain オブジェクトのバウンディングボックス内にある、このオブジェクトのすべての領域が実際の流体としてシミュレーションで使われる。1つ以上の Fluid オブジェクトを Domain 内に配置する時、重なり合ってはいけない。そして、各面の法線が確実に外側を向くようにすること。
- Initial velocity: シミュレーション開始時の流体の初期スピード。単位はメートル毎秒。
■Obstacle: このオブジェクトは、シミュレーションで障害物として使われる。Fluid オブジェクト同様、現時点では、Obstacle オブジェクト同士は重なってはいけない。
(yamyam注:以下は2chの氏のコメントの引用です。仕様変更などで変わっている部分もあるかもしれませんが、まだ検証していません)
引用:
追加メモ
・シミュレーション結果を保存したいときは、blendファイルごとフォルダを分けた方がいい。
Output Directory/Filename-Prefixがうまく動作してないのか、
別ファイルで計算してもgzファイルが上書きされてしまう。
・ワイングラスに水を注ごうと思ったが、サラサラした流体の表現は難しそうだ。
Resolutionを100以上に上げればできそうだが、
かなり高いスペックのPCでないと難しい。 おまけに斜めに流すと
BoundingBoxがでかくなって、相対的にResolutionも下がる。
・透明な容器に流し込むと、容器内側の流体がでこぼこになってしまう。
誰か、鉛直方向以外のAlphaを下げる方法を知りませんか?
(カメラ座標じゃなくGrobal座標を元にしたNorマップにZ軸のBlendAlpha貼るみたいな・・・
別Objectの座標だと水面の上下移動に追随できない・・・)