On this page |
Shallow Water Solverノードは、以下のような状況下での水の挙動をシミュレーションすることができます。
-
波紋や砕けない波
-
池や水たまり
-
亀裂や表面の凸凹を流れる水
-
シンプルなボートの波
-
遠方のスタイル化された水や水面
-
広範囲にわたる素早い浸水
-
水の流れや滴り
ここでの重要ワードは“shallow(浅い)”です。 このソルバは、波が打ち寄せる広大な海や、パーティクルベースの流体による典型的な充填のエフェクトには使用できません。 また、流体オブジェクトの衝突で生じる飛沫にも使用できません。 Shallow Water Solverは2Dソルバなので、新たにソーシングされた水は、既存の水のレイヤー上を流れることができません。
Height Fieldとマスク ¶
Shallow Water Solverは、Height Fieldとマスクに基づいています。
Height Fieldは、海底のトポロジと衝突ジオメトリを定義します。
品質と解像度は、HeightFieldノードの Grid Spacing で制御します。
ディスプレイスメントマップをインポートしてそれをHeight Fieldとして使用したり、地形をペイントしたり、Houdini独自のツールを使用して複雑なHeight Fieldを作成することができます。
ソルバの Seabed Layer (デフォルトではheight
)は、衝突地形Height Fieldをバインドします。
Note
Height Fieldは、Shallow Water Solverで中心的な役割を果たします。 基本的な考え方については、Height Fieldの基本を参照してください。
水ソースを作成するには、マスクが必要です。 例えば、HeightField Paintノードを使用してマスクを描画することができます。 他の方法だと、単一画像またはアニメーションマスク用に画像シーケンスをインポートしても構いません。 また、HeighField Mask by OcclusionノードとHeightField Mask by Objectノードを使用するなど、いくつかの方法を組み合わせることもできます。 シンクあるいはフォースが適用される領域に個別のマスクを作成することも可能です。
マスク値も重要です。
例えば、HeightField Paintノードには FG Value と BG Value があります。
FG Value を1
に設定すると、シンクの強度は最大になります。
一方、 BG Value を0
にすると、水はソーシングも削除もされなくなります。
シンクを使用し、 FG Value が0.5
に設定されている場合、入ってくる水の50%のみがフレーム毎に削除されます。
ソルバの Source Scale パラメータを使用するとソーシングの量を調整することができますが、Sink Fieldはそのまま使用されます。
シミュレーション結果、つまりソルバの Water Layer もHeightFieldです。 Shallow Water Solverは、 Water Layer の絶対値と相対値を区別します。 モードを変更するには、 Output タブに移動して、 Output Water Height is Absolute をオフにします。
-
オンの時、 Water Layer は水面の位置を含みます。
-
オフの時、 Water Layer は各ボクセルの水の高さを含みます。
Output Terrain Includes Water Height がオンの時、 Water Layer は Seabed Layer に追加されます。 ビューポートでは、水は土台となる衝突サーフェスから押し上げられているように見えます。 オフの時、水は衝突ジオメトリ上の薄い色付きフィルムのように見えます。
基本セットアップ: Height Fieldとマスク ¶
技術的に言えば、完全な浅瀬のシミュレーションをセットアップするには、3個のノードが必要です。
次の例ではさらに多くのノードが必要で、source
とsink
マスクを追加します。
まずはHeightFieldノードから始めます。
-
obj レベルで、Geometryノードを作成し、その中に入ります。
-
Geometryノード内で、HeightFieldノードを作成します。
-
Size を
20,20
に設定します。 -
Grid Spacing を
0.025
に設定し、十分なディテールが得られるようにします。
この時点では何も表示されません。 この例では、サーフェスのディテールはディスプレイスメントマップを通して追加されます。 マップは、商用のリポジトリで入手したものや自分でペイントしたものなど、任意のもので構いません。 ここでは、小石や石のある地面を使用します。
-
HeightField Fileノードを追加して、その入力をHeightFieldの出力に接続します。
-
File で、使用したいディスプレイスメントマップをロードします。
-
Layering サブペインで、 Layer Name を
height
に変更します。 -
Size を
20
に設定し、マップとHeight Fieldを揃えます。 -
そうしてできたHeight Fieldが高すぎたり平坦すぎる場合は、 Height Scale を変更します。
Height Fieldがビューポートに表示され、水ソースを描画できるようになりました。
-
HeightField Paintを追加して、それをHeightField Fileノードに接続します。
-
Layer が
mask
に設定されていることを確認します。 -
ビューポート上でマウスカーソルを動かして、Enterを押します。大きくて赤い球はブラシを表し、マスクを描画できます。
-
ブラシの Radius はで調整するか、手動で約
0.5
の値に設定します。 -
マスクをペイントします。ブラシはHeight Fieldに沿って動き、後には赤いマークが残ります。ここでのマスクは地面の亀裂で、そこから水があふれ出ます。
-
マスクをソースに変換するため、HeightField Copy Layerノードを追加し、それをHeightField Paintノードに接続します。
-
Destination で
source
と入力します。 -
HeightField Mask Clearノードを追加して、現在の
マスク
を削除し、ネットワークを正常に保ちます。
次はシンクを追加します。オブジェクトを使用して、シンクの形状と位置を制御します。
-
Sphereノードまたは他の任意のオブジェクトを追加します。
-
必要に応じて Uniform Scale を変更し、オブジェクトをスケールします。この例では
6
に設定します。 -
HeightField Mask by Objectノードを追加します。
-
その1番目の入力にHeightField Mask Clearノードを、2番目の入力にSphereを接続します。
-
Blur Radius を
3
に変更して、マスクを滑らかにします。滑らかにしないと、流体がシンクの境界で切り取られたようになってしまいます。ブラーされたマスクの方が自然な仕上がりになります。 -
HeightField Copy Layerをもう1個追加して、それをHeightField Mask by Objectの出力に接続します。
-
Destination に移動して
sink
と入力します。 -
HeightField Mask Clear SOPノードをもう1個追加して、現在の
マスク
を削除します。
基本セットアップ: ソルバ ¶
Shallow Water Solverはコアオペレータで、上流の入力を処理します。ここで得られるもう1つのHeight Fieldは、出力のwater
フィールドに格納されます。
-
Shallow Water Solverを追加して、それをシンクのHeightField Mask Clearノードに接続します。帯域が
source
マスクとして表示されます。 -
Bindings タブに移動して、 Seabed Layer が
height
、 Source Layer がsource
、 Sink Layer がsink
になっていることを確認します。 -
Setup ▸ Constraint Updates に移動して、 Source Scale を
0.2
に変更します。source
帯域が低くなります。 -
プレイバーのボタンをクリックしてシミュレーションを開始します。
-
カラーを表示するには、ソルバの Output タブを開いて Visualization を Color by Water Layer に変更します。
水が地形上を流れ、石の間の隙間を満たし、シンクオブジェクトの周りで消えてなくなります。