Monday, July 17, 2017

[UE4] JAXAのGioTIFFから実物大ランドスケープを生成する

JAXAが無償公開している全世界の標高データをUE4に読み込ませてみました。 
標高データは http://www.eorc.jaxa.jp/ALOS/aw3d/index.htm からダウンロード可能です。

GeoTIFFという形式になっており、そのままではUE4では使えません。
gdal_translate.exeという変換プログラムを使って16bit PNG形式に変換します。
gdal_translateは、 http://www.gisinternals.com/ のものを使用しました。

北緯42度、東経140度のデータをUE4で使えるように16bit PNGに変換します。

gdal_translate.exe -of PNG -ot UInt16 -scale -32768 32767 0 65535  N042E140_AVE_DSM.tif 

-scaleというオプションを付けて、-32768~32767の範囲の値を0~65535の範囲にマッピングし直します。UE4ではどうやら32768をゼロとみなしており、-scale指定無しでははるか下方に地面が生成されてしまいます。一方、元データは符号付きのメートル単位の標高なので、32768を足してUE4に合わせました。

スケールの設定ですが、 せっかくなので標高を実物大にしてみます。https://wiki.unrealengine.com/Landscape_-_Sizes_and_Height_Guide
この資料によると、Zのスケールが100なら範囲が-256メートルから+256メートルになるそうです。Zのスケール1あたり2.56メートルですね。PNGに変換するときに-scaleオプションで標高の最大を32768にしたので、32768 / 2.56 = 12800 をZのスケールにすると実物大になります。

次に、XY方向を実物大にすることを考えてみます。上の資料によるとどうやらハイトマップの1ピクセルが1メートルに対応しているようです。JAXAの標高データは地球の1arcsecである約30メートル解像度なので、3000cmを掛ければY方向(南北)は実物大になります。X方向(東西)は北緯42度地点では1arcsecが赤道を1とした場合cos(42)にしないと大きさが合いませんが、UE4のランドスケープの仕様上XとYの方向の倍率を別々に指定できません。今回はX方向も3000にして我慢します。



これがほぼ実物大でインポートするScale設定になります。

マテリアルはレイヤーを用いず、標高で緑と青を塗り分ける適当なものです。


ところで、実物大になったゆえの問題が、100km四方に及ぶ広大な領域を持て余していまいち面白くないというのがあります。またUE4特有の問題として、座標値にして100万くらい(約10km)を超える場所では正常なレンダリングが保証されない問題があります。その大きさはソースコード上にHALF_WORLD_MAXというマクロで定義されています。

そこで、XYを1/10スケールである300にします。標高が強調されて地形がわかりやすくなり、面白みのある風景が出現しました。

マネキンを羊蹄山の山頂1898Mに配置し、標高が再現されていることが検証できました。
ALOS全球数値地表モデル (c)JAXA
http://www.eorc.jaxa.jp/ALOS/aw3d30/index_j.htm