Houdini 21.0 Height Fieldと地形

マップからHeight Fieldを生成

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

On this page

3Dアーティストの皆様は、おそらくディスプレイスメントマップの概念をご存知だと思います。 これは、カラー情報を高さ情報に変換するマップです。 ディスプレイスメントマップの典型的な用途としては、海の波、デジタル標高モデル、あるいは単純な基本形状から複雑な構造を生成する場合などが挙げられます。

バンプマップは法線ベクトルを変化させて凹凸を視覚的に表現するのに対し、ディスプレイスメントマップは実際のジオメトリを生成します。 一方、Height Fieldはボリュームデータで構成され、マップの高さ情報はそのベースグリッドのポイントに格納されます。 ディスプレイスメントマップを使用する際、地形品質を決定するいくつかの重要な要因があります。 最も分かりやすいパラメータは、グリッド解像度とマップ解像度です。 砂礫で覆われた小規模な地面セグメント用2Kマップは、通常では、広大な地形には適しません。 また、グリッド間隔が2mの地形は、5cm間隔のモデルほどのディテールを表現できません。

もう一つの要因は、使用されるファイル形式です。 典型的には、8ビット形式と、16ビットまたは32ビットのEXRやTIFFファイルで違いがあります。 ファイルに格納される情報量が多いほど、生成される地形は高品質になります。 8ビットファイルでは、カラー情報の不足が原因で縞模様やその他のパターンが発生してしまう場合があります。 32ビット画像は、より滑らかな表面を生成します。 とはいえ、遠方の領域や、瓦礫や草で覆われた地面平面に関しては、8ビット画像でも十分であることがよくあります。

最後に、表面の元のスケールも重要な役割を果たします。 例えば、地形の小さな区画から作成したディスプレイスメントマップを地形全体に引き伸ばして適用すると見た目が悪くなります。 一見すると、下地の地形の解像度が十分に高いために正しく見えるかもしれません。 しかし、ディスプレイスメントマップの元のサイズはわずか2m×2mです。 マップの特徴部が500倍に拡大されていることを考慮すると、画像のスケールが合わなくなっていることがわかります。 中央の赤いボックスの辺の長さは10mです。

Note

マップは、Heightレイヤまたはマスクレイヤの2通りの方法で使用することができます。 後者の使用方法については、画像からマスクを作成する方法のページで別途説明されています。

基本的なセットアップ

ディスプレイスメントマップを使用するには、基本的なHeight Fieldグリッドが必要です。 ここで説明するセットアップは、以降のすべての検討事項の基礎となります。

  1. obj レベルで⇥ Tabキーを押してタブメニューを開きます。 そこからGeometry OBJノードを作成します。その新規ノードをダブルクリックして内に入ります。

  2. 次に、HeightField SOPを追加します。マップは、このベースグリッド上に投影されます。

  3. Size4, 4に変更し、地面として機能する小さな領域を作成します。

  4. Grid Spacing0.002に下げます。この値は、グリッドポイント間の距離を決定し、微細な構造まで可視化します。 その結果のグリッドは、4,000,000ボクセルで構成されます。

マップの読み込み

ディスプレイスメントマップは、平坦なグリッドにディテールを加えます。 Houdiniには、マップを読み込むための専用ノードが用意されており、このノードは、マップやHeightレイヤに対していくつかの調整を直接加えることができます。 この例で使用されているマップは2m×2mの領域を網羅しています。

  1. HeightField File SOPを配置して、それを基本的なセットアップの既存のノードに接続します。

  2. File の横にある Open floating file chooser ボタンをクリックして、ディスプレイスメントマップを読み込みます。 前述の通り、最良の結果を得るには32ビットEXR形式を使用するのが良いです。

    Note

    非常に大きなマップを使用すると、HeightField File SOPでImage resolution too largeエラーが発生する場合があります。 この場合、メインメニューの Edit から Preferences ▸ Old Compositor を選択してください。 その後、 Cooking タブを開いて、 Resolution Limit パラメータの値を上げてください。

  3. 結果として、表面構造のない淡い赤色の表面が表示されます。 このような外観の原因は、 Layering セクションにあります。 そこでは、 Layer Namemaskに設定されており、マップがマスクとして扱われていることが分かります。 表面構造を作成するには、この設定をheightに変更してください。

サイズと高さ

これで、Height FieldはおそらくY軸のプラス方向にシフトされ、マップによっては何かしらの表面構造も認識されます。

  1. Size セクションに移動します。このセクションでは、 Size パラメータのデフォルト値が1000となっていることが確認できます。 これは、Height Field SOPのデフォルトサイズの1000に呼応しています。 マップの元のサイズを復元するために、4と入力してください。 これによって、地形が中央に配置されてエンボス(浮き彫り)効果が生じ、マップ周辺の領域は完全に平坦になります。

    高解像度の8Kや16Kのディスプレイスメントマップをある程度までアップスケールすることは可能ですが、 アーティファクトや構造のぼやけを回避するために、過度なアップスケールはしないでください。 たいていの場合、1.5倍から2倍の倍率で動作します。

  2. 地形を平坦化するために、 Height ▸ Height Scale に移動します。 このデフォルトの1もHeight Field SOPのデフォルトの地形に基づいており、この小さな領域には大きすぎます。 0.1程度の値から開始してください。実際の値はマップの元のスケールに依存します。

以下の画像には、ここで使用した小石マップの区画を載せています。

レイヤ化: 境界

この例では、ベースグリッドとマップの両方が4m×4mのサイズになっています。 HeightField File SOPの Size パラメータも4に調整して、マップとベースグリッドが正しいスケールで一致するようにしました。 では、2m×2mのマップを読み込み、 Size2に設定して、グリッドのサイズはそのままにした場合はどうなるでしょうか? この組み合わせだと、上記の画像で確認できるエンボス効果が生成されます。

Layering セクションには、タイリングや地形周辺の空白領域の扱い方など、役立つツールが用意されています。 デフォルトでは、 Border TypeConstant に設定されています。 ハードエッジを緩和するには、 Border Value を調整すると良いでしょう。 境界から地形へのシームレスな遷移を表現したいのであれば、エクスプレッションを使用すると良いでしょう。

  1. Height Scale を右クリックします。メニューから Copy Parameter を選択します。

  2. 次に、 Border Value を右クリックして、 Paste Relative References を選択します。

  3. その入力フィールドが緑色に変わり、そこにエクスプレッションが入ります。 境界線と地形を揃えるために、そのエクスプレッションをch("heightscale")/2に変更します。

  4. Height Field全体がわずかに上方へ移動したことに気づかれたかもしれません。 グリッドをシーンのベースレベルに戻すために、HeightField SOPを選択します。 Initial Height を右クリックして、再び Paste Relative References を選択します。 今回は、そのエクスプレッションを-ch("../heightfield_file1/heightscale")/2に変更します。 これでグリッドは再びY=0の位置に戻ります。

    このように相対参照をエクスプレッションに利用することで、値を一度変更するだけで、参照されたすべてのパラメータは、関連する数式に基づいて更新されます。

レイヤ化: タイリング

実のところ、タイリングも“境界”の議題に入りますが、その重要性から別途説明します。 多くのディスプレイスメントマップ(特に商用リポジトリからのもの)はシームレスでタイル化可能です。 そのため、マップをスケールするのではなく、繰り返し配置することでHeight Field領域全体を覆うことができます。

  1. HeightField SOPの Border Type ドロップダウンには Repeat オプションが用意されています。 ディスプレイスメントマップをタイリングするには、この項目を選択してください。

  2. Position セクションのパラメータは、マップの CenterRotate の値を変更することができます。

下図では、前述のLayering: Borderの章で用いた2m×2mのマップが4m×4mのベースグリッドを覆うようにどのように繰り返されているのかが分かります。

マップのスタッキング(積み重ね)

HeightField File SOPは1個に限定されているわけでなく、異なるマップを持つ複数のHeightField File SOPを積み重ねることで、まったく新しい地形を生成することができます。 ディスプレイスメントマップは、HeightField Noise SOPなどの他の地形生成ノードともマージされます。 最大の制限事項は、デフォルトでは異なるマップをブレンドするためにすぐに使えるパラメータが存在しないことです。 各マップは、最終結果に均等に寄与します。

単にマップを重ねたい場合は、複数のHeightField File SOPをチェーン接続して、それぞれ個別に調整すると良いでしょう。 考慮すべき事は、各マップの Height Scale 値が加算されることです。 例えば、3つのマップを使用し、 Height Scale 値が0.020.030.05の場合、ベースグリッドのY位置は0.1となります。 この例では、HeightField SOPの Initial Height-0.05に設定して、そのグリッドをシーンの原点にリセットする必要があります。

下図では、前の章で使用した2つのマップのスタッキングの例を載せています。

マップとレイヤのエクスポート

ディスプレイスメントマップの使用方法は一つだけではありません。 Height Fieldをエクスポートし、それをファイルにベイクすることもできます。

  1. HeightField Output SOPを追加して、その入力をネットワークの最終上流ノードの出力に接続します。

  2. Filename に移動し、ボタンをクリックして、出力ファイル名と保存先ディレクトリを指定します。 ファイル形式は、入力した拡張子(例えば、.jpg)から自動的に決定されます。

  3. Resolution を有効にして、X方向とY方向のピクセル数を入力します。 8で割り切れる数値(例えば、25651210244096など)を入力してください。

  4. Output Layers セクションに移動します。 カラーチャンネルパラメータの横に関連ドロップダウンメニューが表示されます。 RedGreenRed ではheightを選択してください。 アルファマスクも定義されている場合は、 Alphamaskに設定します。 そうでない場合は Alpha をオフにしておくと安全です。

    ここでは、heightレイヤをエクスポートしていますが、他の利用可能なレイヤを選択することもできます。

  5. Save to Disk ボタンをクリックして、マップをディスクに書き込みます。

Height Fieldと地形

生成

  • 地形の生成

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

  • マップからHeight Fieldを生成

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

  • 単独の山

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

  • レイヤ

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

  • 段丘化(Terracing)

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

  • 歪曲(Distortion)

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

  • 地形のペイント

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

  • 投影

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

  • パッチ(継ぎ合せ)

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

  • パターン

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

  • リサンプリング

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

  • 様々な特徴部

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

散布

マスク

  • マスキング

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

  • ライトマスク

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

自然現象

VEX

テクスチャ

Shallow Water Solver(浅水ソルバ)