コンテンツにスキップ

Unity Terrainのハイトマップデータフロー

UnityのTerrainで生成されるハイトマップデータを外部ソフトからインポートしたり、エクスポートしたデータを外部ソフトで編集したりする場合の設定のメモ。

使用バージョン

  • Unity : 2018.4.20f1
  • Blender : 2.91.0
  • Houdini : 18.0.287 Indie
  • ImageMagick : 7.0.11-0 Q16 x64

Unity Terrainからハイトマップをエクスポートする

Unityからハイトマップのデータをエクスポートする場合は、Terrainコンポーネント→Texture ResolutionsExport Raw...を選択する。

ダイアログが出てくるので、以下の設定でExportする。 Flip Verticallyにチェックを入れないと外部ソフトで読み込む場合に反転してしまう。

Photoshop

エクスポートしたrawデータをPhotoshopで読み込む

rawデータはPhotoshopで読み込むことができ、読み込む場合は以下のような設定にする。

  • チャンネル数を1にする
  • 色数は16 bitにする
  • バイト順序はIBM PC(B)にする

Photoshopで加工したデータを書き出し、Unityで読み込む

Photoshopで編集したハイトマップをUnityに読み込む場合は、まず保存時にファイルの種類汎用フォーマット(*.RAW)に設定し保存ボタンを押す。

バイト順序IBM PC(B)になっているのを確認してからOKを押す。

UnityでImport Raw...から保存したファイルを開き、以下の設定でインポートする。

インポート完了

Rawデータを外部ソフトで読めるPNGに変換する

Unityから書き出されるrawデータをBlenderやHoudiniは直接読み込めないため、16BitグレースケールPNGに変換して読み込む。Photoshopで変換してもよいが、Photoshopがない場合は、変換のためにいちいち立ち上げるのが面倒な場合はImageMagickを使用する。

ImageMagickをインストール後、対象のRawファイルに対して以下のコマンドを実行すると16BitグレースケールPNG画像が得られる。

入力ファイル名: terrain.raw
出力ファイル名: output.png
解像度: 513x513

とする

1
Magick Convert -depth 16 -size 513x513 gray:terrain.raw output.png

Blender

Blenderでのハイトマップの表示

Blenderを立ち上げ、平面を出したら、必要な分だけ細分化する。(マルチレゾリューションモディファイアでもOK)

平面のサイズは、TerrainのMesh ResolutionTerrain WidthTerrain Heightに合わせる。

この場合ならX、Yの寸法を500mに合わせる。ただしスケールで制御する。したがって、500なら最初のプレーンを250倍する。この段階ではスケールの適用も行わない。

ディスプレイスメントモディファイアを追加し、

  • 方向Z
  • スペースローカル
  • 中間レベル0.0にする。

強さはTerrainの設定値から以下のように設定する。

(Terrain Height) × (Terrain Width) / 2

この例なら600 * 500 / 2 = 2.4

新規ボタンから新たにテクスチャを設定し、ImageMagickから出力した画像を読み込む。 画像の色空間リニアに変更する。

これでUnityと同じTerrainデータが読み込まれる。

Houdini

Houdiniへの読み込み

HeightFieldノードでサイズをTerrainのTerrain WidthTerrain Heightに合わせる。

次にHeightField Fileノードをつないで、 - Layer Nameheightにする。 - SizeTerrain Widthと同じにする。 - Height ScaleTerrain Heightと同じにする。

これで読み込み完了

Unity形式へエクスポート

エクスポートにはHeightField Outputノードを使用する。

ファイル名の拡張子を.pngにして、(.tifは正しくエクスポート出来なかった。)

  • FormatSingle Channelにする
  • Type16bFixedにする
  • Resolution2の累乗+1になるようにする。(たとえば512+1で513)
  • Image ChannelRedheightをセットする
  • Output RangeManuel Remapにして、From Rangeを0-(Terrain Height)にする。

そしてSave to Diskを押してエクスポート

ImageMagickでrawに変換

以下のコマンドでpngをrawに変換する。

1
Magick Convert -depth 16 -size 513x513 [入力].png gray:[変換後].raw

Unityでインポート

Photoshopの時と同じようにインポートすればOK。

参考