3次元の地理情報データをストリーミングするための規格である 3D Tiles の概要を説明します。詳しい話はいくらでもありますが、ここでは雰囲気をつかむことを目的とします。
(これは、2023年9月末に社内用に書いたメモ書きをほぼそのまま転載したものです)
2Dタイルおさらい
2Dの地図タイルは既にご存知とします。
おなじみのXYZタイル (2D)
MapTiler 社のこのページが分かりやすいです:
技術的にいえば「四分木(Quad-tree)」というツリー構造です:
特徴:
- 地球全体を表現できる
- ズームインして詳細を見れる
- 必要な部分だけ随時ダウンロードすれば済む(ストリーミングできる)
これらの特徴は2Dのタイルでも3Dタイルでも同じです。
3Dもタイル化したい
Cesium が策定した仕様「3D Tiles」。今では OGC (Open Geospatial Consortium) のオープン標準になっています。
3D Tilesももちろんツリー構造ですが、かならずしもXYZタイル(四分木)のような規則的なツリーでなくていいのが特徴です。つまり空間をツリー構造に分割していく方法はかなり自由です。
3D Tiles 1.0 と 3D Tiles 1.1 があり、いずれもOGCのオープン標準になっています。仕様書: 3D Tiles Specification
3D Tilesで表現できるもの
Cesium のデモをみると、何がどこまでできるのかがわかりやすいです。色々なデモがあります。
- 3Dメッシュ: 建物、地形、etc.
- 点群
- 3Dインスタンス: 同じ物体(例:電柱)を大量に配置 (GPU Instancing)
地物や頂点などにメタデータを付与することもできます。
Google Photorealistic 3D Tiles
Google Photorealistic 3D Tiles も「3D Tiles 1.0」(2023年9月時点) として利用できます。
地上の人工物だけでなく地形もいっしょくたに表現されています。Cesium上に表示するときは、Cesiumが提供する地形は非表示にしましょう。
// Google Photorealistic 3D Tiles は地面もいっしょに含んでいるため、
// Cesiumが提供する地球は表示しなくてよい。
globe: false;
各タイルがどうなっているかを、デバッグ表示でみてみます。
ちなみに、どのタイルもファイルサイズは 10〜100 KB程度になっています。
3D Tiles (1.0) のタイル分割
2Dなタイルと似ている点
- ツリー構造なのは同じ。
- ツリーの子にいくほど詳細度が上がるのも同じ。HLOD = Hierarchical Level of Detail
2Dなタイルと異なる点
-
空間を分割していく方法がまったく自由。 各自で自由に決める。
- 直方体、球、リージョン(今回は触れない)で自由に分割していく。
- もちろん単純な4分割や8分割を繰り返していってもいい。
- 県 → 市 → 町字 みたいな分割でもいい。
- なんでもいい。
- 注)3D Tiles 1.1 には “implicit tiling” もある(あとでさらっと言及)。
-
タイルの境界が重なり合っていてもいい。
- タイルのバウンディングボリュームに重複があってもいい。公式デモなどで BoundingVolume を表示してみればわかる: https://sandcastle.cesium.com/?src=3D Tiles Inspector.html&label=3D Tiles
- 詳細度を上げていく(ツリーの子をたどる)際の方法として refine:
REPLACE
と refine:ADD
が選べる-
REPLACE
→ 子タイルの内容で親タイルの内容を入れかえる方式 (→ Photorealistic 3D Tiles) -
ADD
→ 子タイルの内容を親タイルの内容に追加していく方式 (→ OSM建物デモ) - これらはツリーの途中で切り替えることも可能
-
ツリーの組み方の主なルールは以下の2つ。あとは自由です:
- 子のコンテンツが、親のバウンディングボリュームを超えないこと
- 子にいくほどジオメトリの誤差 (
geometricError
) が小さくなること
少しだけ詳しいタイルツリーの構造
Google Photorealistic 3D Tiles の実際のタイルツリーをみてみると次のようになっています:
- タイルのツリー構造(=タイルセット)は JSON で記述されている。
- ツリーの途中で別のタイルセットファイルを参照できる(例えば地球規模のタイルセットの場合、1つの超巨大なJSONファイルで表現するのはまずい or 不可能)。
- 各タイルにそのタイルのジオメトリ誤差 (
geometricError
) が記載されている。- 表示側は、その誤差では不十分と判断したら、さらに子をたどる
3D Tiles 1.1 の新機能
3D Tiles 1.1(かつて 3D Tiles Next と言われていたもの)。
主には:
- 3Dデータを すべてglTF で表すようになった(1.0 ではglTF の利用は拡張機能だった)
- いままでのデータ形式 (.b3dm, .i3dm, .pnts, .cmpt) はすべて deprecated になった。
- “Implicit Tiling”(暗黙的タイリング)も使えるようになった
- XYZタイルのような「4分木 (Quad-tree)」ないし「8分木 (Octree)」で、効率的に空間分割できる。具体的な実現については複雑なのでここでは触れない。
詳しく知りたい方は
仕様書・サンプルが充実しています。
3D Tiles 1.0 & 1.1
- 3D Tiles 1.1 Specification: https://docs.ogc.org/cs/22-025r4/22-025r4.html
- GitHub: https://github.com/CesiumGS/3d-tiles
- Sample Tilesets: https://github.com/CesiumGS/3d-tiles-samples
glTF 2.0
- glTF 2.0 Specification: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html
- GitHub: https://github.com/KhronosGroup/glTF
- Sample Assets:
GISのための glTF 拡張
- https://github.com/CesiumGS/3d-tiles-samples/blob/main/README.md
-
EXT_mesh_features
-
EXT_structural_metadata
標準的な圧縮形式・技法
Cesiumがサポートしているもの:
- Draco
- Meshopt
- KTX2
- など
3D Tiles, 3D Tiles Next (1.1) の デモ色々