😎

PLATEAUでClusterワールド作ってみた

2024/11/20に公開

PLATEAUでClusterワールド作ってみた

UnityにPLATEAU SDK for Unityを導入する

PLATEAUについて気になる方は# PLATEAUとは、へ飛んでください。

PLATEAU Unity SDK の導入 に従って、PLATEAU Unity SDKを導入し、都市データのワールドを公開することを目標にする。

ClusterはUnity 2021.3.4をサポートしている(2024/10/31)ので、PLATEAU SDK for Unity v2.3.2を導入してみる。Unityで[Window]>[Package Manager]の「+」ボタンから「GIT URL からパッケージを加える」を実行し、https://github.com/Project-PLATEAU/PLATEAU-SDK-for-Unity.git#v2.3.2を指定した。(a few moments later)
いかがでしょう。僕の環境では3分ほど待ってパッケージ追加に失敗していました。仕方がないのでリリースページにあるtgzファイルをダウンロードし、そのままパッケージとして追加します。
Unityで[Window]>[Package Manager]の「+」ボタンから「.tgzファイルからパッケージを加える」を実行し、ダウンロードしたファイルを指定します。(a few moments later)
いかがでしょう。僕の環境では3分ほど待ってパッケージ追加に失敗していました。仕方がないのでv2.3.0のリリースページにあるtgzファイルをダウンロードし、そのままパッケージとして追加します。いかがでしょう。僕の環境ではパッケージ追加に失敗していました。
まったく理解できないのですが、v1.1.6のtgzファイルの導入には成功しました。(つらい)

PLATEAU SDKで都市データをインポートする

Unityで[PLATEAU]>[PLATEAU SDK]で「インポート」タブにおいて、[インポート元をサーバー]、[都道府県を京都府]、[データセットを京都市]、[基準座標系を06]に設定します。
「範囲選択」ボタンをおします。
適当な範囲に絞って決定を押します。

決定を押すと、地物の設定ができます。
読み込み対象は[インポートするをon]にし、[Mesh Colliderをセットするをon]にしました。LODは0~1あれば今回はよいと思っています。


どうなるかわかりませんが、基準座標系からのオフセット値を「範囲の中心点を入力」ボタンを押した値にしました。

実行するとインポートが始まります。(a few moments later)
いかがでしょう。僕の環境では50分ほど待ってモデルインポートに成功しました。(つらい)
LOD1までのデータですので簡易ポリゴンの街並みになりました。

LOD2にすればテクスチャーもつくのだと思いますが、とても今のスペックで使える代物ではなさそうです。

Clusterにワールドアップロード

インポートしたデータは正式版とていClusterワールドアップロードできるようなので、いつも通りアップロードします。(a few moments later)
10分程度でアップロードできたようです。またワードサイズが1MBとかなり軽かったです。
実際にワールドでプレイすると、プレイヤーの移動が大変でした。三条~四条はリアルスケールで十分でかいように、ワールドも十分でかいんですね。

これからLOD2まで都市データをインポートしようとしています。もし機会があればページ更新します。(ここでiOS向けマテリアルのサポートができていないとかで消息を絶つ)
https://baba-s.hatenablog.com/entry/2018/05/08/210000#google_vignette
%appdata%..\LocalLow\Unity 以下にportrait.jpg.meta」と「landscape.jpg.meta」があるので、「textureFormat」の数値を「4」に変更して保存、とある。しかしそんなmetaファイルが無い。


下記ではPLATEAUのトピック26章文読み流した悲しい過去をつづります。(上の段落でSDKを使う前に一人で事前学習していました。)悲しい気持ちに共鳴したい方は必読です。

PLATEAUとは

TOPIC 0|はじめに
PLATEAU(プラトー)は、日本の都市を3Dデータで再現し、誰でも使えるようにするプロジェクトのこと。
3D都市モデルは、現実の都市をデジタル上に再現した立体的な地図として再現したもの。このような3D都市モデルを扱うソフトにGIS(Geographic Information System、地理情報システム)がある。3D都市モデルがもつ地物の詳細度を示すのが、「LOD(Level of Detail)」。おそらく、ゲームの一般的な背景であればLOD2(高さ情報外観の凸凹、屋根や壁、航空写真を用いたテクスチャ画像)まであればよさそう(一番簡易なモデルはLOD0で平面に投影したもの)。
3D都市モデルはCityGML(XML形式)で記述される。これはGML(Geography Markup Language)の3D都市への拡張したデータ形式である。

3D都市モデル

モデルの配布

3D都市モデルはG空間情報センターで配布されている。
-東京都23区
-京都市
CityGML形式データを展開すると、地物ごとのフォルダに分割されている。それぞれのフォルダには、
「メッシュコード」で規定される区域ごとに分割されてメッシュコード_地物接頭辞_CRS_オプション_opという命名規則でファイルが格納されている。※メッシュコードは区域ごとに設定されている番号。

メッシュコードの確認

3D都市モデルを使うとき、利用したい地物がどのメッシュに含まれているか、そのファイル名を特定する。jSTAT MAP

3次メッシュにラベル付与する。

鴨川三条から四条はメッシュコード42354611と52354601に含まれる

CityGML形式データの構造

CityGMLはCityModel要素で始まり、地物集合程度の単位でモジュール化されているらしい(パット見カテゴリーが理解できない。3D都市モデル標準製品仕様書に記載があるらしい)
座標系やテクスチャーの情報のスキーマの読み取り方がTOPIC 3[2/4]に記載があるが、ちょっとよくわからない。つらい。TOPIC 3[3/4]には幾何形状のデータ構造が説明されている。
LOD0データでは、ポリゴンの頂点座標は、gml:posList緯度 経度 高さ 緯度 経度 高さ ...</gml:posList>の3パラメータを1セットし、空白区切りですべての頂点を記述される。
LOD1、LOD2、、、とデータは立地になるけど、基本他の要素への参照で構成しているよう。。。ネイティブデータで読み取る場合はこれらのデータ構造を知っている必要はあるだろうが、我々末端の利用者に理解が必要だろうか。だいぶつらい。
LOD2で扱える面のテクスチャはapp:appearanceMemberで定義し、貼り付ける面のIDを指定しているそう。
TOPIC 3[4/4]CityGMLの座標・高さでは、例えばゲームで利用できるように、上記の経緯度の値をXY座標のメートル単位に変換する例が記載されている。
3D都市モデルの空間参照系はgml:Envelopeで6697(もしくは6668)と指定されている通り、日本測地系2011における経緯度座標系とのことでした。
この座標系を2次元の平面直行座標系で扱うようで、その座標系の基準点は日本では19種の取り方があるらしい。。。関東圏は9系で関西圏は6系(EPSGコード参照)のようです。なんだか、大学一回生の数学の一般教養を受けている気になります。。。この変換にはOSSのGDAL、GDAL内部で使われている座標変換ライブラリPROJ、PythonからPROJを利用するためのpyprojが紹介されていました。
座標軸は日本を中心において、北が+X軸で東が+Y軸とのこと。なんでそうとったのだろうか。またEPSGの区分の原点が目的の地物から十分遠い場合があるとのことで、事前に原点を調整しないとカメラに映らないらしい、、、あと、大きな値を扱うのでfloat型だと桁あふれが発生するとのこと。。。うーん。

こういったデータの加工を頑張るならXML形式を読み取るプログラムを作るか、PLATEAU SDKを使え、とのこと。。。

CityGML形式のデータ変換

CityGML形式のデータ加工ソフトウェアに、Safe Software社の「FME Form」がある。業務目的で利用するには、ライセンスの購入が必要。
入力、変換、出力を担うオブジェクトが提供され、処理をつないだ一連の流れのことを「ワークベンチ(Workbench)」と言う、らしい。
変換マニュアルサンプルデータはこちら。変換マニュアルが充実しているのでここでは取り上げない。

おそらくUnityユーザーになるので、上記のツールは使わない。PLATEAU SDKを使ってCityGMLデータをインポートできるとのこと。。。

3D都市モデルの活用

スキップする活用例

GISで活用しないので、TOPIC 5はスキップ。
Cesiumで活用しないので、TOPIC 6はスキップ。CesiumはオープンソースのWebGISらしい。
TerriaJSで活用しないので、TOPIC 7はスキップ。データカタログビューアを作ることができるフレームワークらしい。よくわからないが、Cesiumと組み合わせて視覚情報を加工できるらしい。
Unreal Engineで活用しないので、TOPIC 10はスキップ。
TouchDesignerで活用しないので、TOPIC 11はスキップ。映像表現ができるビジュアルプログラミングツールらしい。
Three.jsで活用しないので、TOPIC 12はスキップ。ブラウザで3D映像を描画する軽量なJavaScriptライブラリらしい。

Blenderで活用

Blenderでは、OBJ形式やFBX形式のファイルをインポートできる。OBJ形式の3D都市モデルを準備してほしい、とのこと。(a few moments later)
Blenderで[ファイル]>[インポート]>[Wavefront(OBJ)]でインポートできる。
そのとき「トランスフォーム」で「前方の軸をY」「上向きの軸をZ」に設定するとのこと。(FBX形式の場合、加えて「スケールに100.0」を設定するとのこと)
Blenderの[アウトライナー](データのツリー表示でインポートデータを選択し、
[ビュー]>「選択をフレームイン」するとオブジェクトが視界に入る。
Blenderの3Dビューポートを選択し、Nキーを押す。「ビュー」タブの「終了に10000m」と指定すると、10000m先まで表示される

Blenderで読み込んだデータをUnityなど向けにエクスポートするときは、軸の設定を忘れずにする

参考

Blenderでテクスチャ付きfbxを出力し、Unityでテクスチャ付きfbxを読み込む方法という一般記事がありました。

Unityで活用

Unityでは、OBJ形式やFBX形式のファイルをインポートできる。FBX形式の3D都市モデルを準備してほしい、とのこと。(a few moments later)また、ここではPLATEAU SDK for Unityとは別の読み込み方法を記載している。
FBX形式ファイルをインポートすると1/100のサイズに変換される。Unityの[Assets]に配置したFBXデータの[Inspector]パネルの[Model]タブで[Convert UnitsをOff]にすること。(OBJ形式の場合、Rotationを(-90,0,0)でFBXと同様の向きになる)

VRでの利用

Unityに取り込み

PLATEAUのデータをUnityに取り込み、Unity上でVR用のデータを作成する
ある3次メッシュコードから抽出したOBJファイルを中心付近が原点になるように原点を移動するのがいいらしい。Blenderで操作できるが、Topic13ではpythonで制御している。OBJファイルは[v X座標 Y座標 Z座標]と空白区切りで並んでいる。
サンプルコードでは、原点(x, y)にするために[v X-x Ypy Z]と各行演算してファイル出力していた。

Unityにファイル(OBJにくわえ、(.mtl)やテクスチャも含む)をインポートしたときに
インスペクターの[Model]タブで、[Convert Unitsをoff]、[Import BlendShapesをoff]、[Import Camerasをoff]、[Import Lightsをoff]にする。
[Rig]タブで、[Animation TypeをNone]にする。
[Animation]タブで、[Import Animationをoff]にする。
[Materials]タブで、地形(dem)以外ではOBJの[Apply]を実行してロードする。地形(dem)は[Material Creation ModeをNone]にして[Apply]を実行する。地形(dem)はオルソ画像をテクスチャーとして貼るらしい。
テクスチャの設定ではモデル全体で再構築するらしいので、[MaxSizeを4096]、[CompressionをNone]にする。
向きはRotationで[-90,0,0]にするとよいらしい。
オルソ画像はGeoTIFF形式でG空間情報センターからダウンロードするとのこと。QGISを使ってGeoTIFFファイルを必要箇所だけ切り出すらしい。(つらい、あ、無理です。。)

Unityでデータ軽量化

モデルのマテリアル数は多数あるけどテクスチャ画像に隙間がある場合、アトラス化という処理で軽量化できるらしい。(僕の理解だとテクスチャ画像はUV2次元座標指定で切り取って3Dオブジェクトの表面に貼り付けている。これで描画負荷と、隙間節約程度のサイズ軽量化になるのだと思われる)
自動化のソリューションのSimplygonプラグインを紹介していた。これは有料の商用ソフトウェアで、制限付きながらも無料で使えるFreeライセンスがあるらしい。
(2024/10/26時点で確認したところ30日間のトライアルはあるが、一番安いプランで年間50万円程度かかる。オワタ。Simplygon Cloud Freeなら1時間/1か月までサーバー処理無料プランがあるらしいがよくわからない。。つらい。)

Mesh Rendererの設定

PLATEAUのオルソ画像にはテクスチャに影が入っているので、メッシュのライティング設定をいくつか無効にできるらしい。UnityのインスペクターでMesh Renderer系のコンポーネント設定のうち[Lighting]の[Cast ShadowsをOff]、[Receive ShadowsをOff]、[Contribute Global Illum...をOff] (Illuminationだと思われる。日本語メニューの場合、ライティングのグローバルイルミネーションを受ける、に該当するはず。)
[Probes]の[Light ProbesをOff]、[Reflection ProbesをOff]
[Additional Settings]の[Motion VectorsをForce No Motions]、[Dynamic OcclutionをOn]
にしているみたい。

Shaderの設定

UnityのインスペクターのShaderで[Unlit/Texture]に設定。テクスチャマッピングのなかで、最も軽量らしい。(シェーダーのサイズ感と表現力の天秤は全く知りません。。。)

Static設定

実行時動かないものはUnityのインスペクターにある[StaticをOn]にする。

Textureのパラメータ調整

UnityでTextureのInspectorの設定について、

モデル Max Size
建築物 8192
橋梁 4096
地形 2048

[Mip MapをOff] (多分 Generate Mip MapをOff)、[CompressionをNone以外] (高品質にするとより軽量化できるが見た目と要相談。)[Crunch CompressionをOn] (多分Use Crunch Compressionのこと)

Colliderの設定

Mesh Colliderコンポーネントを設定するが、[Convex をOff]にすること。(凸状にするをOffと思われる。)

Clusterで使う

CCKを使う。Unityでワールド制作するときの注意点は公式ページがある。

ほかのメタバースプラットフォームで使う

VRChatで僕は使わないのでTopic 13.3はスキップ。
Hubsで使わないのでTopic 13.4はスキップ。Hubsはブラウザで動くVRシステムとのこと。
自作アプリで使わないのでTopic 13.5はスキップ。Open XR SDKとかで表示するのだろうか。

ARでの利用

ARで僕は使わないのでTopic 14はスキップ。

クリエイティブツールでの利用

CLIP STUDIO PAINTでの利用

CLIP STUDIO PAINTを僕は使うけど、今回の本筋ではないのでTopic 15.1はスキップ。

3ds Maxでの利用

3ds Maxで僕は使わないのでTopic 15.2はスキップ。AUTODESK社の3Dモデリング・レンダリング・アニメーションのソフトウェアらしい。

ROSでの利用

ROSで僕は使わないのでTopic 16スキップ。ROS(Robot Operating System)とは、ロボット用のソフトウェアプラットフォームのことらしい。

PLATEAU SDK for Unity

PLATEAU SDK for Unity
はPLATEAUをUnityで利用するためのもの。
CityGMLといった必要なファイルを、ローカルと配信用サーバーいずれかからインポートできる。インポート時に3D都市モデルを抽出できる。CityGMLの各座標は平面直角座標への変換や原点オフセットもできるとのこと。また、CityGMLの形状データはインポート時にポリゴンメッシュに変換されるらしい。
テクスチャーはインポート時にアトラス化される。(↑の章で一生懸命座標変換だのアトラス化だの説明していたのに、、自前でコード書かなくていいじゃないか。。。。)
データの分割・結合・エクスポートとかいろいろあるけど、きっとそこまで手を出さない(と信じている)。
PLATEAU SDK for Unity は、Unityバージョン 2021.3.35 を想定している、とのこと。
ゲームサンプルで、Unityのメニューバー[PLATEAU]>[PLATEAU SDK]からインポートできるらしい、、、(が自分のプロジェクトにPLATEAU SDK for Unityをどう導入すればよいのだ PLATEAU Unity SDK の導入 に記載されていた。。。)

活用事例

topic 18~26は活用事例であるが、Clusterで利用することに近い例は少ない。(C#実装であったり、プラットフォームが異なったり)夜景を作るとか、プレハブを活用する、といった例は役に立つかもしれない。そういうやり方があるという金砂が記憶に残っていれば良しとしましょう。

Discussion