| On this page |
レイヤは、HoudiniのHeight Fieldにおいて最も重要な概念の一つです。 実際に、ほとんどの操作は、新しいレイヤを作成することです。 レイヤは、抽出や合成をしたり、マスクに変換したり、パラメータを駆動させたり、瓦礫や水など異なるマテリアルに分けることもできます。 このガイドでは、レイヤに関する最も重要な考え方の概要を説明しています。 複雑なセットアップの核心はレイヤにあります。 レイヤを定義し、それらのレイヤを合成したりブレンドしたり、歪曲や段丘などの特徴部を加えます。 これらすべてが相まって、リアルな地形が生成されます。
マスクとレイヤの違いについて疑問に思われるかもしれません。 “レイヤ”は、包括的な用語であり、マスクはレイヤの一種です。 これは、地形のHeightレイヤにも当てはまります。 HeightレイヤもマスクレイヤもHeight Fieldで作成されます。 Height Fieldノードの Node Info をクリックすると、そのレイヤを確認することができます。
-
heightには、HeightField SOPの各グリッドポイントの標高値が含まれています。この情報は、変位を生成するために使用されます。 -
maskは、マスクノードをHeightField Noise SOPの2番目の入力に接続した場合にのみアクセス可能です。
レイヤのコピー ¶
レイヤのコピーは、重要なテクニックです。
例えば、マスクを別のレイヤに変換したい場合などに活用できます。
熱侵食を制御するマスクを定義したいと仮定しましょう。
これは、よくある場面で、maskレイヤを新しいthermalerodabilitymaskレイヤにコピーします。
こうすることで、その新しいレイヤは確保されるので、そのmaskレイヤを新しい情報で上書きしても安全です。
高さとマスク ¶
以下の例では、@heightレイヤと@maskレイヤの扱い方の考え方を説明しています。
この例のネットワークは、20メートル地点に台地を作成し、その領域をマスクします。
そして、そのマスクを新しいclipareaレイヤにコピーします。
Note
ここでは、既に地形を作成済みであることを前提としています。 まだ作成していない場合は、イントロダクションのHeightfieldの土台およびHeightfieldノイズの章を読んでください。
たいていの場合、HeightField Mask by FeatureなどのHoudiniのHeight Fieldマスク系ノードのどれかを使用します。
このセットアップでは、Wrangleノードと数行のVEXを使用してカスタムマスクを作成します。
-
HeightField Wrangle SOPを追加して、 1番目 の入力を既存ネットワークの最終上流ノード(おそらくHeightField Noise SOP)の出力に接続します。
-
以下のVEXコードを⌃ Ctrl + Cでコピーし、そのWrangle SOPの VEXpression フィールドに⌃ Ctrl + Vでペーストします。
この短いコードスニペットは、地形の高さが20を超えた場合、その高さは20に制限され、そのボクセルがmaskレイヤの一部となります:
if (@height > 20) { @height = 20; @mask = 1; }
Wrangle SOPの青い Display/Render フラグを有効にすると、以下の結果が表示されます。
マスクを別レイヤに変換 ¶
現在、赤い領域はグローバルなmaskレイヤを示しています。
このような小規模なネットワークでは、maskのまま進めても問題ありませんが、より複雑なシーンとなると、maskレイヤを何回も上書きして情報を失ってしまう可能性が高いです。
そのため、maskをclipareaといった別のレイヤに変換するべきです。
-
HeightField Copy Layer SOPを配置して、入力をそのWrangle SOPの出力に接続します。
-
Destination フィールドには、
clipareaと入力し、そのHeightField Copy Layer SOPの Node Info を開いて、その新しいレイヤが作成されたことを確認してください。
HeightField Copy Layer SOPは、異なる情報を持つ追加のレイヤを作成することができます。 例えば、地形の勾配やオクルージョンからフィーチャレイヤ(特徴部レイヤ)を作成したり、マスクをペイントしてそのマスクを別のレイヤに保存することができます。 後でそれらのレイヤを再利用することができ、例えば、別の地形用のパッチ(継ぎ合せ)や散布に使用することができます。
レイヤをジオメトリに変換 ¶
レイヤの内容を実際のジオメトリに変換することもできます。。
-
Convert HeightField SOPを配置して、入力をそのHeightField Wrangle SOPの出力に接続します。 このノードはフィールド情報をポリゴンに変換します。
clipareaレイヤはPointアトリビュートとなります。 -
Density を使用してメッシュの解像度を制御します。値が大きいほどポリゴン数が増加します。
-
Attribute Wrangle SOPを追加して、 1番目 の入力をそのConvert HeightField SOPの出力に接続します。 HeightField Wrangle SOPと同様に、このノードもVEXコードを必要とします。 今回は、VEXコードで
clipareaポイントからmesaグループを作成します。@clipareaの値が1のポイントのみがグループに追加され、赤色で表示されます。 以下のコードを VEXpression にコピー&ペーストしてください。if (@cliparea == 1) { @group_mesa = 1; // ポイントを'mesa'グループに追加します @Cd = set(1,0,0); // ポイントに赤色を適用します }
-
Blast SOPを追加して、入力をそのAttribute Wrangle SOPの出力に接続します。
-
Group フィールドに
mesaと入力して、 Delete Non Selected トグルを有効にします。 -
そのBlast SOPの青い Display/Render フラグを有効にすると、その結果が表示されます。 ここで得られるのは通常のジオメトリであり、他のSOPノードに接続することができます。
Height Fieldの合成 ¶
特に複雑なHeight Fieldでは、レイヤを分離して、各レイヤを個別で作業するのが役立ちます。
この例では、鋭い稜線のある地形レイヤと岩盤レイヤを作成して、それらのレイヤを合成する基本的な概念を理解します。
一つの方法は、Height Fieldのノイズ関数の調整を試行錯誤して、何かしらの侵食が加わって最適な結果が得られることを期待することです。
もう一つの、より便利でアーティストに馴染みやすい高速な方法は、異なるノイズ設定の2つのHeight FieldをHeightField Layer SOPを使って合成することです。
Tip
Height Fieldの合成によって傾斜して褶曲した段丘を作成する完全なサンプルプロジェクトは、段丘のページにあります。
このHeightField Layer SOPの大きな利点の一つは、このSOPに接続したHeight Fieldが同じ Grid Spacing 値を共有している必要がないということです。 HeightField Layer SOPには、Height Field情報をマージしたい領域を定義したマスク用の第三の入力も用意されています。
これから作成するネットワークは、以下の通りです。
-
まず、2つのHeightField SOPと2つのHeightField Noise SOPから開始します。 この2つのHeightField Noise SOPを区別できるように、それぞれ名前を
worelyとsparseに設定します。 -
各Height Fieldを各HeightField Noise SOPに接続します。
-
worleyノードを選択して、 Noise Settings セクションに移動します。 Noise Type ドロップダウンメニューから Worley Cellular F1 を選択します。 -
両方のノイズノードに対して、 Amplitude と Element Size を好きなように調整します。正解・不正解はありません。
-
worleyノードは、マイナスY軸方向にシフトします。 このオフセットを補正するために、HeightField Transform SOPを追加します。入力をその
worleyノードの出力に接続します。 -
Height Offset を調整します。地形の中点は、おおむねシーンの中心付近になるように設定してください。
-
HeightField Layer SOPを配置します。 1番目 の入力をそのHeightField Transform SOPに接続して、 2番目 の入力を
sparseノードの出力に接続します。
ブレンド ¶
その結果は少々残念なもので、Worley Cellularノイズの鋭い稜線が失われています。 実のところ、そのHeightField Layer SOPの2番目の入力からの地形しか表示されていません。 これを変更するために、そのHeightField Layer SOPの Layer Mode ドロップダウンメニューを開きます。
-
Add を選択すると、両方の地形の
height値が合算されます。 これによって、より高い山頂を持つ地形が生成されます。 Remapping セクションの Base Scale を下げると、地形を平坦化することができます。 -
Blend を選択すると、平均化されたHeight Fieldが得られます。 このモードの利点は、 Blend パラメータによって、各Height Fieldを最終地形にどれだけ寄与させるのか制御できることです。
0.5だと、両方のHeight Fieldが結果全体に均等な割合で反映されます。 スライダを左にドラッグすると、そのHeightField Layer SOPの 1番目 の入力の地形が多く反映されます。 また、 Base Scale によって、地形の高さを調整することもできます。
これで、新しいマスクを作成して、合成された結果に侵食、歪曲、段丘を適用できるようになりました。 さらにHeightField Layer SOPを追加することで、他のHeight Fieldからの情報をブレンドすることもできます。 こうすることで、ディテールの細かな景観を作成するための非常に複雑なセットアップを作成することができます。
下図は、追加のマスクとHeightField Distort SOPを適用したHeight Fieldを上から見たものです。
歪曲処理が細かいディテールを加え、頂上付近は滑らかになっています。
稜線部分も曲率マスクでぼかされ、Worley Cellularノイズの鋭いエッジが除去されています。
このような景観は雪が積もった山に適しています。
高さコントロール ¶
一部の Layer Modes は、極端なheight値を生成し、地形全体が使い物にならないように見える場合があります。
しかし、それらの値を平準化する方法があります。
-
HeightField Layer SOPで、 Layer Modes を Multiply に変更します。これによって、引き伸ばされた地形が得られます。
-
Remapping セクションに移動します。そこには Base Scale パラメータと Layer Scale パラメータがあります。 これらのパラメータは、接続された地形をそれぞれの入力別にスケールすることができます。 あなたが求めている結果が得られるまで値を下げてください。 地形によっては、
0.01といった非常に小さな値まで下げることがよくあります。
マスクの合成 ¶
Height Fieldの合成の例をご覧になった方は、HeightField Layer SOPの Layers パラメータにアスタリスク(*)が付いていることに気づかれたかもしれません。
この記号は、ノードの入力から すべて のレイヤが合成されることを示しています。
とはいえ、このパラメータのドロップダウンから個別にレイヤ/マスクを選択することもできます。
このワークフローは、レイヤに関する説明と全く同じであり、唯一の違いは*を実際のレイヤ名(s)に置換する点です。
また、 Layer Mode を選択することで、レイヤのブレンド方法についても同様のオプションが利用可能です。
レイヤのクリアと削除 ¶
レイヤをクリアしても、そのレイヤが削除されるわけではなく、すべてのボクセルに定数値が追加されます。
この効果を確認するために、シーンにHeightField Layer Clear SOPを追加して、入力をHeightField Noise SOPの出力に接続します。
そして、以下の手順を実行します。
-
Layer 1 フィールドに
heightと入力するか、または、そのドロップダウンメニューからそのレイヤを選択します。 -
これで地形は完全に平坦になり、すべてのグリッドポイントの高さが
0になります。 Value スライダを右にドラッグすると高さが増加します。 平面がY軸に沿ってオフセットされる様子が確認できます。
クリア操作はheightだけでなく、他のレイヤでも機能し、1個のノードで複数のレイヤを制御することができます。
複数のレイヤを一度にクリアしたい場合は、 Number of Clears を増やし、該当するレイヤを指定してください。
これはマスクにも適用されますが、マスクの場合は代わりにHeightField Mask Clear SOPを使用することもできます。
これは事前設定済みのレイヤクリアノードです。
実際にレイヤを削除したいのであれば、Delete SOPが必要です。
レイヤを完全に削除することで、リソースを解放することができます。
-
削除対象のレイヤが必要となる最終ノードの後に、Delete SOPを追加します。
-
Group パラメータのドロップダウンメニューから、例えば
maskなどのレイヤを選択します。 すると、入力フィールドが@name=maskに変更されます。 -
また、 Entity を Primitives に設定してください。