Houdini 21.0 Height Fieldと地形

単独の山

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

On this page

イントロダクションのページのゼロからHeight Fieldを生成する方法の章では、丘や谷を含んだ完全な地形を生成する方法について説明しています。 しかし、時には単体の丘のみが必要だったり、山の出現位置をより細かく制御したい場合もあります。 例えば、そのような単独の山をパッチとして使用して、別のHeight Fieldと結合する方法があります。

一つの解決策として、独自にマップを描画して、そのマップをHoudiniに読み込んで押し出す方法があります。 この利点は、画像処理ソフト内で異なるレイヤを組み合わせて、地形に特徴部を直接加えることができることです。 マップからHeight Fieldを生成のページでは、画像から地形を生成する方法の詳細が説明されています。 何か変更する必要があれば、マップを描画し直さなければなりません。

また、空っぽのHeight Field上にオブジェクトを投影することもできます。 例えば、円錐や山に似た他のジオメトリを使用することができます。 その後、そのオブジェクトを歪ませたり侵食させることで、自然な見た目に仕上げることができます。

山を生成する別の方法として、Terrain FXシェルフツールを開いて、Terrain: Mountainをクリックする方法があります。 このツールは、HeightField Project SOPを利用しています。

下記では、いびつな領域上にオブジェクトを散布して、数行のVEXコードを記述して山を生成するワークフローも説明しています。

最後に、HeightField Noise SOPから特定のノイズタイプを使用してマスクを描画することで、孤立した山頂を生成することもできます。

マスキングメソッド

マスクは、HeightField Draw Mask SOPやHeightField Mask Noise SOP、または、両方の組み合わせで作成することができます。 山は、このマスクの赤い領域内に出現します。

  1. obj レベルで、HeightField OBJを作成します。その新規ノードをダブルクリックして、その中に入り、実際のオブジェクトを確認します。

  2. HeightField Draw Mask SOPを配置して、その入力をHeight Field SOPの出力に接続します。

  3. ビューポート上にマウスカーソルを置いてEnterを押します。これで描画モードに入ります。

  4. を押しながら、平面上に任意の形状を描画します。完了したら ⎋ Escを押して描画モードから抜けます。

  5. HeightField Draw Mask SOPの Masking タブにある Blur Radius50まで上げると、滑らかな境界が得られます。

Tip

ハードエッジな平坦部のないより自然で侵食された形状を得たいのであれば、 Blur MethodBox Blur に設定してください。

再マッピング

マスクを山に変換するには、Height Fieldを再マッピングすると良いでしょう。

  1. ネットワークにHeightField Remap SOPを追加します。

  2. そのHeightField Remap SOPの 1番目 の入力をHeight Field SOPの出力に接続します。 2番目 の入力をマスクの出力に接続します。

  3. マスクされた領域を隆起させるために、 Output Max を上げます。 適切な効果が確認できるように400の値から始めてください。ぼやけたエッジは滑らかな地盤を生成します。

これで、他のHeight Fieldノード(典型的なものだと、Noise、Distort、Erode系のノード)を適用することで山を形成することができます。 特にDistort系ノードは、山の垂直な“壁”に構造を加えるので注目すべきです。

また、地面が侵食されないように、作成したマスクを使用して山を形成することもできます。 HeightField Erode SOPの Main タブと Advanced タブには、 Erodability パラメータと Removeal Rate Masks パラメータがあります。 各パラメータのドロップダウンメニューを開いて、 Mask on を選択してください。 次に、デフォルトのエントリをmaskに置換してください。

散布メソッド

マスクの代わりに、任意のジオメトリを使用して、それをHeight Fieldに変換して山を作成することもできます。 その魔法の言葉が“スキャタリング(散布)”であり、この手法の詳細は、散布を使用したHeight Fieldの生成のページで説明しています。 ここでは、山を生成するための面白い土台形状を作成する方法を学びます。

以下の手法は、少々手間がかかるように思えるかもしれませんし、それよりも山を生成するのに早くて便利な方法は確かに存在します。 しかし、この例では、別の手段で目標を達成できることを説明しています。 また、地形をカスタマイズしたりランダム化したりするための調整項目が豊富で、非常に柔軟な手法でもあります。

この考え方は、いびつな平面ポリゴンオブジェクトを地面として定義し、その地面上にポイントを散布することです。 次に、チューブなどの基本オブジェクトをそれらのポイントにコピーします。 地面の位置から各チューブの上面までの距離が高さを決定します。 つまり、地面の中心に近いチューブの高さを高くして、地面の境界に近いチューブの高さを低くすることで得られる全体の形は、 空っぽのHeight Fieldに投影できる山の形になります。

山の土台

土台オブジェクトのサイズと形状は、山の麓を定義します。

  1. obj レベルで、Geometry OBJを作成します。その新規ノードをダブルクリックして、その中に入ります。

  2. Circle (Polygons) SOPを追加します。いびつな構造を生成するために、この円を変形させていきます。

  3. 現在の円はZX平面に沿って配置されています。 Orientation ドロップダウンメニューから ZX Plane を選択してください。

  4. 円の法線を上向きにするため、 Reverse トグルを有効にします。

  5. Uniform Scale は、山をカスタマイズする最初のパラメータです。デフォルトのHeight Fieldが1000m×1000mであることを考慮すると、この値は小さすぎないように設定してください。 この値を300から開始して、直径600mの円盤を作成します。

  6. エッジやギザギザを増やすために、 Division200に上げます。

変形

ノイズは、マスク、オブジェクト、ポイントクラウド、マップなどにバリエーションを加える一般的な手法です。 このシーンでは、ノイズは土台オブジェクトを変形させます。

  1. Attribute Noise SOPを追加して、その入力をCircle SOPの出力に接続します。 これで、色が付いた縞模様の円盤が表示されます。

  2. この色は Attribute Names パラメータのデフォルト値のCdから起因しています。 この値を“位置”を意味するPに変更します。

  3. Attribute Names の隣に XYZ ボタンがあります。変形はXZ方向にのみ適用すべきです。 Y ボタンをクリックして、その円のY方向を無効にします。

  4. Noise Value セクションの Amplitude の値を200に変更します。値が大きいほど歪曲が大きくなります。

  5. Noise Pattern セクションの Element Size パラメータでノイズ量を制御します。適度な歪曲として250を設定します。

Note

他にも、Point Jitter SOPを使用することで、地面オブジェクトの形状をランダムにすることができます。 その結果はほぼ同様になります。

下図は、円からポリサーフェスへの変換結果です。

移動

円が変位し、その中心がシーンの原点からずれているが分かります。 当然ながら、これは山の位置に影響を及ぼします。そのため、そのオブジェクトをシーンの原点に戻すのが望ましいです。

Vertexアトリビュート、Pointアトリビュート、Primitiveアトリビュートとは対照的に、Detailアトリビュートはオブジェクト自体の特性であり、その構成要素の特性ではありません。 例を挙げると、“ボールは赤い”という場合、それはDetailアトリビュートを指しています。 なぜなら、それはボール全体を指しており、それを構成する個々のコンポーネントを指しているわけではないからです。

オブジェクトをシーンの原点に戻すためには、3行のVEXコードが必要です(VEXスクリプトは非常に短く記述することができます)。 Transform SOPを使用して Move Centroid to Origin ボタンをクリックしてオブジェクトをシーンの原点に戻すこともできますが、 円の形状やスケールを変更する度にこのボタンを必ずクリックする必要があります。 そのため、位置の自動更新を設定する方が望ましいです。

  1. Attribute Wrangle SOPを追加して、その1番目の入力をAttribute Noise SOPの出力に接続します。

  2. Code タブで、 Run OverDetail (only once) に設定します。

  3. VEXpression 入力フィールドで、以下のコードを入力します:

    vector base_pos = getbbox_center(0);
    
    f@base_pos_x = base_pos.x;
    f@base_pos_z = base_pos.z;
    

    このコードは、位置ベクトルのbase_posを計算します。 これを行なうために、変形された円を囲んだ境界ボックスの中心を取得します。 (0)の部分は、そのgetbbox_center関数がそのAttribute Wrangle SOPの1番目の入力からオブジェクトを受け取ることを示しています。 その後、このコードはbase_posのXとZの成分を抽出して、それらを適切なアトリビュート(@base_pos_x@base_pos_z)に格納します。

  4. Transform SOPを追加して、その入力をそのAttribute Wrangle SOPの出力に接続します。

  5. Translate.X パラメータには、-@base_pos_xを入力します。

  6. Translate.Z パラメータには、-@base_pos_zを入力します。

これで、変形された円は常にシーンの原点に正確に位置するようになります。

ポイントのスキャタリング(散布)

スキャタリング(散布)とは、サーフェス上または別のオブジェクト上にオブジェクトを散布させる処理のことです。 ここでは、チューブを散布して、カスタマイズしたpscaleアトリビュートを使用して各チューブのサイズを個別に制御します。

  1. Scatter SOPを追加して、その入力をそのTransform SOPの出力に接続します。

  2. Options タブを開いて、 Force Total Count に移動します。このパラメータは、散布するポイントの数、つまり、チューブの総数を決定します。 10000の値を入力すると、ソリッドオブジェクト(中身の詰まったオブジェクト)を生成するのに十分な密度の構造が得られます。

  3. ポイントのランダムな分布を抑えるために、 Options ▸ Relax Iterations100まで上げます。

インスタンスオブジェクト

この例では、チューブをインスタンスオブジェクトとして使用していますが、他のオブジェクトでも同様に使用することができます。

  1. Tube SOPを追加します。

  2. 閉じたオブジェクトを作成するために、 End Caps トグルを有効にします。

  3. 底面のキャップは、Height Fieldのゼロレベルに正確に位置させる必要があります。 Center.Y に移動して、0.5と入力します。この値は、チューブの Height 値の1の半分です。

  4. Copy to Points SOPを配置します。その 1番目 の入力をそのTube SOPの出力に接続し、 2番目 の入力をそのScatter SOPの出力に接続します。

Copy to Points SOPの青い Display/Render フラグを有効にすると、高さや半径が同じ10000個の非常に小さなチューブが表示されます。 さらにVEXスクリプトを記述して各チューブを個別にスケールさせることで、全体的に山の形を作成することができます。

スケールコントロール

歪んだ円の中心からの距離に基づいて各インスタンスの高さを個別に変更するには、それ用のVEXスクリプトが必要です。 以下のVEXスクリプトは、チューブの直径も変更し、カスタムパラメータを含みます。 ch[type]ステートメントは、カスタムパラメータを取り入れます。

  1. 新しくAttribute Wrangle SOPを追加して、 1番目 の入力をそのScatter SOPの出力に接続し、出力をそのCopy to Points SOPの2番目の入力に接続します。

  2. 以下のコードをコピー⌃ Ctrl + Cして、 VEXpression 入力フィールドにペースト⌃ Ctrl + Vします。

vector peak_position = set(chf("offset_x"), 0, chf("offset_z"));

float base_scale = chf("base_scale");
float dist_scale  = exp(chf("steepness") * distance(peak_position,@P));

@scale = set(base_scale, fit(noise(@ptnum), 0, dist_scale, 0, chf("height")), base_scale);
  1. VEXpression の横にある Create spare parameters… ボタンをクリックして、カスタムパラメータを作成します。

  2. それらのカスタムパラメータには、以下の値を使用します:

    • チューブが重なり合うようにするために、 Base Scale20に設定します。

    • Height30まで上げます。これが山の最大高さとなります。

    • Offset XOffset Y を使用することで、山の山頂を移動させることができます。

    • Steepness の値を下げると、より自然な山が生成されます。 このパラメータは非常に敏感なので、0.007あたりの値から開始してください。

このVEXコードの説明は以下の通りです

  • base_scaleは、チューブの直径を定義するカスタム浮動小数点パラメータです。

  • peak_positionは、カスタムパラメータのoffset_xoffset_zを使用した位置ベクトルで、山の山頂を移動させます。

  • dist_scaleは、原点からのチューブの距離の指数関数です。これによって、ベル型の標高分布が生成されます。

  • @scaleは、各チューブインスタンスのサイズを定義します。 このXとZの成分(=直径)は、base_scaleカスタムパラメータで定義されています。 Y成分は、チューブの高さを決定し、より複雑なエクスプレッションで定義されています。 そのエクスプレッションのnoise関数は、山の滑らかな外観を表現する役割を担っています。

    このfit関数は、0からdist_scaleまでの値を、0からheightカスタムパラメータまでの値にマッピングします。 より現実的な結果を得るために、このfit関数は現行ポイント番号の@ptnumを用いたノイズ関数の値を入力値に使用しています。

Offset X50に設定し、 Offset Z200に設定すると、下図のような山が得られるはずです。

投影

これで、そのジオメトリを空っぽのHeight Fieldに投影して、そこに何かしらのブラーを適用して両オブジェクトをシームレスにブレンドすることができます。

  1. HeightField SOPを追加します。

  2. HeightField Project SOPを追加して、 1番目 の入力をそのHeightField SOPの出力に接続します。 2番目 の入力をそのCopy to Points SOPの出力に接続します。

  3. その結果はまだ少し“ブロック状”に見えます(下図の上部)。 しかし、HeightField Blur SOPを使用することで表面を滑らかにすることができます(下図の下部)。

丘陵のような景観

散布メソッドは、単独の山や丘だけでなく、完全な景観にも適しています。 位置が正確に定義された既存のポイントクラウドを使用して、その希望する位置に丘を配置することもできます。 散布オブジェクトとしては、円錐、半球、その他の形状、あるいは異なる形状の組み合わせも使用することができます。

例えば、わずかな散布ポイントと円錐を使用するだけで、山頂が連なった山脈を生成して、それをベース地形にパッチ(継ぎ合せ)することができます。

ノイズとマスク

最後に紹介するメソッドは、HeightField Noise SOPとマスクを使用します。 この考え方は、ノイズをスケールおよびシフトさせて、山頂が1つか2つだけ残るようにすることです。 そして、マスクを描画して、地形の生成を特定の領域に制限し、マスクにブラーをかけて山をフェードアウトさせます。 下図のように山を歪ませたり侵食させたりすることで、その結果をさらに良くすることができます。

もちろん、HeightField Noise SOPのデフォルトの Noise TypeSparse Convultion を使用しても構いませんが、 より自然な外観の山頂や尾根を得たいのであれば、 Noise TypeWorely Cellular F1 に変更すると良いでしょう。

  1. HeightField Noise SOPの Amplitude400に変更します。

  2. Element Size600まで上げます。

  3. Offset0, 0, 500と入力して、ノイズパターンをZ軸に沿ってシフトさせます。

  4. Noise Type をまだ変更していなければ、 Worely Cellular F1 に変更します。

マスキング

次に、地形をフェードアウトさせるマスクを描画して、パッチとして使用可能な山を作成します。

  1. HeightField Draw Mask SOPを追加して、それをHeightField SOPとHeightField Noise SOPの間に接続します。 そのHeightField Draw Mask SOPの出力をそのHeightField Noise SOPの 両方 の入力に接続します。

  2. ビューポート上にマウスカーソルを置いて2を押して、地形をトップビューで表示します。 Hを押して、Height Fieldをビューポート中央に表示します。

  3. 次に、HeightField Draw Mask SOPが選択されている状態でビューポート上にマウスカーソルを置いてEnterを押して、マスクの描画モードを有効にします。 を使用して、Height Fieldグリッド上にマスクを描画します。 マスクは完全な円である必要はなく、いびつな形状でも構いません。 マスクの赤い領域内に表面構造が表示されます。

  4. ESCで描画モードを抜けます。

  5. HeightField Draw Mask SOPで、滑らかなエッジを得るために Blur Radius150以上に設定します。

下図では、マスクがまだ表示された状態での結果を示しています。

Height Fieldと地形

生成

  • 地形の生成

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

  • マップからHeight Fieldを生成

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

  • 単独の山

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

  • レイヤ

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

  • 段丘化(Terracing)

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

  • 歪曲(Distortion)

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

  • 地形のペイント

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

  • 投影

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

  • パッチ(継ぎ合せ)

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

  • パターン

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

  • リサンプリング

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

  • 様々な特徴部

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

散布

マスク

  • マスキング

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

  • ライトマスク

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

自然現象

VEX

テクスチャ

Shallow Water Solver(浅水ソルバ)