Houdini 21.0 Height Fieldと地形

Shallow Water Solver(浅水ソルバ): 入門

洪水のHeight Field

On this page

大量の水を生成する高速なメソッドが必要な状況を想像してみてください。 パーティクルベースの流体シミュレーションは計算負荷が高すぎるだろうし、 オーシャンサーフェスは柔軟性に欠ける場合がほとんどでしょう。 ここで、HoudiniのShallow Water Solver(浅水ソルバ)が活躍する典型的な出番になりました。 なぜなら、このソルバは高精細なシミュレーションと水面を表現するオーシャンスペクトルとのギャップを埋めてくれるからです。 Shallow Water Solverは、流れる水をシミュレーションすることができ、以下のような表現を生成することができます:

Shallow Water Solverは、HoudiniのHeight Fieldの拡張と考えることができます。 技術的な観点では、Height Fieldとは、グリッドポイントに高さ(またはその他の)情報がいわゆるレイヤとして格納された2Dグリッドです。 heightレイヤは、Height Fieldで扱う主要なレイヤの一つです。 Height Fieldを扱う代表的なレイヤには、sedimentflowdebrisなどがあります。 これらのレイヤは、例えば地質が削られたり盛られたりすることで地形を形成します。 実際には、特定の見た目を実現するために地形の高さ情報を操作していることになります。 Shallow Water Solverも同様の原理で動作し、地形にwaterレイヤを追加します。

heightレイヤの他に、maskレイヤも主要なレイヤです。 マスクは、効果をユーザ定義の領域に制限します。 HoudiniのHeight Fieldには、マスクを描画したり、地形のトポロジやオブジェクトの体積からマスクを計算したりするための多様なノードが備わっています。 マスクは、水が注入される箇所や排水される箇所を定義するので、Shallow Water Solverと組み合わせて使用する上で非常に重要なレイヤです。

制限事項

このShallow Water Solverは、上記のような小規模な効果だけでなく、大規模なシミュレーションにも使用することができます。 Shallow Water Solverは非常に高速ですが、特に高解像度や高速伝播時には安定性の問題が生じることが多く、ジッターやスパイクが発生したり、Height Fieldのボクセルが消失するといったことがよくあります。

  • Shallow Water Solverでは、水しぶきや飛沫といった二次的な水効果のシミュレーションはできません。

  • 波が砕ける表現は不可能です。

Height Fieldのセットアップ

Shallow Water Solverを動作させるにはHeight Fieldが必要になります。 基本的なシーンの設定については、Height Fieldの基本セットアップのページを参照してください。 ここでは、基本的な説明のみに留めて、始めていきます。

  1. obj レベルで、⇥ Tabを押してタブメニューを開きます。そこでhfと入力して HeightField を選択して、新しいGeometry OBJを作成します。 そのジオメトリノードをダブルクリックして中に入って、HeightField SOPにアクセスします。 ビューポートには、空っぽのheightレイヤとmaskレイヤを持つHeight Fieldグリッドを表現した平坦な平面が表示されます。

  2. 表面のディテールを増やすために、 Grid Size パラメータを1に下げます。 この値はソルバにも関係することに注意してください。

  3. HeightField Noise SOPを追加して、 1番目 の入力をそのHeightField SOPの出力に接続します。このノードは高さ情報を追加し、山や谷のある地形を生成します。

地形の形を決める

地形のトポロジは、水の挙動に強く影響します。 ただし、極端な高低差があるシーンは最終的に見栄えが悪くなる可能性があります。 ここでは比較的平坦な地形を扱います。 HeightField Noise SOPで、 Amplitude パラメータを200に設定して、滑らかな丘陵を生成します。 また、 Element Size パラメータを600に上げます。 このパラメータは、フラクタルパターンのスケールを変更し、値を大きくすると山頂の数を減らすことができます。

さらに表面構造を加えることで、海底をより面白いものにすることができます。 これを行なう良い方法は、HeightField Distort by Noise SOPを追加することです。 1番目 の入力をそのHeightField Noise SOPの出力に接続します。 次に、 Amplitude パラメータを20に設定します。 このパラメータは、地形を変形させるカールノイズの強さを制御します。

ソース

Shallow Water Solverでは、水の発生源を定義するためにsourceレイヤが必要です。 このsourceレイヤは実質的にはマスクです。 Height Fieldガイドのマスクページを参照することを推奨します。 そのページでは、マスクの作成、結合、操作に関する全体的な概要が記載されています。 Height Field用VEXスクリプトのページでは、スクリプトを用いたカスタムマスク(例えば、リング楕円)を作成するいくつかの方法を記載しています。

Note

シンクを用いて水を消失させることもできます。

  1. HeightField Paint SOPを設置して、その入力をそのHeightField Distort by Noise SOPの出力に接続します。

  2. そのHeightField Paint SOPで最も重要なパラメータが FG Value です。 これは、水の注入量を制御します。 1を超える値を設定すると、単位時間あたりの水量が増加します。 このプロジェクトでは、0.5の値を入力します。

    1の値は、注入される水の基準量となります。 0.5の値ではその基準量の50%のみが注入され、2の値では注入量が倍になります。

  3. ビューポート上にマウスカーソルを置いて、Space + 2を押してビューポートをTOPビューに切り替えます。 その後、Enterを押して描画モードに入ります。 赤い球体はペイントブラシのサイズを示します。を使用してブラシのサイズを変更することができます。

  4. を押したままドラッグして、地形上でペイントします。 ビューポートのグリッドは、地形の高低差を把握するのに役立ちます。 下記の画像のようなパターンをペイントしてください。

  5. ESCを押して描画モードから抜けます。

マスクの微調整

現時点では、そのマスクは構造のない単なる赤い領域です。 より面白いものにするために、HeightField Mask Noise SOPを追加して、 1番目 の入力をそのHeightField Paint SOPの出力に接続します。 このノードは、異なるサイズと“不透明度”の斑点を持つマスクを生成します。

Combine Method パラメータを Subtract に設定すると、ペイントした領域の 外側 のすべてのマスクが除去され、ペイントした領域の 内側 にも斑点が生成されます。 Amplitude パラメータを使用することで、注入される水の量を直接調整することができます。 より多くのバリエーションを得るために、 Amplitude パラメータを0.5に設定します。 Element Size パラメータは、赤い斑点のサイズを変更します。 100に設定すると、斑点が小さくなるため、パターンを崩すことができます。

sourceレイヤの作成

これまで、maskレイヤのみを操作してきました。 そのmaskレイヤをsourceレイヤに変換するには、HeightField Copy Layer SOPが必要です。 このノードの入力をそのHeightField Mask Noise SOPの出力に接続します。 次に、そのHeightField Copy Layer SOPのパラメータセットに移動します。 Destination フィールドにsourceと入力します。 これでmask情報が新しいレイヤに転送されました。 Shallow Water Solverでは、その新しいレイヤを評価して、その赤い領域に水を生成することになります。

また、HeightField Mask Clear SOPを使用してそのmaskレイヤをリセットしても良くなりました。 HeightField Mask Clear SOPをネットワークに追加し、Layer1フィールドにmaskと入力します。 このノードはmaskレイヤを削除せず、代わりにすべての値をゼロに設定します。

ソルバ

地形に水を張るための準備が整ったので、Shallow Water Solver SOPを設置することができます。 入力を上流の最終ノードの出力に接続します。 デフォルト値でシミュレーションを実行し、変更すべき問題点を確認することをお勧めします。

最も明らかな問題点は、水がほとんど見えずその結果の評価が困難であることです。 これを改善するために、Shallow Water Solver SOPの Output タブを開きます。 Visualization ドロップダウンメニューから Color by Water Layer を選択します。 ターコイズ色の領域に青い糸状の構造が確認できるはずです。

水は即座に盆地を満たし始めますが、水深は非常に浅い状態です。 さらに、水が地形上をほとんど伝播しないという問題もあります。

解像度

Simulation タブには、HeightField SOPの Grid Spacing パラメータに相当する Voxel Size Scale パラメータがあります。 役立つワークフローは、両パラメータに同一値を設定することです。もし異なる値で作業したいのであれば、このソルバのパラメータが地形の値を上書きすることに注意してください。

高解像度の地形/シミュレーションは不安定性を引き起こす可能性もあります。 ただし、解像度は地形のサイズに強く依存します。 広大な領域では、通常では0.5から2の値で作業します。 20m×20m程度の小規模な地形では、十分なディテールを得るのに0.025以下の値が必要となります。

減衰やVelocity制限で解決できない安定性の問題が発生した場合、 Voxel Size Scale パラメータの値を上げることを検討してください。

Source Scale

より多くの水を得るには、 Setup タブの Constraint Updates セクションにある Source Scale パラメータの値を上げるのが効果的な方法です。 このパラメータは、sourceレイヤの値に対する乗数となります。 100ほどの高い値を設定すると、初期の水ボリュームが大幅に増加します。 また、水ボリュームの上面は不規則な構造を示しています。 これは、マスクが半透明であるため、その箇所で地形が考慮されるためです。 完全に不透明なマスクを使用すれば、上面は平坦になります。

シミュレーションの初期状態として山のような形状の水ボリュームを望まない場合、このパラメータをアニメーションさせると良いでしょう。 例えば、フレーム0で注入を開始して、フレーム100でフル“パワー”に達するようにしたいとします。

  1. プレイバーで、プレイヘッドをフレーム1までドラッグします。

  2. Source Scale パラメータを0に設定し、そのパラメータをAlt + クリックでアニメーションキーを作成します。

  3. プレイヘッドをフレーム100まで移動させます。

  4. Source Scale パラメータを15まで上げて、別のキーを作成します。

ソルバ上で、 Reset Simulation ボタンを押して新しいパスを開始します。 これで水はゆっくりと上昇しますが、縁と溶岩流の構造を保っています。

Time Scale

水の伝播速度を制御するには、 Setup タブの Time Scale パラメータを使用します。 地形がかなり広いため、5程度のスケールが適切でしょう。 また、不安定な動きが生じていることに気づかれたかもしれません。 Simulation タブでシミュレーションステップ数を増やす前に、必ず Setup タブのパラメータでシミュレーションを安定させてください。 効果的な方法として、 Velocity Diffusion パラメータを0.3に設定して、流体に適度な粘性を加えるのが良いでしょう。

Speed LimitsとDamping Layer

さらに役立つ方法として、 Speed Limits セクションのパラメータを活用する方法があります。 Max Wave Speed トグルを有効にして、その値を2に設定します。 これは、Velocityがこの値より速い波をすべてこの値に制限します。 これによって、全体の挙動が大幅に改善され、地形を水で満たすことが可能になります。

境界付近のシミュレーション品質を向上させるために、 Damping Layer を取り入れるのも検討すると良いでしょう。 Enable Damping Layer トグルを有効にして、 Layer Size パラメータを30に上げます。 このパラメータは、境界で波が減衰するように補助します。 この値が十分大きくないと、境界で波が跳ね返り、水中に戻ってしまう現象が見られる場合があります。 大規模な地形では、通常では20から50の値で十分です。 4つの Axis トグルで、減衰レイヤの影響を受ける境界を選択することができます。 たいていの場合、デフォルト設定を使用します。

シンク

水を消失させたい場合、sinkレイヤを作成すると良いでしょう。 sourceレイヤと同様に、このレイヤもマスクから生成します。 sourceレイヤやsinkレイヤの作成には、同じノードと手法を使用することができます。 ただし、sinkレイヤはsourceレイヤなしでは動作させることができません。

waterレイヤ

シミュレーションから得られるwaterレイヤは、Height Fieldの一部です。 Shallow Water Solverは、絶対的なwaterレイヤ値と相対的なwaterレイヤ値を区別します。 モードを切り替えるには、 Output タブに移動します。 Output Water Height is Absolute が以下の場合の時:

  • 有効な時:waterレイヤには水面の位置が含まれます。

  • 無効な時:waterレイヤには各ボクセルにおける水柱の高さが含まれます。

Output Terrain Includes Water Height トグルを有効にすると、 Water LayerSeabed Layer に追加されます。 ビューポート上では、水が下層の衝突面から浮き上がったように表示されます。 無効にすると、水は衝突ジオメトリ上に薄い色の膜として表示されます。 このモードは、濡れ効果を作成したい場合に有用です。

Height Fieldと地形

生成

  • 地形の生成

    HoudiniのHeight Fieldを用いた基本的なワークフロー。

  • マップからHeight Fieldを生成

    マップからディテールの細かい地形を生成することができます。

  • 単独の山

    必要な場所にカスタムの丘や山を生成します。

  • レイヤ

    レイヤを積み重ねてマスクを適用することで、よりリアルな表現を高めます。

  • 段丘化(Terracing)

    頂上に近いほど段状の地形を生成します。

  • 歪曲(Distortion)

    地形を形作って自然な見た目にします。

  • 地形のペイント

    アーティストの気分で、ご自身で景観をペイントしましょう。

  • 投影

    任意のジオメトリをHeight Fieldの一部に変換します。

  • パッチ(継ぎ合せ)

    パッチ(継ぎ合せ)とカットアウト(切り抜き)を用いて地形を組み立てます。

  • パターン

    基本的なジオメトリパターンからリアルな地形を生成します。

  • リサンプリング

    地形の解像度を段階的に上げます。

  • 様々な特徴部

    地形を変換、エクスポート、特徴豊かにします。

散布

マスク

  • マスキング

    修正したい領域やディテールを加えたい領域を定義します。

  • ライトマスク

    地形上の日照領域からマスクを作成します。

自然現象

VEX

テクスチャ

Shallow Water Solver(浅水ソルバ)