Houdini 20.0 オーシャンと水面

Shallow Water Solver

浅瀬の状況下での水を素早く作成する方法。

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 ValueBG Value があります。 FG Value1に設定すると、シンクの強度は最大になります。 一方、 BG Value0にすると、水はソーシングも削除もされなくなります。 シンクを使用し、 FG Value0.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 LayerSeabed Layer に追加されます。 ビューポートでは、水は土台となる衝突サーフェスから押し上げられているように見えます。 オフの時、水は衝突ジオメトリ上の薄い色付きフィルムのように見えます。

基本セットアップ: Height Fieldとマスク

技術的に言えば、完全な浅瀬のシミュレーションをセットアップするには、3個のノードが必要です。 次の例ではさらに多くのノードが必要で、sourcesinkマスクを追加します。 まずはHeightFieldノードから始めます。

  1. obj レベルで、Geometryノードを作成し、その中に入ります。

  2. Geometryノード内で、HeightFieldノードを作成します。

  3. Size20,20に設定します。

  4. Grid Spacing0.025に設定し、十分なディテールが得られるようにします。

この時点では何も表示されません。 この例では、サーフェスのディテールはディスプレイスメントマップを通して追加されます。 マップは、商用のリポジトリで入手したものや自分でペイントしたものなど、任意のもので構いません。 ここでは、小石や石のある地面を使用します。

  1. HeightField Fileノードを追加して、その入力をHeightFieldの出力に接続します。

  2. File で、使用したいディスプレイスメントマップをロードします。

  3. Layering サブペインで、 Layer Nameheightに変更します。

  4. Size20に設定し、マップとHeight Fieldを揃えます。

  5. そうしてできたHeight Fieldが高すぎたり平坦すぎる場合は、 Height Scale を変更します。

Height Fieldがビューポートに表示され、水ソースを描画できるようになりました。

  1. HeightField Paintを追加して、それをHeightField Fileノードに接続します。

  2. Layermaskに設定されていることを確認します。

  3. ビューポート上でマウスカーソルを動かして、Enterを押します。大きくて赤い球はブラシを表し、マスクを描画できます。

  4. ブラシの Radiusで調整するか、手動で約0.5の値に設定します。

  5. マスクをペイントします。ブラシはHeight Fieldに沿って動き、後には赤いマークが残ります。ここでのマスクは地面の亀裂で、そこから水があふれ出ます。

  6. マスクをソースに変換するため、HeightField Copy Layerノードを追加し、それをHeightField Paintノードに接続します。

  7. Destinationsourceと入力します。

  8. HeightField Mask Clearノードを追加して、現在のマスクを削除し、ネットワークを正常に保ちます。

次はシンクを追加します。オブジェクトを使用して、シンクの形状と位置を制御します。

  1. Sphereノードまたは他の任意のオブジェクトを追加します。

  2. 必要に応じて Uniform Scale を変更し、オブジェクトをスケールします。この例では6に設定します。

  3. HeightField Mask by Objectノードを追加します。

  4. その1番目の入力にHeightField Mask Clearノードを、2番目の入力にSphereを接続します。

  5. Blur Radius3に変更して、マスクを滑らかにします。滑らかにしないと、流体がシンクの境界で切り取られたようになってしまいます。ブラーされたマスクの方が自然な仕上がりになります。

  6. HeightField Copy Layerをもう1個追加して、それをHeightField Mask by Objectの出力に接続します。

  7. Destination に移動してsinkと入力します。

  8. HeightField Mask Clear SOPノードをもう1個追加して、現在のマスクを削除します。

基本セットアップ: ソルバ

Shallow Water Solverはコアオペレータで、上流の入力を処理します。ここで得られるもう1つのHeight Fieldは、出力のwaterフィールドに格納されます。

  1. Shallow Water Solverを追加して、それをシンクのHeightField Mask Clearノードに接続します。帯域がsourceマスクとして表示されます。

  2. Bindings タブに移動して、 Seabed LayerheightSource LayersourceSink Layersinkになっていることを確認します。

  3. Setup ▸ Constraint Updates に移動して、 Source Scale0.2に変更します。source帯域が低くなります。

  4. プレイバーのボタンをクリックしてシミュレーションを開始します。

  5. カラーを表示するには、ソルバの Output タブを開いて VisualizationColor by Water Layer に変更します。

水が地形上を流れ、石の間の隙間を満たし、シンクオブジェクトの周りで消えてなくなります。

オーシャンと水面

Shallow Water Solver

オーシャン

波紋ソルバ