Houdini 20.0 Unity

地形(Height Field)

On this page

Houdini Height Fieldを使用して、Unity Terrain(地形)を生成することができます。 反対に、Unity Terrainを入力として使用し、入力ノードを通してHoudini Height Fieldを生成することもできます(地形入力を参照)。

Houdini Height FieldとUnity Terrainには違いがあるため、Unity Terrainを適切に生成するためには、以下の手順に従ってHDAのHeight Fieldのサイズとレイヤーをセットアップしてください。

Height FieldのSizeとGrid Spacing

Unityでは、Heightマップの解像度が2の累乗+1である必要があります。 この制約から最良の結果を得るためには、上記の赤枠でマークしたHeight Fieldノードのパラメータがどのように連携し、どのように使用される必要があるかを理解する必要があります。

Sampling には、Unityの地形生成に合わせて Corner タイプを使用し、サイズ要件も2の累乗とします。 Houdiniはデフォルトで Center サンプリングを使用しますが、これではUnity Terrainに変換する際に浮動小数点演算エラーが発生します。 そのため、Cornerサンプリングの使用をお勧めします。

Grid Spacing には、Heightマップの解像度を制御するために1または2の累乗(2、4、8など)を使用します。

Size には、64以降の 2の累乗 (64、128、256、512、1024、2048、4096など)を使用します。

結果のUnity Terrainについて

  • 地形の幅と長さは、Height Fieldのサイズにグリッド間隔を加えることで算出されます(つまり、地形の幅 = Height Fieldのサイズ + グリッド間隔)。

  • 地形の高さは、高さの値の範囲です(つまり、地形の高さ = 最大高さ - 最小高さ)。

  • Heightマップ解像度は、Height Fieldのサイズをグリッド間隔で割り、1を足すことで算出されます(つまり、Heightマップ解像度サイズ = Height Fieldのサイズ / グリッド間隔 + 1)。

Cornerサンプリングを使用した設定の例:

Houdini Height FieldのSize

Houdini Grid Spacing

幅: 8% Unity Terrainサイズ

UnityHeightマップ解像度

512×512

1

513×513

513×513

512×512

2

514×514

257×257

512×512

4

516×516

129×129

1024×1024

1

1025×1025

1025×1025

1024×1024

2

1026×1026

513×513

1024×1024

4

1028×1028

257×257

2048×2048

2

2050×2050

1025×1025

4096×4096

2

4098×4098

2049×2049

すべてのケースで、UnityのHeightマップ解像度は 2の累乗 + 1 でなければなりません。具体的には以下のようになります:

  • 8193 x 8193

  • 4097 x 4097

  • 2049 x 2049

  • 1025 x 1025

  • 513 x 513

  • 257 x 257

  • 129 x 129

  • 65 x 65

他のHeightマップ解像度サイズを使用すると、Unityは自動的に次に小さい2の累乗サイズに変更します。 これは、高さの値が適切に適用されないことを意味します。そのため、Height Fieldのサイズとグリッド間隔には必ず2の累乗の値を使用してください。

プラグインには、サイズとグリッド間隔のさまざまな推奨設定を示すサンプルHDA(Assets/Plugins/HoudiniEngineUnity/HDAs/TerrainGenerator.hda)が同梱されています。

Unity Terrainを入力として使用してHoudini Height Fieldを生成する場合は、上記の計算を逆にして、Height Fieldのサイズとグリッド間隔を割り出すだけです。 地形の幅と長さが同じ値でなければならないことに注意してください(つまり、正方形のサイズの地形になります)。次の手順を実行します:

  1. グリッド間隔を決定します。分かりやすく1を使用するか、2の累乗(グリッド間隔 = 2など)を使用します。

  2. 地形の幅と長さについて、64以降の2の累乗のサイズを選び、グリッド間隔を加えます(例: 地形の幅、長さ = 512 + 2 = 514)。

  3. Heightマップの解像度については、地形の幅-グリッド間隔をグリッド間隔 + 1で割ります(例: Heightマップの解像度 = (514 - 2) / 2 + 1 = 257)。

最も簡単な方法は、まず地形の幅と高さに2の累乗の値を選択し、1を加えて最終的な地形の幅と高さ、およびHeightマップの解像度を割り出すやり方です(例: 512 + 1 = 513)。

Height Fieldレイヤー

Houdini Height Fieldボリュームは、 height レイヤーと mask レイヤーで構成され、他にも多くのレイヤーを持つ場合があります。 Unity Terrainは、Terrainコンポーネントと、高さの値を持つTerrainData、任意の数のTerrainLayer(または2018.3より前のUnityバージョンではSplatPrototypes)、および対応する数のスプラットマップで構成されます。 TerrainLayerは地形にペイントするマテリアルを指定します。 スプラットマップは、地形上の各ポイントにおけるTerrainLayerマテリアルからの各ピクセルのマスキングまたはウェイトを指定します。

以下に、HoudiniのHeight Fieldレイヤーがプラグインによってどのように扱われるかを示します:

height レイヤーは、地形のHeightマップ値に使用されます。Heightマップ値の範囲は、地形の高さの範囲を形成します。 unity_hf_terraindata_fileアトリビュートをこのレイヤーに指定すると(このレイヤーにのみ)、使用する既存のTerrainDataアセットファイルを参照できます(Houdini Height FieldからUnity Terrain(地形))。 このレイヤーに対応するTerrainLayerは作成されません。

mask レイヤーは 使用されません

他のレイヤーのそれぞれについて、呼応するTerrainLayerとスプラットマップが作成またはロードされ、TerrainDataに設定されます。 したがって、例えば4つのレイヤー(height、mask、地面、崖)を持つHeight Fieldボリュームは、2つのTerrainLayerと2つのスプラットマップを持つことになります(地面と崖それぞれにTerrainLayerとスプラットマップを1つずつ)。 TerrainLayerの名前には、Height Fieldレイヤーの名前が使用されます。 既存のTerrainLayerアセットは、unity_hf_terrainlayer_fileアトリビュートを介して指定できます。 再クックの際、既存のTerrainLayerは、その名前がHeight Fieldレイヤーの名前と一致する場合は再利用されます。 指定されていない、または、見つからない場合は、TerrainLayerが作成されます。 Unityプロジェクトでの参照を維持するため、TerrainLayerはアセットファイルに保存されます(保存されるファイルのパスについては生成を参照してください)。

スプラットマップは、Height Fieldレイヤーの高さの値から生成されます。 値の範囲は0以上1以下でなければなりません(つまり正規化されていなければなりません)。 この範囲外の値がある場合、プラグインは最小値と最大値を用いて、この範囲内に正規化します(各値は最小値で減算され、範囲で割られます)。 また、どの座標でも、各レイヤーのスプラットマップ値の合計が1になるようにすることが推奨されています。 例えば、2つのスプラットマップレイヤーがある場合、(0,0)でのSplat値について、1つ目のレイヤーの値が0.7であれば、2つ目のレイヤーの値は0.3である必要があります。

Note

最終的にこれらの値は、Unity Terrainで使用されるマテリアルとシェーダが使用するため、推奨される範囲はデフォルトのUnity Terrainマテリアルのものとなります。

0と1の間の値を作成するには、HeightField Remap SOPノードを使用します。 以下のスクリーンショットが示すのは、 base という名前のHeightFieldレイヤーでのこの例です:

TerrainLayer UI

プラグインは、各スプラットマップレイヤーに Strength コントロールを提供し、それはHDAのInspector UIに表示されます。 Strength値は各スプラットマップ値に適用される乗数で、デフォルト値は1です。 Houdiniから生成されるスプラットマップ値を単一のパラメータで制御することができ、トラブルシューティングや、TerrainLayerが手動で追加された場合に便利です。

アトリビュートを介したTerrainLayerプロパティ

各TerrainLayerプロパティは、Primitiveアトリビュートを使用して個別に設定することができます。アトリビュートで指定された値は、既存のTerrainLayerプロパティを上書きします。 Houdini Height FieldからUnity Terrain(地形)を参照してください。

タイルを含むTerrainLayerの例

以下のHDAには、3つのHeight Fieldレイヤー(height、mask、base)を持ち、2つの結合された地形タイルを出力するHeight Fieldネットワークが含まれています。 base レイヤーは height レイヤーのコピーで、値は0と1にリマップされています。 base レイヤーに文字列アトリビュートを作成し、Unityで base レイヤーに設定するTerrainLayerファイルを指定します。

以下の画像は、最終的なmergeノードの情報を示したものです。各地形タイルに合計6つのレイヤーがあります(各地形タイル毎に3つのレイヤー(height、mask、base)):

最後に、HDAがUnityにロードされ、2つの地形を生成します。それぞれに1つのTerrainLayer( base Height Fieldレイヤーから)が含まれます:

生成

Unity Terrainの生成中、プラグインはアセット設定、既存の地形のステート、クックのタイプに応じていくつかのことを実行します:

TerrainData

TerrainDataファイルは、デフォルトで、次のパスにあるプラグインのアセットキャッシュディレクトリに保存されます

Assets/HoudiniEngineAssetCache/Working/{アセット名}/{ジオメトリ名}/Terrain/Tile{インデックス}/TerranData.asset

既存のTerrainDataアセットファイルは、アトリビュートを介して指定した場合、上記のディレクトリに コピーされ ます。

しかし、明示的なエクスポートパスは、Height Fieldの文字列アトリビュート( unity_hf_terraindata_export_file )を介して設定することができます(例: unity_hf_terraindata_export_file=Assets/Terrain/myterraindata.asset)。

Note

パスは、拡張子が.assetのファイル名で終わっている必要があります。

TerrainLayer

アトリビュートを介して変更された、または新規に作成されたTerrainLayerは、次のパスにあるプラグインのアセットキャッシュディレクトリに保存されます

Assets/HoudiniEngineAssetCache/Working/{アセット名}/{ジオメトリ名}/Terrain/Tile{インデックス}/{レイヤー名}.terrainlayer

既存のTerrainLayerアセットファイルがアトリビュートを介して指定された場合、他のカスタムアトリビュートがそのプロパティを上書きするように指定されていない限りは、それがそのまま使用されることに注意してください。 上書きするよう指定された場合は、ファイルの コピー が作成され、上書きが適用されて、ファイルが上記の場所に保存されます。これにより、オリジナルのTerrainLayerをそのまま残すことができます。

再クック 時、生成されたHeight Fieldによって上書きされない限り、TerrainData、TerrainLayer、およびスプラットマップは再利用されます(設定は変更されません)。

Rebuild および Reset Parameters では、TerrainData、TerrainLayer、およびスプラットマップが新たに作成されます(アトリビュートで指定されている場合、元の参照からアセットファイルがロードされます)。

デフォルト設定

新しいTerrainおよびTerrainDataが作成されると、次の設定がデフォルトとして適用されます:

  • Allow Auto ConnectはTrue

  • Draw InstancedはTrue

  • Detail Resolutionは1024

  • Resolution Per Patchは32

  • Height Fieldの範囲が0の場合(つまり平坦なHeight Field)、地形の高さは600

マテリアル

生成された地形に使用されるマテリアルは、Plugin Settingsウィンドウの GEOMETRY セクションで指定できます:

Unity HDRPプロジェクトの場合は、これをHDRPパッケージに同梱されている DefaultHDTerrainMaterial に設定することをお勧めします。他のレンダーパイプラインの場合は、そのパイプラインに同梱されたデフォルトのUnity Terrainマテリアルを使用します。

同様に、デフォルトのSplatテクスチャは、Plugin Settingsで別のテクスチャファイルを指すように変更できます。

地形の散乱

HDA内でHeightField Scatterノードを使用してインスタンスを散乱させる方法が2通りあります:

Prefabインスタンス

HeightField ScatterノードをHeightFieldネットワークで使用すると、出力はポイントクラウドになります。 これらのポイントには、プロジェクトの既存のUnityPrefabへのパスと共に unity_instance アトリビュートを追加することができます。 プラグインは各ポイントにPrefabインスタンスを作成するだけでなく、HeightField Scatterノードで Keep Incoming Terrain が有効な場合は、HeightFieldに関連付けられた地形も作成します。 これはポイント数が少ない場合はうまく機能しますが、大規模なセットでは非効率になる可能性があることに注意してください。

木のインスタンス

より効率的な散乱方法は、TreeInstanceTreePrototypeを介して、生成されたUnity Terrainにポイントクラウドを直接供給することです。 TreePrototypeではPrefabのリストを設定でき、TreeInstanceではポイントごとのインスタンスデータでポイントのリストを設定できます。 この方法を使用すると、何十万もの木を効率よく散乱させることができます。

TreeProtoypeは、 height レイヤーの unity_hf_tree_prototype + インデックス 文字列アトリビュートで定義する必要があります。 これらをプリミティブオーナーに設定しなければなりません。値は、 Assets フォルダを基準とした相対パスにします(Assets/Trees/tree1.prefabなど)。 インデックス値は0で始まり、プロトタイプが増える毎に増加します。 インデックスは、以下のTreeInstanceの定義で参照されるインデックスに対応しています。例えば、3つのTreePrototypeを定義するためには、以下の3つのアトリビュートを定義します:

  • unity_hf_tree_prototype0 - Assets/Tree/large_tree.prefab

  • unity_hf_tree_prototype1 - Assets/Tree/regular_tree.prefab

  • unity_hf_tree_prototype2 - Assets/Tree/small_tree.prefab

TreeInstanceは、ネットワーク内のHeightField Scatterノードの後で、次のPointアトリビュートを使用して定義します:

アトリビュート

説明

unity_hf_treeinstance_prototypeindex

使用するTreePrototypeのインデックス(Integer)を設定します(0から始まります)。このインデックスは、前に説明したTreePrototypeの定義を参照します。

unity_hf_treeinstance_heightscale

TreePrototypeの高さのスケール(Float)を設定します。

unity_hf_treeinstance_widthscale

TreePrototypeの幅のスケール(Float)を設定します。

unity_hf_treeinstance_lightmapcolor

TreePrototypeのライトマップカラー(4 Float)を設定します。

Cd

TreePrototypeのカラー(4 Float)を設定します。

orient

TreePrototypeの回転を設定します。

Terrain(地形)の木のインスタンスの自動設定は、Unity 2019.1以降でのみ利用可能です。

ディテールレイヤー

草や低木などの小さいサイズの環境ディテールについては、Height Fieldレイヤーを指定してUnity Terrainのディテールレイヤーに変換すると、効率的に描画することができます。

Unity Terrainのディテールレイヤーには、Height Fieldの各値によってカバーされる領域のインスタンス数を指定する、整数値のマップが含まれています。これらの値は 0から16 までの整数でなければならないため、Height Fieldのfloat値はそのまま整数に変換されます。Height Fieldのポイントでは、0の値はインスタンスがないことを表し、1から16の値は、その高さのポイントでカバーされる領域に求められるインスタンスの数を表します。各高さのポイントによってカバーされる領域は、地形サイズを、Height Fieldレイヤーのサイズから推測される Detail Resolution で割ることで決定されます。例えば、サイズが1024 x 1024、Detail Resolutionが256の地形では、ディテールレイヤーの各高さのポイントは、4 x 4のエリアをカバーすることを意味します。

Note

Detail Resolutionはアトリビュートを介して設定できません。 これはディテールレイヤーのサイズから推測され、Unityの要求に合わせて、0から4048の間の正方形サイズである必要があります。 したがって、指定されたすべてのディテールレイヤーは同じサイズでなければなりません。

ディテールレイヤーを使用するには、Height Fieldネットワークで、以下に説明するようなディテールプロパティを設定する必要があります。

ディテールレイヤープロパティ:

  • ディテールレイヤーに変換されるHeight Fieldレイヤーは、ディテールタイプとしてマークする必要があります。これを行なうには、レイヤーの unity_hf_layer_type というPrimitive文字列アトリビュートに detail 値を設定します。

  • 同じHeight Fieldレイヤーで、以下のアトリビュートを介してDetailPrototypeも指定する必要があります。

    • Prefabを使用するには、レイヤーのunity_hf_detail_prototype_prefabというPrimitive文字列アトリビュートに、Assets/を基準とした、インスタンス化するPrefabまたはメッシュへの相対パスを設定します。

    • テクスチャを使用するには、レイヤーのunity_hf_detail_prototype_textureというPrimitive文字列アトリビュートに、Assets/を基準としたテクスチャへの相対パスを設定します。

アトリビュート

説明

unity_hf_detail_prototype_bendfactor

Primitive浮動小数点アトリビュートにベンド係数値を設定します。

unity_hf_detail_prototype_drycolor

Primitive Color(4 float)アトリビュートにドライカラー値を設定します。

unity_hf_detail_prototype_healthycolor

Primitive Color(4 float)アトリビュートにヘルシーカラー値を設定します。

unity_hf_detail_prototype_maxheight

Primitive浮動小数点アトリビュートに最大高さの値を設定します。

unity_hf_detail_prototype_maxwidth

Primitive浮動小数点アトリビュートに最大幅の値を設定します。

unity_hf_detail_prototype_minheight

Primitive浮動小数点アトリビュートに最小高さの値を設定します。

unity_hf_detail_prototype_minwidth

Primitive浮動小数点アトリビュートに最小幅の値を設定します。

unity_hf_detail_prototype_noisespread

Primitive浮動小数点アトリビュートにNoise Spread値を設定します。

unity_hf_detail_prototype_rendermode

Primitive整数アトリビュートに、GrassBillboardには0、VertexLitには1、Grassには2(デフォルト)の値を持つDetailRenderModeを設定します。

グローバルディテールプロパティ:

  • height レイヤーでは、以下のアトリビュートを指定して、生成されるTerrainDataのディテール値を設定することができます。

アトリビュート

説明

unity_hf_detail_distance

Detail整数アトリビュートに0から250の値のDetail Distanceを設定します。

unity_hf_detail_density

Detail浮動小数点アトリビュートに0から1の値のDetail Densityを設定します。

unity_hf_detail_resolution_patch

Detail整数アトリビュートに8から128の値のDensity Resolution Per Patchを設定します。

地形入力

アセットの入力フィールドパラメータにTerrainコンポーネントを含むGameObjectを設定することで、プラグインは地形とそのレイヤーをHoudini Height Fieldに変換します。

現在のところ、正方形サイズの地形のみに対応しています(つまり、幅と高さが同じでなければなりません)。 地形を双方向変換する(Unityに戻される)場合は、(Height FieldのSizeとGrid Spacing)で説明されている、2の累乗 + 1のHeightマップ解像度サイズルールに従うことをお勧めします。

Houdiniの入力ノードには以下が含まれます:

  • Heightマップ値を含む height という名前のHeight Fieldボリュームレイヤー。 TerrainDataファイルのパスは文字列アトリビュート(unity_hf_terraindata_file)として設定されます。 これは双方向変換に便利で、TerrainDataの設定を保持することができますが、必要なければこのアトリビュートはHoudiniで削除しても構いません。

  • 0の値を含む、 mask という名前のHeight Fieldボリュームレイヤー。 ただし、Unity Terrainが mask という名前のTerrainLayerを含む場合は、スプラットマップ値が使用されます。

  • Unity Terrainの各TerrainLayerについて、同じ名前の対応するHeight Fieldボリュームレイヤーが作成され、そのスプラットマップ値がアップロードされます。 TerrainLayeraファイルのパスは文字列アトリビュート(unity_hf_terrainlayer_file)として設定されます。 これは双方向変換に便利で、使用されるTerrainLayerを保持することができますが、必要なければこのアトリビュートはHoudiniで削除しても構いません。

Unity

はじめよう

プロジェクトのセットアップ

Houdini Engineを使用する

リファレンス