tpc09-1

TOPIC9|Unityで活用する[1/2]|Unityでの3D都市モデルの読み込みと表示方法

Unityは2D/3Dに対応したゲームエンジンおよび開発プラットフォームです。ゲームアプリの開発のほか、シミュレーションなど幅広い分野で活用されています。UnityにFBX形式とOBJ形式の3D都市モデルを読み込み、表示する方法を説明します。

Share

TOPIC9:Unityで活用する

Unityは、ゲームのほか幅広い業界で用いられるゲームエンジンおよび開発プラットフォームです。このトピックでは、UnityでPLATEAUを活用する方法を説明します。

【目次】

9.1   Unityとは

 9.1.1  Unityのダウンロードとインストール

 9.1.2  Unityの起動とプロジェクトの作成

9.2   3D都市モデルの基本的な読み込み方

 9.2.1  FBX形式ファイルのダウンロード

 9.2.2  FBXファイルをUnityに配置する

9.3   別のデータを重ねる

 9.3.1  異なるメッシュコードの建築物を重ねる

 9.3.2  異なる種類のデータを重ねる

9.4    対象の地域を原点に移動させる

 9.4.1  データをグループ化する

 9.4.2  カメラ位置に対象データを移動させる

9.5     実行してテストをする

 9.5.1  カメラに移動機能を追加する

 9.5.2  実行して確認する

9.1 _ Unityとは

Unityは、2Dならびに3Dに対応するゲームエンジンです。PCやスマホ、VR機器などで動くアプリを作れます。その用途はゲームに限らず、各種シミュレーションの分野でも活用されています。

9.1.1 _ Unityのダウンロードとインストール

Unityは、無料で使える個人向けライセンスプランが用意されており、基準を満たした教育機関に在籍している16歳以上の学生は「Student」プラン、過去12カ月の収入および資金調達(自己資金を含む)の合計額が年間 10 万ドルを超えない場合は「Personal」プランが使用できます(2022年10月現在)。Unityの公式ページ(図9-1)からダウンロードページに移動し、まず、「Unity Hub」をダウンロードしてインストールしてください。Unity Hubを起動したら、[Installs]タブを開き、[Install Editor]をクリックして、Unityエディターという開発環境本体をインストールします(図9-2)。

図9-1 Unity公式サイト
図9-2 Unity Hubを起動して、Unityエディターをインストールする

【メモ】

Unityは、「Tech ストリーム」と呼ばれる最新機能が搭載されたバージョンのエディターと、機能導入やAPI変更は行われないが隔週で修正プログラムが2年間提供される「LTS (Long Term Support)」 と呼ばれる長期間運用のプロジェクトに向いているバージョンのエディターをリリースしています。ダウンロードページのリンクからLTSの最新版をダウンロードできるので、そちらを利用してください。

【Unity公式ページ】

https://unity.com/ja/

9.1.2 _ Unityの起動とプロジェクトの作成

Unityで開発をはじめるには、Unity Hubを起動し、[Projects]タブの[New project]をクリックして新規プロジェクトを作成します(図9-3)。

新規プロジェクトは、テンプレートを使って作成できます。ここでは、「3D(URP)」を選択してください(図9-4)。

任意のプロジェクト名を付けてプロジェクトを新規作成すると、Unityが起動します(図9-5)。起動直後は、「Main Camera」(カメラ)、「Directional Light」(太陽のように遠くにある光源)、「Global Volume」(画面に表示する前にかけるエフェクト調整)の3つのオブジェクトが作られています。

【メモ】

URPは、Universal Render Pipelineの略で、Unityの標準的なレンダリングパイプライン(3Dモデルデータを処理して映像化するまでの加工手順のこと)のひとつです。スマートフォンなどのモバイル端末や家庭用ゲーム機、PC、VR/ARなど非常に幅広いプラットフォームに最適化されていること、そしてShader GraphやVFX Graphなど、古くから存在するBuilt-in Pipelineでは対応していないアーティスト向け機能も用意されているのが特徴です。

図9-3 Unity Hubからプロジェクトを新規作成する
図9-4 [3D(URP)]テンプレートを使ってプロジェクトを作る
図9-5 Unityが起動した

9.2 _ 3D都市モデルの基本的な読み込み方

Unityでは、OBJ形式やFBX形式のファイルをインポートできます。ここでは、FBX形式の3D都市モデルを読み込んで表示する方法を説明します。

コラム:PLATEAU SDK for Unity

UnityでPLATEAUの3D都市モデルを読み込むには、本TOPICで説明している方法のほかに「PLATEAU SDK for Unity」を使う方法もあります。

PLATEAU SDK for Unityをインストールすると、地図から選んで、目的の地域の3D都市モデルを簡単にインポートできます。

9.2.1 _ FBX形式ファイルのダウンロード

次のいずれかの方法で、FBX形式の3D都市モデルを準備します。

----------------
①G空間情報センターから、利用したい3D都市モデルのFBX形式ファイルをダウンロードする

②PLATEAU SDK【TOPIC17】やFME Form【TOPIC4】などを使って、CityGMLから変換する
----------------

FBX形式ファイルが提供されている都市であれば、①の方法が簡単です。ここでは①の方法で、東京都23区の3D都市モデルをダウンロードしたものを使います。

【メモ】

②の方法でLOD2の建築物モデルを扱う場合は、merge_bldg_surface.fmwtを用いて、テクスチャを再構成して軽量化したFBXデータの使用を推奨します(「4.3.5 建築物データのテクスチャを再構成した軽量FBX/OBJを作る」を参照)。G空間情報センターからダウンロードできるFBX形式ファイルは、このワークベンチで軽量化したものではありません。

G空間情報センターの東京都23区の3D都市モデルのページを開き、[FBX]のプルダウンから[ダウンロード]を選択します(図9-6)。

【3D都市モデル(Project PLATEAU)東京都23区】

https://www.geospatial.jp/ckan/dataset/plateau-tokyo23ku

図9-6 FBXをダウンロードする

フォルダ構造

ダウンロードしたファイルを展開した構造は以下のとおりで、【3D都市モデルデータの基本】で説明したフォルダ構造に従っています(図9-7、図9-8)。

図9-7 フォルダ構造
図9-8 含まれるモデルデータ

G空間情報センターからダウンロードした東京都23区のFBX形式ファイルの場合、建築物や橋梁(bldgおよびbrid)は3次メッシュ、地形(demおよびtran)は2次メッシュで分割されています。

13100_tokyo23-ku_2020_fbx_3_op
├─13100_indexmap_op.pdf
├─bldg
│  ├─lod1
│  │  ├─53392546_bldg_6677.fbx
│  │  │ …略…
│  └─lod2
│  │  ├─53392546_bldg_6677.fbx
│  │  │ …略…
├─brid
│  ├─53392650_brid_6677.fbx
│  │ …略…
├─dem
│  ├─533925_dem_6677.fbx
│  │ …略…
└─tran
│  ├─533925_tran_6677.fbx
└─metadata
    └fbx_13100_2020_metadata_op.xml

以下の例では、東京都庁周辺の建築物を扱います。東京都庁は53394525という3次メッシュに存在します。LOD1、LOD2のファイルは、それぞれ以下のとおりです。

【メモ】

メッシュの確認方法については、【3D都市モデルデータの基本】を参照してください。

LOD1の場合:bldg/lod1/53394525_bldg_6677.fbx

LOD2の場合:bldg/lod2/53394525_bldg_6677.fbx

■ FBX形式データの仕様

提供されているFBX形式データの仕様は、メタデータにJMP2.0仕様として記述されています。

● 座標系

該当地域の平面直角座標系+TP(東京湾平均海面)の複合座標系に変換されています。X軸が東西方向、Z軸が南北方向、Y軸が高さです。

9.2.2 _ FBXファイルをUnityに配置する

3D都市モデルのFBXファイルをダウンロードしたら、Unityにインポートして、シーンに配置します。ここでは、LOD1の53394525_bldg_6677.fbxファイルを配置してみます。

【メモ】

以下では、提供されている53394525_bldg_6677.fbxファイルをそのまま使いますが、使用範囲を調整したいときは、あらかじめBlenderなどの3Dソフトを使って不必要な部分を削除したり、他のファイルとマージしたりして、必要に応じて加工したFBX形式ファイルを使うとよいでしょう。詳しくは【Blenderで活用する】で解説しています。

[1]プロジェクトのフォルダに登録する

利用したいFBXファイルをプロジェクトの[Assets]フォルダにドラッグ&ドロップして追加します。ドラッグ&ドロップするとデータのコンバートが始まり、モデルとして登録されます。LOD1のデータであればすぐに完了しますが、LOD2の場合はコンバートに数分かかることもあります。

【メモ】

LOD2の場合は、配置後にテクスチャのマテリアルの場所を指定して再適用しなければ、テクスチャが貼られません。詳細は、「9.7 LOD2の建築物モデルの取り扱い」で説明します。

[2]単位変換を無効にする

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

図9-9 1/100のサイズに変換されてしまう

これを防ぐため、[Assets]フォルダに配置したFBXデータを選択して、[Inspector]パネルの[Model]を選択してから、[Convert Units]のチェックを外します。変更したら右下の[Apply]ボタンをクリックして、変更したスケールをFBXファイルに適用します(図9-10)。

【メモ】

別の方法として、[Convert Units]のチェックを外す代わりに、[Scale Factor]を「100」にする方法もあります。

図9-10 [Convert Units]を無効にする

[3]シーンにドラッグ&ドロップし、原点に移動する

プロジェクトにインポートしたモデルを、シーンにドラッグ&ドロップします(図9-11)。

図9-11 FBXファイルをシーンに追加する
図9-12 Positionを原点とする
図9-13 配置した3D都市モデルを確認したところ
コラム:OBJファイルを配置する

OBJ形式ファイルも、同様にして配置できます。

■ ファイル構造

G空間情報センターからダウンロードした東京都23区のOBJ形式ファイルの場合、次の構造で格納されています。例えば、東京都庁を含む53394525という3次メッシュの建築物ファイルは、下記のファイルです。

LOD1の場合:bldg/lod1/53392546_bldg_6677_obj/53394525_bldg_6677.obj

LOD2の場合:bldg/lod2/53392546_bldg_6677_obj/53394525_bldg_6677.obj

13100_tokyo23-ku_2020_obj_3_op
│  13100_indexmap_op.pdf
│  
├─bldg
│  ├─lod1
│  │  ├─53392546_bldg_6677_obj
│  │  │      53392546_bldg_6677.obj
│  │  │      
│  │  ・・・略・・・
│  │         
│  │          
│  └─lod2
│      ├─53392633_bldg_6677_obj
│      │  │  53392633_bldg_6677.obj
│      │  │  materials.mtl
│      │  │  
│      │  └─materials_textures
│      │          hnap0664.jpg
│      │          hnap0665.jpg
│      │          hnap0666.jpg
│      │          hnap0668.jpg
│      │          hnap0669.jpg
│      │          hnap0670.jpg
│      │          hnap0671.jpg
│      │          hnap0672.jpg
│      │          hnap0675.jpg
│      │          hnap0697.jpg
│      ・・・略・・・
│                  
├─brid
│  ├─53392641_brid_6677_obj
│  │  │  53392641_brid_6677.obj
│  │  │  materials.mtl
│  │  │  
│  │  └─materials_textures
│  │          hnap0339.png
│  │          hnap0362.png
│ ・・・略・・・
│              
├─dem
│      53392545_dem_6677.obj
│ ・・・略・・・
│      
├─metadata
│      obj_13100_2020_metadata_op.xml
│      
└─tran
        533925_tran_6677.obj
        ・・・略・・・

コンバートと変換

OBJ形式を利用するには、FBX形式の場合と同様に、プロジェクトの[Assets]フォルダにドラッグ&ドロップして登録します。OBJ形式ファイルも、読み込まれるときに100分の1のスケールになるため、[Inspector]の[Model]で、[Convert Units]のチェックを外し、[Apply]ボタンをクリックします(図9-14)。

図9-14 OBJ形式ファイルをドラッグ&ドロップし、[Convert Units]のチェックを外す

[Assets]に登録したファイルをシーンにドラッグ&ドロップします。そして[Position]を原点(0, 0, 0)に設定します。この状態でオブジェクトを確認すると、X軸方向から90度回転しています。そこでRotationを(-90, 0, 0)に設定して、FBX形式をインポートしたときと同じ向きにそろえます(図9-16)。

図9-15 シーンに配置した
図9-16 Rotationに(-90, 0, 0)を設定したところ

LOD2の場合の扱いも同じです。ただし、OBJ形式ファイルだけを[Assets]にドラッグ&ドロップしたものではテクスチャは反映されません。OBJ形式ファイルと同じフォルダにある「materials.mtl」およびテクスチャが格納されている「materials_textures」ディレクトリの中身も合わせて[Assets]にドラッグし、「9.7.1 テクスチャを反映する」の方法で説明するように、[Inspector]パネルの[Materials]タブの[Location]で[Use External Materials(Legacy)]を選択し、[Apply]をクリックすると、テクスチャが反映されます(図9-17、図9-18)。

図9-17 OBJ形式だけを登録した場合はテクスチャが反映されない
図9-18 materials.mtlやテクスチャ画像をドラッグ&ドロップし、適用したところ

9.3 _ 別のデータを重ねる

同じ平面直角座標系であれば、同様の方法でインポートすると、その位置が合致します。

9.3.1 _ 異なるメッシュコードの建築物を重ねる

例えば、隣接する代々木周辺の3次メッシュ「53394515」の建築物モデル(53394515_bldg_6677.fbx)をドラッグ&ドロップして追加し、原点に移動すると、図9-19のように隣に表示されます。

【メモ】

FBXファイルを読み込んだあとは、[Convert Units]のチェックは外しておきます(図9-10を参照)。以下も同様です。

図9-19 隣接地域をさらに追加したところ

9.3.2 _ 異なる種類のデータを重ねる

建築物のデータに加え、地形や橋梁などを重ねることもできます。例えば、地形のdem/533945_dem_6677.fbxを追加した例を図9-20に示します。

図9-20 地形を追加したところ

9.4 _ 対象の地域を原点に移動させる

これでシーン上に配置されました。しかし、カメラからは建物が見えていません。それは配置した建築物などが原点から遠い場所にあるのが原因です。

例えば、ここで利用している東京都23区のデータは平面直角座標系の9系で変換されており、原点は経度139度50分、緯度36度00分の位置です。この位置は千葉県の川間駅の近辺で、ここから東京都庁の建物はとても遠くにあります(図9-21)。

図9-21 東京都庁の建物はとても遠くにある

そこで、対象となる地域を原点付近に移動させます。

9.4.1 _ データをグループ化する

配置した複数のPLATEAUモデルデータをまとめて管理するために、いったんグループ化します。

[Hierarchy]パネルに配置されたPLATEAUのモデルデータを[Ctrl]キーを押しながら選択したら、[Ctrl]+[Shift]+[G]キーを押して、グループ化(1つのGameObjectにまとめる)します(図9-22)。新しいGameObjectが作成され、その中に読み込んだデータが含まれます(図9-23)。

図9-22 グループ化する
図9-23 新しいGameObjectが作成された

9.4.2 _ カメラ位置に対象データを移動させる

以下の手順で、グループ化したモデルデータをカメラの位置に移動させます。

[1] [Scene]パネルのタブの下にあるハンドルポジションを[Center]に変更します(図9-24)。

図9-24  Centerに変更

[2] [Hierarchy]パネルの[Main Camera]を選択して、[Shift]+[F]キーを押して、カメラの位置に中心点を移動します。

[3] グループ化したPLATEAUモデルのGame Objectを選択して、[Ctrl]+[Alt]+[F]キーを押して、モデルをカメラの位置(現在の画面の中心)に移動します。

これで、都市モデルがカメラの座標(原点座標)に移動します。

コラム:演算精度

ここでは、Unity上でモデルを移動させていますが、Unityが扱う座標値は32bitのFloatを使っており、PLATEAUのような大きな座標値を持つモデルを扱うと、数値精度の限界により計算結果に誤差が生じます。これにより、モデルの位置・形状などが不正確になる場合があります。表示だけを目的とする場合は大きな問題になりにくいですが、他のデータと位置合わせする際など、PLATEAUの3D都市モデルの正確性を活用したユースケースの場合は気をつける必要があります(FBXを100倍に拡大した場合、9.4.2 で指定している方法で都市モデルを移動しても、誤差が大きくなるため、正しくカメラ位置に移動しない場合があります)。

より正確な位置・形状を保ったままインポートしたい場合は、FME Formでの変換時に位置を調整するか、FBXを編集できる3DCGソフト(MayaやBlenderなど)を用いて元のデータを編集するようにしてください。

「PLATEAU SDK for Unity」を用いると、これらが自動処理され、誤差を最小化した状態で読み込めるようになる予定です。

また、カメラ位置などの任意の値でモデルを移動させた場合、他の地理情報と重ね合わせるために、当該モデルの使用する座標系の平面直角座標への変換に加えて、モデルを移動させたぶんのオフセットを考慮した平行移動を行う必要があることに注意してください(9.6.3で紹介されている『オフセットを計算する』方法を用いて、手動で平行移動させるのも有効です)。

9.5 _ 実行してテストをする

いったん実行して動作確認します。しかし今のままでは、空間内を移動することもできないため、読み込んだ都市モデルを確認できません。そこで、カメラ(ユーザー)に移動機能を追加して、テストできるようにします。

9.5.1 _ カメラに移動機能を追加する

[Hierarchy]パネルの[Main Camera]を選択し、[Inspector]パネルの一番下にある「Add Component」をクリックします。

検索用のテキストボックスに「Free」と入力すると[Free Camera]が現れるので、クリックして「Free Camera」コンポーネントを追加します(図9-25)。

図9-25 「Free Camera」コンポーネントを追加

9.5.2 _ 実行して確認する

いったんテスト実行をします。画面上の中央にある再生ボタン([▶])をクリックして実行してください。読み込んだ都市モデルが表示されています(図9-26)。[A][S][D][W]のキーでそれぞれ、左移動、後退、右移動、前進ができます。[Shift]キーを押しながら各キーを押すと、より速く移動できます。

図9-26 読み込んだ都市モデルが表示

また、マウスの右ボタンを押しながらドラッグすると、視点の方向を変えられます(図9-27)。

図9-27 視点の方向を自由に変更できる

確認が終わったら、再生ボタン([▶])をクリックしてテスト実行を終了してください。

【文】

大澤文孝

【監修】

ユニティ・テクノロジーズ・ジャパン株式会社