CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

PLATEAU (2022) の3Dモデルを、オープンデータを活用してブラウザで表示できるように出力してみよう

ここ最近PLATEAUについて調べています。

2年前にBabylon.jsでPLATEAUモデルを表示させる方法を書きました。

www.crossroad-tech.com

当時は、fbx形式で固定エリアのPLATEAUモデルをダウンロードして表示する方法がありました。しかし、最近はPLATEAU SDK for Unityがあり、任意の場所を指定して出力できるようになっています。

都市モデルのインポート | PLATEAU SDK for Unity

今回はPLATEAU SDK for Unityで取得したPLATEAUデータをglbファイルに変換して、オープンデータのマッピングができるサイズで出力する方法を説明します。
ただ3Dモデルとして出力するだけならば、今回の作業をしなくてもよいのですが、オープンデータに記載の緯度経度を使ってPLATEAUモデルにオープンデータ (例:公衆無線LANスポット、公共施設などの位置を表示) をマッピングする場合、今回のようにサイズを考慮する必要があります。

環境

Unity 2021.3.28f1
PLATEAU SDK for Unity v 2.0.0. alpha
Babylon.js v6.2.1
Blender 3.3.6

2022年の東京都内のPLATEAUモデルを使用しました

1. 主な処理の流れ

後述の通りUnityから出力すると左右が反転してしまうため、このように対応しました。
左右反転の問題が解消された場合、(2)でglb出力、 (3), (4) を省略とできるかもしれません。

(1) UnityでPLATEAU データを表示させる

(2) fbxまたはglb形式で出力する

(3) Blenderでfbxまたはglbファイルをインポートする

(4) Blenderで左右反転をする

(5) Blenderでオブジェクト結合 (join) を行う

あとはglbで出力すると、Babylon.jsで使うことができます。

2. UnityでPLATEAUデータを表示させる

たとえば、この辺のページを参考にしてUnityで表示させます。

都市モデルのインポート | PLATEAU SDK for Unity

PLATEAU SDK for Unity v2.0.0-alpha で追加されたテクスチャ結合を試してみました - CrossRoad

3. fbxまたはglb形式で出力する

PLATEAU SDK for Unityではobj, gltf, fbxの3種類の出力形式があります。objだとさらに反転がでてややこしくなるので、gltfかfbxでの変換をお勧めします。

また、EUN(Unityでの座標系)、ESU(Unreal Engineでの座標系)、ENU(PLATEAUでの座標系)、WUN(Unityでの座標系の左右反転版) の4種類の方向で出力できます。

Babylon.jsはUnityと同じくEUN (East, Up, North) なので、EUNを選択します。 また、 座標はLocalにします。
Plane Cartesianにした場合、原点から離れたところに3Dモデルが表示されるのですが、3Dモデルの座標が0,0,0のままなので、どこにモデルがあるのかを探しづらくなります。

gltfの場合、個別のglbファイルがフォルダに格納されて出力されます。

Exported glb files from PLATEAU SDK for Unity

fbxの場合、フォーマットをBinaryで出力します。asciiにすると後で使うBlenderで読めないためです。

出力ファイルは、1つのフォルダに出力されます。

Exported fbx files from PLATEAU SDK for Unity

4. Blenderでfbxまたはglbファイルをインポートする

fbxファイルをインポートする場合、scaleを100、Manual Orientationで Forward : -Z Forward、Up : +Y Up にします。

Importing PLATEAU fbx files on Blender

理由は調べきれていませんが、scaleを100にしないと縮尺がおかしくなります。

Unityでfbxモデルをインポートするときも同様のようです。

デフォルトでは、FBX形式ファイルをインポートすると1/100のサイズに変換されます。そのため、約1km×1kmの範囲が約10m×10mの大きさになってしまいます(図9-9)。

引用元:TOPIC9|Unityで活用する[1/2]|Unityでの3D都市モデルの読み込みと表示方法 | How To Use | PLATEAU [プラトー]

glbファイルをインポートする場合、特にscaleやorientationの指定はないので、そのままインポートします。

5. Blenderで左右反転をする

この理由が不明のままですが、Unityからobj, gltf, fbxで出力すると、EUN(Unityでの座標系)、ESU(Unreal Engineでの座標系)、ENU(PLATEAUでの座標系)、WUN(Unityでの座標系の左右反転版) のどれを選んだとしても、左右が反転した状態で出力されます。

Unity内では実際の地図と同じ形で表示されるのですが、出力すると左右が反転してしまいます。

解決策として、Blenderで開いた状態でObject Modeにして、Object > Mirror > X globalとすると反転を正しい向きにできます。

Mirror process on Blender

6. Blenderでオブジェクト結合 (join) を行う

PLATEAUのモデルを広範囲でインポートすると、LOD1 (建物を単純な立方体などの図形で表現) であっても相当に重くなります。
そのため、ちょっと街風景を使いたいだけの場合、重くて動かなくなります。

そこで、Blenderで一定範囲のオブジェクトをjoin処理して単一メッシュにすると、描画負荷をかなり下げることができます。

今回は東京都文京区の広域を表示してみました。最初はBlenderで視点を変えるだけでもかなり重かったのですが、このように一定範囲でjoinしたところかなり軽くなりました。

Joined PLATEAU objects on Blender

スペックが高いPCであれば不要かもしれませんが、この後Babylon.jsでブラウザ表示する場合は必要になります。

7. おわりに

今回のように、スケールや左右反転に気をつけて出力すれば、オープンデータの緯度経度情報をマッピングさせることもできます。

この辺は技術書典15で記載予定ですのでお楽しみに!

2024/2/11 追記
遅れましたが、実際に表示したイメージです。

youtu.be

詳しくはこちらをご覧ください。

techbookfest.org