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である必要があります。なお、最終的にこれらの値は、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)。パスは、拡張子が.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で別のテクスチャファイルを指すように変更できます。
アトリビュート ¶
Heightfield Layers ¶
以下のテーブルは、生成されたUnity Terrainに対応する地形レイヤプロパティを設定するために、Height Fieldレイヤに設定できる特別なアトリビュートのリストです。 地形レイヤの作成時、 height および mask レイヤは無視されることに注意してください。 これらのアトリビュートは他のHeight Fieldレイヤに設定する必要があります。
アトリビュート名 |
オーナー |
タイプ |
説明 |
---|---|---|---|
|
prim |
string |
地形レイヤとして設定するTerrainLayerアセットのUnityプロジェクトでのパス。 プロジェクトのAssetsフォルダを基準とした相対パスです。 例: Assets/Terrain/base.terrainlayer |
|
prim |
string |
地形レイヤのディフューズテクスチャとして設定するTextureアセットのUnityプロジェクトでのパス。 プロジェクトのAssetsフォルダを基準とした相対パスです。 例: Assets/Texture/sand.png |
|
prim |
string |
地形レイヤのマスクテクスチャとして設定するTextureアセットのUnityプロジェクトでのパス。 プロジェクトのAssetsフォルダを基準とした相対パスです。 |
|
prim |
string |
地形レイヤの法線テクスチャとして設定するTextureアセットのUnityプロジェクトでのパス。 プロジェクトのAssetsフォルダを基準とした相対パスです。 |
|
prim |
float |
地形レイヤの法線スケール(サイズが1の浮動小数点)。 |
|
prim |
float |
地形レイヤのシェーダのメタリック値(サイズが1の浮動小数点、値は0から1)。 |
|
prim |
float |
地形レイヤのシェーダの滑らかさの値(サイズが1の浮動小数点、値は0から1)。 |
|
prim |
float array |
地形レイヤのシェーダのスペキュラーカラー(サイズが4の浮動小数点、値は0から1)。 |
|
prim |
float array |
地形レイヤのテクスチャのタイルオフセット(サイズが2の浮動小数点)。 |
|
prim |
float array |
地形レイヤのテクスチャのタイルサイズ(サイズが2の浮動小数点)。 |
Terrain Data ¶
以下のテーブルは、使用する既存のTerrainDataアセットファイルを指定するために、 height Height Fieldレイヤに設定できる特別なアトリビュートのリストです。 TerrainDataアセットファイルのコピーは、Unityでの生成時に作成されます。
アトリビュート名 |
オーナー |
タイプ |
説明 |
---|---|---|---|
|
prim |
string |
地形データとして設定するTerrainDataアセットのUnityプロジェクトでのパス。プロジェクトのAssetsフォルダを基準とした相対パスです。 例: Assets/Terrain/terlayer.asset |
|
prim |
string |
生成またはコピーされたTerrainDataアセットの書き出し先のパス。 |
|
point |
int |
散乱したポイントの地形タイルを指定します。タイル分割ノードを使った木のインスタンス化に便利です。 |