Streetscape Geometry API は、シーン内の地形、建物、その他の構造物のジオメトリを提供します。ジオメトリは、ヒットテスト API を介してオクルージョン、レンダリング、AR コンテンツの配置に使用できます。ストリートビュー ジオメトリ データは、Google ストリートビューの画像を通じて取得されます。
サンプルを試す
geospatial_java サンプルアプリは、ストリートビュー ジオメトリを取得してレンダリングする方法を示しています。
Geospatial API を設定する
ストリートビュー ジオメトリを使用するには、プロジェクトに Geospatial API を設定する必要があります。Geospatial API の有効化の手順に沿って、Geospatial API を設定します。
ストリートビュー ジオメトリを有効にする
Geospatial API は、GeospatialMode
が GeospatialMode.ENABLED
に、StreetscapeGeometryMode
が StreetscapeGeometryMode.ENABLED
に設定されている場合、ストリートビュー ジオメトリ データを取得します。
Java
Config config = session.getConfig(); // Streetscape Geometry requires the Geospatial API to be enabled. config.setGeospatialMode(Config.GeospatialMode.ENABLED); // Enable Streetscape Geometry. config.setStreetscapeGeometryMode(Config.StreetscapeGeometryMode.ENABLED); session.configure(config);
Kotlin
session.configure( session.config.apply { // Streetscape Geometry requires the Geospatial API to be enabled. geospatialMode = Config.GeospatialMode.ENABLED // Enable Streetscape Geometry. streetscapeGeometryMode = Config.StreetscapeGeometryMode.ENABLED } )
ARCore セッションでストリートビュー ジオメトリを取得する
結果をフィルタするには、Session.getAllTrackables()
、StreetscapeGeometry.class
を使用します。
Java
session.getAllTrackables(StreetscapeGeometry.class);
Kotlin
session.getAllTrackables(StreetscapeGeometry::class.java)
StreetscapeGeometry
について
StreetscapeGeometry
には、建物に関する情報が含まれています。
-
StreetscapeGeometry.getType()
StreetscapeGeometry を地形または建物として識別します。 -
StreetscapeGeometry.getMesh()
この地形または建物に対応するポリゴンMesh
を取得します。 -
StreetscapeGeometry.getMeshPose()
ジオメトリの原点を記述します。Mesh
内のすべてのポイントは、StreetscapeGeometry.getMeshPose()
によって変換する必要があります。 -
StreetscapeGeometry.getQuality()
メッシュデータの品質を提供します。詳細レベルは、CityGML 2.0 標準で説明されています。
ビルディング LOD 1
StreetscapeGeometry.Quality.BUILDING_LOD_1
は、平らな上面に押し出された建物のフットプリントで構成されています。建物の高さは正確でない可能性があります。
ビルディング LOD 2
StreetscapeGeometry.Quality.BUILDING_LOD_2
は、より忠実度の高いジオメトリになります。メッシュの壁と屋根が建物の形状に近くなります。煙突や屋根の通気口などの小さな対象物がメッシュの外側に突き出ていることもあります。
Mesh
について
Mesh
は、ストリートビュー ジオメトリの表面再構成を表すポリゴン メッシュです。
各 Mesh
には、頂点バッファとインデックス バッファが含まれています。
Mesh.getVertexListSize()
このメッシュ内の頂点の数を取得します。Mesh.getVertexList()
メッシュの頂点の連結位置を、StreetscapeGeometry.getMeshPose()
を基準とした座標で取得します。Mesh.getIndexListSize()
このメッシュ内のインデックスの数を取得します。Mesh.getIndexList()
顔を構成する頂点のインデックスを取得します。
AR コンテンツを StreetscapeGeometry
にアタッチする
AR コンテンツをストリートビュー ジオメトリに追加するには、次の 2 つの方法があります。
- [Geospatial Depth] を有効にして、Depth ヒットテストを使用します。これが推奨される簡単な方法です。
Trackable.createAnchor()
を使用して、StreetscapeGeometry
にアタッチされた特定のポーズにアンカーを作成します。このアンカーは親のStreetscapeGeometry
からトラッキング ステータスを継承します。
StreetscapeGeometry
に対してヒットテストを行う
Frame.hitTest()
を使用すると、ストリートビュー ジオメトリに対するヒットテストを行うことができます。交差が見つかった場合、HitResult
にはヒットの場所に関するポーズ情報と、ヒットした StreetscapeGeometry
への参照が含まれます。このストリートビュー ジオメトリを Trackable.createAnchor()
に渡して、それに接続するアンカーを作成できます。
Java
for (HitResult hit : frame.hitTest(singleTapEvent)) { if (hit.getTrackable() instanceof StreetscapeGeometry) { Pose hitPose = hit.getHitPose(); hit.getTrackable().createAnchor(hitPose); } }
Kotlin
for (hit in frame.hitTest(singleTapEvent)) { if (hit.trackable is StreetscapeGeometry) { val hitPose = hit.hitPose hit.trackable.createAnchor(hitPose) } }
Geospatial Depth を有効にする
Geospatial Depth は、ストリートビュー ジオメトリとローカル センサー入力を組み合わせて、奥行きデータを強化します。Geospatial Depth を有効にすると、出力深度と未加工の奥行きの画像が変更され、ローカルで観測された深度に加えて、ラスター化されたストリートビュー ジオメトリが含まれるようになります。これにより、奥行きを使用したポーズの精度が向上する可能性があります。