へっぽこ技術ブログです

【Unity】Project Plateau(プラトー)の「横浜市の3D都市モデル」をUnityで使う手順例の覚書

【Unity】Project Plateau(プラトー)の「横浜市の3D都市モデル」をUnityで使う手順例の覚書

www.mlit.go.jp

 

国土交通省が主導する3D都市モデルのオープンデータ化プロジェクト「Project Plateau(プラトー)」の、横浜市のモデルがCityGML形式で公開されているので、(1)それを入手して (2)Unityで使いやすいようにFBX形式に変換して (3)Unityに導入するまでの手順の覚書。入門記事としてご覧ください。

変換処理にはマシンパワーがそれなりに必要です。特にメインメモリの容量が多いPCの使用をお勧めします。

この記事を書いてる人間はこの作業に関わるまで地理データもCityGML形式やらも知らなかったくらいなので、色々察してご容赦ください。

 


 

■概略

横浜市の3D都市モデルを以下のサイトから入手する

www.geospatial.jp

FME Desktopをインストールする

www.safe.com

・Plateau公式の手順書に沿ってFBX形式に変換する

www.mlit.go.jp

https://www.mlit.go.jp/plateau/file/libraries/doc/plateau_doc_0007_ver01.pdf

 

・FBX形式になったデータをUnityのプロジェクトに導入する

docs.unity3d.com

 


 

 ■手順の覚書

 (1) Plateauの横浜市データを入手する

Googleで「Plateau みなとみらい」あたりで検索して配布サイトまで辿り着く。

f:id:Hiesuke:20210619163409p:plain

https://www.geospatial.jp/ckan/dataset/plateau-14100-yokohama-city-2020

・CityGML形式の「詳細」欄をクリックし、ダウンロードを選ぶ。

f:id:Hiesuke:20210619163552p:plain

f:id:Hiesuke:20210619164233p:plain

ダウンロードされたファイル

・展開する。

 

(2) CituyGML形式からFBX形式に変換する

Plateau式の手順書に従って、変換にはFME Desktopを使用する。

FME Desktopは有料ソフト。3万円台くらいなら買ってみようかな~と思ったけど30万円台だったので日和る。というか、個人のお遊びとしてはちょっと手が出せない。
・ただ、FME DesktopにはTrial版やHome Use版、Students版、Non-Profit &Research版などの無料で使用(試用)できるものがあるのでそれを使わせていただく。※自分はHome Use版を申請させていただきました。商用利用の方は製品版ライセンスをお買い求めください。

fmesupport.com

 

FME Desktopをインストールする。申請から1days以内にライセンス(シリアルナンバー)が届くが、届かないうちにインストールしてもTrial版としての使用が可能。

 ・手順書のp.11に「1.2 FBX形式への変換」が載っているのでそれを見ながら作業する。自分は最初の行の「添付のcitygml2fbx.gmwt」というファイルがローカルPC上に見つからなかったので、以下のProject Plateau公式リポジトリから入手した。

github.com

github.com

 

f:id:Hiesuke:20210619171444p:plain

citygml2fbx.fmwt

 ・citygml2fbx.fmwtをダブルクリックするとFME Workbenchなるソフトウェアが起動する。

 

■変換するエリアを指定

・変換を行う前に、横浜市のどのエリアを変換するのかを考える。

・Plateauのデータは以下のようにエリアが区切られている。

 ※展開した横浜市のデータフォルダに入っている「索引図.pdf」に載ってます。

f:id:Hiesuke:20210619234907p:plain

横浜市_構築範囲図(全体図)

・更に細分されたこのピンク色のあたりがビルにテクスチャが貼られたLOD2というデータが入っているのでオススメ。

f:id:Hiesuke:20210619235440p:plain

横浜市_構築範囲図(4/5)からの抜粋

・ちなみにGoogle Mapsと対比させるとこんな感じ。みなとみらいや横浜駅のあたりですね。

f:id:Hiesuke:20210620000104p:plain

Google Mapsからの抜粋

・というわけで、とりあえずエリアとしては「53391540」を選ぶことにしましょうか。

 ・以下は、ほぼ公式手順書通りの手順を書いただけです。悪しからず。

・まずは次の手順で変換するエリアの建物情報を指定する。

FME Workbenchの左上に表示されている『 Input: bldg [CITYGML] 』上で右クリックして『Edit 'Input: bldg~~』を選ぶ。 ※ビルディングの略でbldgですね(たぶん…)

f:id:Hiesuke:20210620000703p:plain

Input: bldgの上で右クリックして...

・表示されたダイアログの『…』をクリック。

f:id:Hiesuke:20210620001111p:plain

Souurceを選ぶファイルダイアログを開く「…」をクリック

横浜市のデータを展開したフォルダの中にある「udx」フォルダの更に中にある「bldg」フォルダを開き、「53391540_bldg_6697_op.gml」というファイルを選んで「開く」ボタンを押す。

f:id:Hiesuke:20210620001549p:plain

53391540_bldg_6697_op.gml というファイルを選んで「開く」

 ・「OK」ボタンを押してダイアログを閉じる。

 

・続いて以下の手順で地形情報を指定する。

・『Input: dem [CITYGML]』の上で右クリックして『Edit 'Input: dem~~』を選ぶ。 ※demってなんの略ですかね?

f:id:Hiesuke:20210620002525p:plain

Input: dem の上で右クリックして...

・ダイアログの「…」をクリックし、

f:id:Hiesuke:20210620002736p:plain

「…」を選んで

・今度は「udx」の中の「dem」フォルダから「53391540_dem_6697_op.gml」を選んでから「開く」ボタンを押す。

f:id:Hiesuke:20210620002957p:plain

53391540_dem_6697_op.gml というファイルを「開く」

・更に「OK」を押してダイアログを閉じる。

 

■FBX形式の保存場所を指定

 ・更に、次の手順で変換後のFBX形式データを出力する場所を指定する。

 ・変換した後のファイル群をまとめて保存するためのフォルダを新規作成(例:FBX_OUTPUT)して、更にそれぞれのエリアごとの変換後ファイル群を入れるフォルダも新規作成(例:53391540などとエリアのわかるフォルダ名)して保存をすると良いですよ。下のような感じ。

f:id:Hiesuke:20210701111341p:plain

FBX変換して出力するフォルダの作成例

 

・Output: bldg_lod2 [FBX] の上で右クリックして、「Edit ’Output~~」を選ぶ。

f:id:Hiesuke:20210620004144p:plain

出力先のフォルダを指定する

・先ほどまでと同様に『…』をクリックし、FBXデータを出力するフォルダを指定する。 ※bldg_lod2はビルにテクスチャが付いたちょっといい感じの建物データ(らしい)

・同じ操作を Output: bldg_lod1 [FBX] と Output:dem [FBX] でも行って出力先のフォルダを指定する。指定するフォルダはすべて同じで良い。

 

 

 ※元の手順書では変換処理の前に緯度経度情報の変換指定の変更処理が書かれています。ここでは、横浜のデータでは変更不要だったので割愛してますが、余裕のある時にぜひ元の手順書を読んでくださいね。

 

・ここまで指定ができたら、次の手順で変換処理を行う。

FME Workbenchの「Run」ボタンをクリックする。

f:id:Hiesuke:20210620005333p:plain

Runボタン

・更にダイアログの「Run」ボタンを押す。

 

・うまく変換出来たら、出力先として指定したフォルダに以下のようなフォルダ1つ&ファイル3つが作成されているはずです。※lod2対応エリアの場合

f:id:Hiesuke:20210620010244p:plain

出力されたファイル群

 

(3) Unityで使用する

・Unityでプロジェクトを作成する。テンプレートは3Dで。

・Projectウインドウに出力先フォルダをD&Dしてプロジェクトに導入する。変換後のファイルやフォルダをまとめて保存してあるフォルダごとしたほうがいいですよ。

※ここでは、FBX_OUTPUTフォルダの下に53391540, 53391541, 53391550と3つのフォルダを作成してそれぞれのエリアを変換しているということで説明します。

f:id:Hiesuke:20210701111341p:plain

変換後のフォルダ構成

・ProjectウインドウのAssetsに、以下のようにフォルダとファイルが導入されます。

f:id:Hiesuke:20210701112828p:plain

Unityにフォルダとファイルを導入

・Hierarchyウインドウ > + > Create Emptyと選択し、空のGameObjectを作成する。

・作成されたGameObjectの名前をエリアの名称(例:53391540)に変える。更に、Inspectorウインドウを使って、Transformコンポーネントの値を以下のように変える。

f:id:Hiesuke:20210701113210p:plain

Transformコンポーネントの値

・同様に空のGameObjectを作成し、使用したいすべてのエリア分の設定を行う。

f:id:Hiesuke:20210701113512p:plain

3つのエリア(の空のオブジェクト)を作成

・Projectウインドウに導入した各エリアのdem, lod1, lod2というファイルを、Hierarchyウインドウに作成したそれぞれのエリア用のオブジェクトにD&Dして子要素にする。

f:id:Hiesuke:20210701114246p:plain

dem, lod1, lod2をドラッグ&ドロップ

f:id:Hiesuke:20210701114416p:plain

子要素となった状態

■確認

・試しに、Hierarchyウインドウにあるdem(どれでも良い)をダブルクリックしてSceneビューで確認してみましょう。以下のように、エリアが接続された状態で配置されていることがわかるはずです。※ALTキーを押しながらマウスボタンを押してドラッグで回転します。

f:id:Hiesuke:20210701114843p:plain

 

・カメラの位置がオブジェクトから離れすぎているので、Gameビューで小さ~~くしか表示されていません。HierarchyウインドウのMain Cameraを選択し、TransformのPositionの値を以下のように設定してみてください。

f:id:Hiesuke:20210701115459p:plain

Main CameraのPosition指定例

・こんな感じになりました。

f:id:Hiesuke:20210701115544p:plain

Gameビューの例

・カメラのTransformの値を色々変えて試してみましょう。

f:id:Hiesuke:20210620012242p:plain

Unityエディタの画面(Gameビュー)

 

 

とりあえずおしまい。

Blog for ”Code for Yokohama”

【Unity】Visual StudioでGameObjectクラスなどが認識されないエラーが出たときの対処方法その2 ※覚書

Projectウインドウで右クリックして「Open C# Project」で直るっぽい。手軽でとても良い。

【Unity】Visual StudioでGameObjectクラスなどが認識されないエラーが出たときの対処方法 ※覚書

プロジェクトのフォルダ直下にある拡張子が .csproj と .sln のファイルを削除してから開きなおすと良いみたい。

これらのファイルは無ければUnityエディタが自動的に作ってくれると公式サイトにも書いてあるので、削除しちゃっても安心です。

 

docs.unity3d.com

【AR】【Androiod】AR Foundationの勉強進捗状況 ※覚書

AR Foundationのサンプルプロジェクト(arfoundation-samples-main)にある幾つかサンプルシーンだけをつらつら読んでいてわかったことの覚書。

自分用の覚書なので間違ってたり変なこと書いてたらごめんなさい。

 

■ Assets > Scenes > SimpleAR

平面検出(Plane)と特徴点検出(Cloud Point)とレイキャスト(AR Raycast Manager)のサンプルとしてとても勉強になりました。

とりあえずMaterialの設定をいじることで、コードの記述は一切無しでPlaneの描画を任意のテクスチャに変えることができました。

 

■ Assets > Scenes > ImageTracking > BasicImageTracking

画像マーカーの使い方のサンプル。

特定の画像を認識して画像上にオブジェクトを出現させる。

特定の画像を認識させてオブジェクトを表示させるだけならコードの記述などは不要で実装できる。サンプルは画像を認識してその画像の情報をコードでオブジェクト上のUIに追記するようなもので多少複雑だったので自分なりに簡単に記述し直してみることをしてみた。ハンドラ(リスナー)の追加とtrackedImage(という名前でサンプルで使われている変数)の使い方が肝ですかね。画像ごとに別のオブジェクトを表示させるのに苦心したけど、スクリプトに数行追加するだけで実装できました。

 

■ Assets > Scenes > FaceTracking  (> FacePose.unity)

顔認識のサンプル。

サンプルがシンプル。顔の位置にオブジェクト表示させて追跡させるだけならコードの記述不要で、自分で実装するのもとてもとても簡単。

 

■ Assets > Scenes > Depth  (> SimpleOcclusion.unity)

オクルージョンのサンプル。

深度に対応して現実世界の物体の奥にオブジェクトがあるときは隠れる。面白い。サンプルはボール落とすだけであんまり面白くないけど。

サンプルプロジェクトと自分の作ったプロジェクトで、AR Occlusion Manager(Script)コンポーネントの設定項目が違うのでなんでかなーと思ったら、AR Foundationのバージョンが Unity 2020.2.4f1 のVerified版である AR Foundation 4.0.12 ではなく 新しい AR Foundation 4.1.15ではなかったからでした。

 

 

これらの作り方(入門編)の記事はいつか書くかも。

 

とりあえずここまで。

 

 

 

 

【AR】【Androiod】Unity AR Foundationって何? ※覚書

自分用の覚書

 

Unity AR Foundationって何?ってのはこちらを読んでねというのが正解です。公式が正義。

docs.unity3d.com

こちらは Unity 2020用のPluginバージョン4.1のページです。

古いバージョンのページを見ても英語なので楽するのは諦めましょう。というか、Chromeブラウザの翻訳機能を使っても結構読める日本語になる簡素な文章なので、僕みたいに英語に明るくない残念エンジニアにも嬉しいです。

 

 

以下は日本語訳ではありません。自分用の適当で意訳しまくり抜粋しまくりの覚書です。

■AR Foundatioとは

 Unityで使えるマルチプラットフォーム対応のAR開発機能だよ。ただし、インターフェースの提供だけなのでAR機能は以下のプラットフォームごとのパッケージも必要ね。

   Android用  : ARCore XR Plugin

   iOS用    : ARKit XR Plugin

   Magic Leap用 : Magic Leap XR Plugin

   HoloLens用  : Windows XR Plugin

 ちなみにこんなことができるよ。

   Device tracking : モノの位置と向きを検知する

   Plane detection : 平面(水平および垂直)を検出する

   Point cloud : 特徴点(特徴的な部分)の認識をする

   Light estimation : 色温度と明るさを推定する

   2D image tracking : 2次元画像をマーカーに使う

   3D object tracking : 3次元物体をマーカーに使う iOSのみ。

  ほかにも Face tracking(顔認識)とかOcclusion(深度検出)とかあるよ。詳細は公式読んでね。

 

■Platformサポート

 ARKitはたくさん使えるよ、もりもりと。ARCoreはちょっと使えないのあるよ。他はまぁこれからですかね。

AR Subsystemというプラットフォーム非依存のインタフェースで機能を使うよ。Subsystemは個別プラットフォームごとに実装がされていてこれをProviderと呼ぶよ。

 

■AR Foundationのインストール

 Package Managerから AR Foundation とプラットフォームごとのPluginをインストールしてね。

 

■用語集

用語 説明
Tracking ラッキング。カメラを移動させたときに現実世界で追跡(追随)させるAR機能
Trackable

ラッキング可能。平面などの現実世界の特徴を検出できること

Feature Point 特徴点。ARデバイスは特徴的な部分を検出して「環境マップ」を作成している
Session ARセッション。
Session Space セッション空間。ARセッションが開始された位置を原点 (0, 0, 0) とした座標系。

 

■AR Foundationの使い方

 GitHubのサンプル(https://github.com/Unity-Technologies/arfoundation-samples)を読んでね。

 

 ARアプリのSceneには「AR Session」と「AR Session Origin」を配置するよ。「AR Session Origin」の子要素には「AR Camera」が付いてるよ。デフォルトのMain Cameraはいらないよ。

 これらはHierarchyウインドウ > 「+」 > XR から作成すると楽ちんだよ。空のGameObjectに下記のコンポーネントを追加するのでもいいけどね。

 

AR Session コンポーネント

 ARアプリのSceneにはARSessionコンポーネントが1つ必要であり、これがライフサイクルを制御する。デバイスでARがサポートされているかなどをセッション状態として確認することができる。

 

AR Session Origin コンポーネント

 ARセッションの原点 (0, 0, 0) を元にして現実世界の位置とか向きなどをアプリ内の空間のものに変換してくれる。

 

AR Pose Driver コンポーネント

 

AR Camera manager コンポーネント

 

AR Camera Background コンポーネント

 

AR Input Manager コンポーネント