3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

3D Tiles形式で納品を求められたので勉強してみた

Last updated at Posted at 2025-02-17

image.png

都市ARのお仕事をしていて、「3D Tiles形式で納品してください」と言われることがあったので、あらためて勉強してみました。
せっかくなので備忘録として残します。

3D Tilesとは

image.png

3D Tilesとは、3D地理空間データの配信と可視化のために設計されたオープン規格です。

都市全体や地形データなどのような大規模な3Dデータをストリーミング表示できます。

ズームイン・アウトに滑らかに対応するため、階層的にデータを管理しています。(LOD: Level of Detail)

形状データは glTF をベースとしたフォーマットを採用しつつ、地理空間特有のメタデータや点群データ(LiDARスキャンなど)も扱います。

主な構成ファイル

以下のようなファイルで構成されます。

  • tileset.json : 3D Tilesの構造を定義
  • .b3dm(Batched 3D Model): 複数の3Dモデルをバッチ処理してまとめたファイル(個別の位置・属性を持つ)
  • .i3dm(Instanced 3D Model): 同じ3Dモデルを複数の異なる位置にインスタンス化するためのファイル
  • .pnts(ポイントクラウド): 点群データ

追記

v1.1ではb3dm, i3dm, pntsが非推奨となり、直接glTFを参照するようになったみたいです。
https://github.com/CesiumGS/3d-tiles/releases/tag/1.1
本記事の内容はメモとしてこのまま残します。

b3dm : Batched 3D Model

b3dm は glTF を含みつつ、メタデータを追加して、複数の3Dモデルをバッチ処理するファイル形式 です。
メタデータとは 建物のID、分類情報、カスタム属性(高さ、用途など) のことです。
b3dmは主に3D都市モデル(建物、橋、道路等)を格納します。

i3dm : Instanced 3D Model

i3dm は glTF を参照し、大量の同じ 3D モデルを軽量にインスタンス化して配置するためのファイル形式 です。
i3dm は、街路樹や街灯、電柱などのように、同じ3Dモデルを大量に配置する場合に使用されます。

pnts : Point Cloud Tile

pntsは点群データです。
メッシュ化前のLiDARスキャンデータをとりあえず表示したいとき等に利用します。

tileset.json

tileset.jsonは3D Tilesの中核のファイルです。
メッシュファイルや点群ファイルへの参照を持っています。

{
  "asset": { "version": "1.0" },
  "geometricError": 50.0,
  "root": {
    "boundingVolume": { "box": [0, 0, 0, 500, 500, 500] },
    "geometricError": 25.0,
    "children": [
      {
        "boundingVolume": { "box": [0, 0, 0, 100, 100, 100] },
        "geometricError": 10.0,
        "content": { "uri": "building.b3dm" }
      },
      {
        "boundingVolume": { "box": [200, 0, 0, 50, 50, 50] },
        "geometricError": 10.0,
        "content": { "uri": "tree.i3dm" }
      },
      {
        "boundingVolume": { "box": [-200, 0, 0, 50, 50, 50] },
        "geometricError": 10.0,
        "content": { "uri": "terrain.glb" }
      },
      {
        "boundingVolume": { "box": [0, 0, -100, 200, 200, 200] },
        "geometricError": 10.0,
        "content": { "uri": "lidar.pnts" }
      }
    ]
  }
} 

boundingVolumeとは

image.png

boundingVolume は、3D Tiles において 各タイルが占める空間を定義し、最適な描画制御や LOD(詳細度)の切り替えを行うための基準 になります。
ある意味、3D Tilesの肝となる項目です。

Bouding region

boundingVolume.region は、緯度、経度、高度の座標でタイルの範囲を定義する方法です。

緯度と経度は ラジアン で記載する必要があります。これは、地図座標を直交座標に変換する際、内部計算が通常ラジアンで行われるためです。なお、高度はメートル単位です。

"boundingVolume": {
  "region": [west, south, east, north, minimum height, maximum height]
}

boundingVolume の種類

region 以外にも以下のような種類があります。

種類 イメージ図 役割 用途の例
region image.png 緯度・経度・高さで定義する範囲 地形データ、航空写真、マップ
box image.png 軸に沿った直方体(AABB) 建物、都市モデル
sphere image.png 球体のバウンディングボリューム 点群データ、衛星データ、球形オブジェクト

Viewer

3D Tiles形式のデータを閲覧できるビューワーについて調べてみました。

Cesium ion

手軽に 3D Tiles を視聴・管理できるクラウドビューワーが Cesium ion です。

My Assetsのページにアップロードすれば、それだけで視聴できます。

CesiumJS

CesiumJS は、WebGL を使用した オープンソースの 3D Tiles ビューワーおよび GISレンダリングエンジン です。
3D Tiles の公式ビューワーとして利用でき、ブラウザ上で .b3dm や .i3dm などを直接表示できます。
Cesium ionのようなクラウドサービスにデータをアップロードするのを避けたい場合は、CesiumJSを使ってローカルにビューワー環境を構築することも可能です。

Converter

3D Tilesへ変換できるソフトについて調べてみました。

Cesium ion

Cesium ionは、ビューワーとしてだけでなく、コンバーターとしても利用できます。

My Assetsページで glTF をアップロードすれば、自動で3D Tilesに変換してくれます。
プログラム不要で変換できるため、最も手軽な方法です。

3d-tiles-tools

Cesium 公式の 3d-tiles-tools を使用すると、glTF を .b3dm.i3dm に変換、3D Tiles のデータセットを作成できます。
ローカル環境で変換できるため、クラウドを使いたくない場合に適しています。

Node.jsベースなので、Qiita読者には馴染みやすいと思います。

objTo3d-tiles

objTo3d-tiles は、OBJ形式のメッシュを直接 .b3dm.i3dm に変換してくれるツール です。

こちらもNode.jsベースです。
サードパーティー製ですが、私が試しに使ってみた範囲では、特に問題はありませんでした。

さいごに

本記事作成にあたり、以下のページを参考にさせていただきました。

ありがとうございました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?