Unityの3D空間に"現実に限りなく近い3Dマップ"を作る方法(地形編)

はじめに

私は研究の一環として、現実に限りなく近い3D空間を作っています。

f:id:cinnabar_bird:20190403182733j:plain

f:id:cinnabar_bird:20190403183329j:plain

実の所、私自身まだ完成に至ってはいません。(建物や小物など)

ただ、都市開発、疑似観光、シミュレーションのシステムを作る人は可能な限りの再現が必須だと思うので足掛かりになればと思い、方法を伝授します。

 

あと、ゲームとかでステージ作るのに困ってる人にも役に立つかもしれません。

 

使用ツール

基盤地図情報ビューワ(URL:https://fgd.gsi.go.jp/download/documents.html)

Blender(URL:https://www.blender.org/download/)

・Unity2017(URL:https://unity3d.com/jp/get-unity/download)

 

 今回の3D空間の地形作りでは、"コードを書く"という難しいことはしません。与えられたスクリプトやキット、ツールの機能を最大限上手に活用するだけで写真の地形が作れます。

 

 

 

1.シェープファイルを取得する

まず、国土交通省が管理する国土地理院というサイトから欲しい地域の"数値標高モデル"をzip形式でダウンロードします。(事前にユーザ登録が必要です)

 

次に数値標高モデルをシェープファイル(.shp)に変換します。

基盤地図情報ビューワを開き、ダウンロードしたデータをフォルダごとビューワにドラッグ&ドロップしてください。

f:id:cinnabar_bird:20190404114543j:plain

地形がヒートマップで表示されていれば成功です。

 

ビューワを使ってシェープファイルに変換します。

メニューバーから、「エクスポート」→「標高メッシュをシェープファイルへ出力」→出力先を選択して「OK」。

 

出力先に".shp"以外にも色々と出力されますが使うのは".shp"のみです。

 

 

2.Blenderで地形のフェイスモデリング

1章で取得したシェープファイルを使って地形の型を作ります。

 

その前に、Blenderにはシェープファイルをインポートするアドオンが無いので外部からアドオンをダウンロードします。

 

・BlenderGISアドオンのGidhub

https://github.com/domlysz/BlenderGIS/commit/e012070408c2d590f16b3ab7fea758223fa8dfba

・アドオンのインストール方法

https://github.com/domlysz/BlenderGIS/wiki/Install-and-usage

 

アドオンを設定したら、シェープファイルをインポートします。

f:id:cinnabar_bird:20190404141744j:plain

インポートすると絵のように点群で表示されます。
この点群を基に地形の型を作ります。

 

Blenderのフェイス機能を使って1枚1枚面を張ってもいいのですが、地形の広さによってかなり労力が掛かるので、私は「Point Cloud Skinner」というスクリプトを活用して自動でメッシュに面を張りました。

 

・Point Cloud Skinner

https://sourceforge.net/projects/pointcloudskin/

 

面を作りました。

f:id:cinnabar_bird:20190404144005j:plain

形はなんとなくわかりますが、面がすごく粗く作られました。

 

しかし、この問題は簡単に解決できます。

Blenderには面の法線ベクトルを一様にする機能がありますのでその機能を活用して面を整理します。

 

地形オブジェクトを選択(オブジェクトの縁が黄色になります。)

           ↓

"オブジェクトモード"を"編集モード"に変えます。

           ↓

[Ctrl+N]を押す。(面が1回では最適化されない場合があるので複数回操作を繰り返す。)

 

最適化すると面の向きがきれいになります。

f:id:cinnabar_bird:20190404145558j:plain

これで地形を作る型ができました。

 

補足:面の法線ベクトルが正規の向きに向いているかどうかを目で見たい方は、以下の様な手段で法線ベクトルが可視化できます。

 

画面上で[N]を押してタブを出します。

        ↓

タブ上の「法線」の項目で面を選択し、長さを設定します。

 

 

3.Unityで地形作成

 実は、Blenderで地形を完全に作らず、地形の大まかな型だけを作ったのには理由があります。

それは、Unityには"Terrain"という地形を作るのに適したオブジェクトがあるからです。

f:id:cinnabar_bird:20190404155641p:plain

Terrainは手動で地形を変化させることができるうえ、木や草などのオブジェクトやテクスチャを自由に加えることができます。

そしてなによりメッシュより容量が軽いです。

 

このTerrainを使って実際に地形を作るのですが、地道に手動で地形を再現するとなると膨大な時間を食ってしまいます。

ですのでスクリプトを活用して自動で地形を作ります。地形の型はその時に使います。

 

まずは以下のリンクから、Terrainを使ってオブジェクトを複製するスクリプトObject2Terrain」をコピーしてUnity上でスクリプトを組みます。

http://kan-kikuchi.hatenablog.com/entry/ObjectToTerrain

組んだスクリプトはEditorフォルダに入れておきます。

 

次にBlenderで作成した地形の型をUnityのシーン上に置きます。

メニューバーの[Terrain]→[Object to Terrain]を選択し、ウインドウが出たらHierarchy上で地形の型を選択した状態で[Create Terrain]を選択します。

 

すると、

f:id:cinnabar_bird:20190404162439j:plain

この様に、地形の型に沿ったTerrainの地形が作られました。

 

あとは自由にオブジェクトを置いたりテクスチャを張れば、現実に限りなく近い3D空間の完成です。

f:id:cinnabar_bird:20190404163037j:plain

f:id:cinnabar_bird:20190404163248p:plain

 

 

4.まとめ

私の地形の作り方では「コードを書く必要が無く簡単」、「現実の地形にほぼ近い空間が創れる」ことを利点として流れを書きました。

 

もしかしたら新しいコードを書いたり、別の方法を取ることでより効率的に地形が作成できるのかもしれません。

 

もし「もっとこういうやり方のほうがいいんじゃない?」ていう方法があれば教えていただければうれしいです。

 

この記事を基にいろんな方法を模索してみてください。