Houdini 21.0 Height Fieldと地形

Shallow Water Solver(浅水ソルバ): フィールド

Shallow Water Solverで魅力的な効果を生成します。

On this page

Note

このガイドでは、Height FieldとShallow Water Solverに関する基礎知識が必要です。 また、この章の例の一部は、基本的なセットアップとワークフローに慣れるためにShallow Water Solver入門でのHeight Fieldとソルバの設定を基にしています。

Shallow Water Solver SOP Output タブを見ると、 Velocity(vel)、加速度(accel)、渦度(vorticity)のデータをレイヤとして格納できる3つのパラメータがあります。 これらの情報は、Velocityや渦度の差を可視化するのに役立つだけでなく、軌道効果の表現にも活用することができます。 また、フィールドをシミュレーションの駆動に利用するという応用例もあります。

Velocity

Velocityはデフォルトで有効になっており、異なるVelocityをシミュレーションに直接マッピングすることができます: Visualization ドロップダウンから Color Water by Layer を選択してください。 Shallow Water Solver入門のページを既にご覧になった方なら、このオプションは水のVelocityを表現したターコイズブルー色のグラデーションを追加することをご存知でしょう。 Visualization パラメータは、そのグラデーションの色分布を制御することができます。

詳細は、Geometry Spreadsheetを開いて、 Primitives ボタンをクリックしてください。 そこには、合成されたvelocityレイヤはなくて、代わりに個別のvel.xvel.yvel.zのレイヤがあることが分かります。 また、Height Fieldは物理的な高さを持たない2Dグリッドであるため、vel.yは常にゼロであることを知っていることが重要です。

Vorticity

vorticityレイヤには、各ポイントにおける局所的な回転運動が格納されます。 絶対値が大きいほど回転速度が速いことを示します。 プラスのVorticity値は、上から見下ろした際に反時計回りの回転を示し、マイナスのVorticity値は時計回りの回転を示します。

Shallow Water Solverには、Vorticity(渦度)を可視化する組み込み機能が用意されておらず、独自の解決策が必要になります。

Acceleration

Acceleration(加速度)とは、時間における物体のVelocity変化量の速さのことです。 これは、加速、減速、方向転換を表現することができます。 velcoityレイヤと同様に、accelerationレイヤは3つのコンポーネント(accel.xaccel.yaccel.z)で構成されていますが、ここでもXコンポーネントとZコンポーネントのみが関係しています。 このレイヤを表示する既成の機能はなくて、独自の解決策が必要になります。

Force

Shallow Water Solverの Binding タブには、空っぽの Force Mask Layer フィールドが用意されています。 ここで、カスタムのアニメーションマスクを作成し、それをスロットに接続することができます。 Shallow Water Solverは、このマスク値を用いて、水を押し出したり変位させます。

Tip

さらに下部にあるサンプルページでは、脈動する放射状のforceレイヤの作成方法を説明しています。

可視化: レイヤ

HoudiniのHeight FieldにはHeightField Visualize SOPが用意されており、 最大9枚のレイヤに対してカスタムカラーを定義することができます。 このノードの一般的な応用例はテクスチャリングです。

HeightField Visualize SOPは、通常ではネットワークの最終ノードとして配置します。 これによって、すべてのレイヤが利用可能になります。 このノードの使用方法は以下の通りです:

  • Material セクションに Height Ramp があります。 このグラデーションは、heightレイヤの値に応じて地形を色付けします。 Compute Range ボタンをクリックすると、グラデーションのすべての色域を地形にマッピングすることができます。 Presets ボタンをクリックすると、事前定義された様々なカラーランプを選択することができます。

  • 9個の Layer パラメータには、すべての既存レイヤをリストする関連ドロップダウンメニューがあります。 そのドロップダウンメニューからレイヤを選択するか、または、レイヤ名をその空っぽのパラメータフィールドに入力してください。 その後、 Color を定義します。レイヤは、その選択した色で表示されます。

Note

このレイヤ番号はレイヤの重ね順も示しています。 例えば、vel.xvel.zをそれぞれ Layer 1Layer 2 に割り当てて、waterLayer 3 に割り当てた場合を考えてみましょう。 この場合では、waterレイヤがVelocityレイヤを覆い隠すため、それらのレイヤは表示されなくなります。 正しい結果を得るには、waterレイヤを Layer 1 に割り当ててください。

可視化: 軌道

Volume Trail SOPを使用してShallow Water Solverのレイヤから得られた情報を可視化することで、魅力的な渦巻きやカールの効果を伴った軌道を作成することができます。 Volume Trail SOPは、その名前が示す通りでボリュームを表示するために設計されましたが、Height Fieldは2Dグリッドです。 Y座標は常にゼロであるため、それが原因で平面的な表現しか表示されません。

  1. ネットワークにVolume Trail SOPを追加して、 2番目 の入力をそのShallow Water Solver SOPの出力に接続します。

  2. Grid SOPを配置して、その出力をそのShallow Water Solver SOPの 1番目 の入力に接続します。

  3. そのGrid SOPの Size パラメータを調整して、HeightField SOPSize パラメータの値と一致させます。例えば、Height Fieldが100m×100mの場合、 両方 のノードの Size パラメータの値も100となります。

  4. そのGrid SOPの Rows パラメータおよび Columns パラメータは、軌道の解像度を定義します。 これらは、いくつかの要因に依存するため、正確な値をここで指定することはできません。

  5. そのVolume Trail SOPの Velocity Volumes フィールドに、可視化したいフィールド名を入力します。 フィールドは、その関連ドロップダウンメニューから選択することもできます。

  6. 次に、 Trail Length パラメータを調整します。軌道が長いほど描画に時間がかかり、より密な“マップ”が生成されます。

浅水シミュレーションがキャッシュ化されていれば、プレイバーの再生ヘッドを移動させるか、または、 Play ボタンを押すことで、その軌道の動きを確認することができます。

forceフィールドの作成

Houdiniではカスタムフィールドを作成するのに多様な方法が用意されています。 しかし、Shallow Water Solverと併用する場合、様々なテクニックで共通する事があります。 それは、フォースをマスクに変換しなければならないことです。 以下の例では、マスクの中心から水を押し出す放射状のアニメーションマスクの描き方を説明しています。

地形

フォースをより見やすくするために、地形を小さくしてください。 HeightField SOPの Size パラメータを100, 100に設定します。 ディテールを上げるために、 Grid Spacing パラメータを0.5に設定します。 これは、Shallow Water Solver SOPの Voxel Size Scale パラメータの値にもなります。 地表のディテールを増やすために、おそらくHeightField Noise SOPAmplitude パラメータと Element Size パラメータを下げなければなりません。

  • 地形はお好みに合わせて調整して構いませんが、水が地形上を伝播できるよう、あまり高くなりすぎないようにしてください。

  • また、水が生成される位置を決定するためにsourceレイヤが必要です。このレイヤの作成手順は、Shallow Water Solverのページで説明しています。

VEXスクリプト

ここでは、伝播する同心リングを生成し、それをマスクに変換するVEXスクリプトを使用します。 いくつかのカスタムパラメータによって、生成されるフォースを完全に制御することができます。 地形にスクリプトを適用するために、HeightField Wrangle SOPが必要です。 ネットワーク内のShallow Water Solver SOPの 直前 にHeightField Wrangle SOPを配置して、 1番目 の入力を上流ネットワークに接続します。

次に、以下のスクリプトを⌃ Ctrl + Cでコピーして、そのHeightField Wrangle SOPの VEXpression フィールドに⌃ Ctrl + Vでペーストします。 Creates spare parameter for each unique call of ch() ボタンをクリックして、カスタムパラメータをそのWrangleのUIに追加します。

// Parameter section
vector center = chv("center");       // カスタムパラメータ: 波の中心
float speed = chf("speed");          // カスタムパラメータ: 波の速度
float frequency = chf("frequency");  // カスタムパラメータ: 波の周波数
float amplitude = chf("amplitude");  // カスタムパラメータ: マスク強度(=フォース強度)
float falloff = chf("falloff");      // カスタムパラメータ: 強度減衰係数
float time = @Time;                  // 現在のシミュレーション時間

// 現在のHeight Field位置
vector pos = @P;

// 現在の位置から波の中心までの距離
float dist = distance(pos, center);

// 波の作成
float wave = sin(dist * frequency - time * speed);

// 波を[0,1]範囲に再マッピングして、その結果を波の強度でスケール
float mask = fit(wave, -1, 1, 0, 1) * amplitude;

// オプション: 波の強度を波の中心から離れるほど減衰させます
mask *= exp(-dist * falloff);

// その結果をHeight Fieldの@maskレイヤに書き込み
@mask = mask;

パラメータ

下記のテーブルには、カスタムパラメータの役割を載せています。 実際の値は地形サイズに強く依存します。 以下の設定は、100m×100mの地形サイズでテスト済みです。 変更の効果を確認するには、そのHeightField Wrangle SOPの青い Display/Render フラグを有効にしてください。

パラメータ 説明
Center 波の中心を定義します。Height Fieldは2Dであるため、XとZの値のみが必要です。この中心は、ペイントされたsourceマスクの近辺または内側に配置してください。これによって、波が水面に影響を与えるようになります。プラスとマイナスの値を使用することができます。例えば、100m×100mの地形では、 端はX = -50 端はZ = 50となります。
Speed 波の伝播速度。2から5の間の値から始めてください。
Frequency このパラメータは、波/リングの数を定義します。値が小さいほど密なパターンになります。値が大きいほど太いリングが生成されます。0.2から1の間の値に留めるようにしてください。
Amplitude これは、マスクの強度です。このマスク値はフォースに変換されます。このサンプルシーンでは、1から5の間の値から始めてください。 Amplitude の値が非常に高い場合、不安定な状態を引き起こす可能性があります。
Falloff 波が中心から離れるにつれて減衰させることができます。このパラメータは非常に敏感なので、0.02程度の小さな値から始めてください。

レイヤの作成

次の手順は、maskレイヤをシミュレーション駆動に使用可能なforceレイヤに変換することです。 sourceレイヤと同様に、HeightField Copy Layer SOPも必要となります。 このノードをそのHeightField Wrangle SOPとそのShallow Water Solver SOPの間に配置して接続して、 Destination フィールドにforceと入力します。

そのHeightField Copy Layer SOPの下流にHeightField Mask Clear SOPを配置して接続して、円マスクをリセットします。 Layer 1 フィールドにmaskと入力します。

ソルバ調整

ソルバ側でもいくつかの調整が必要です。 Setup タブのパラメータの大半は、地形の形状やサイズに強く依存しますが、必ず考慮すべき設定がいくつかあります:

  • Setup タブの Constraint Updates セクションに進みます。 Forces Frequency トグルを有効にして、そのドロップダウンメニューから Every Substep を選択します。 これによって、各シミュレーションサブステップでforceレイヤの値が適用されます。 フレーム毎にフォースを適用することもできますが、(シミュレーション時間が長くなってしまいますが)サブステップ方式の方が結果が滑らかになる傾向があります。

  • Bindings タブの Force Mask Layer フィールドの関連ドロップダウンメニューからforceを選択して、ソルバと新規レイヤ間の接続を確立します。

Simulation タブの Voxel Size Scale パラメータを調整します。 この例(100m×100mの地形)では0.5の値を使用しましたが、異なる値を入力しても構いません。 また、 Simulation タブの Cache Memory (MB) を増やすことで、その結果をコンピュータのRAMにキャッシュ化して、高速再生を実現することができます。

シミュレーションを実行すると、以下のタイムラプス動画のように、フォースが水を押して弓形の波を生成する様子が確認できるはずです。

Height Fieldと地形

生成

  • 地形の生成

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

  • マップからHeight Fieldを生成

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

  • 単独の山

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

  • レイヤ

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

  • 段丘化(Terracing)

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

  • 歪曲(Distortion)

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

  • 地形のペイント

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

  • 投影

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

  • パッチ(継ぎ合せ)

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

  • パターン

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

  • リサンプリング

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

  • 様々な特徴部

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

散布

マスク

  • マスキング

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

  • ライトマスク

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

自然現象

VEX

テクスチャ

Shallow Water Solver(浅水ソルバ)