iOS で周囲の建物や地形を使用する

Streetscape Geometry API は、シーン内の地形、建物、その他の構造物のジオメトリを提供します。ジオメトリは、ヒットテスト API を介してオクルージョン、レンダリング、AR コンテンツの配置に使用できます。ストリートビュー ジオメトリ データは、Google ストリートビューの画像を通じて取得されます。

サンプルを試す

GeospatialExample アプリは、ストリートビュー ジオメトリを取得してレンダリングする方法を示しています。

Geospatial API を設定する

ストリートビュー ジオメトリを使用するには、プロジェクトに Geospatial API を設定する必要があります。Geospatial API の有効化の手順に沿って、Geospatial API を設定します。

ストリートビュー ジオメトリを有効にする

Geospatial API は、GARGeospatialModeGARGeospatialModeEnabled に、GARStreetscapeGeometryModeGARStreetscapeGeometryModeEnabled に設定されている場合、ストリートビュー ジオメトリ データを取得します。

GARSessionConfiguration *configuration = [[GARSessionConfiguration alloc] init];
configuration.geospatialMode = GARGeospatialModeEnabled;
configuration.streetscapeGeometryMode = GARStreetscapeGeometryModeEnabled;
[garSession setConfiguration:configuration error:&error];

ARCore セッションでストリートビュー ジオメトリを取得する

すべての GARStreetscapeGeometry オブジェクトを取得するには、GARFrame.streetscapeGeometries を使用します。

GARStreetscapeGeometry について

GARStreetscapeGeometry には、建物に関する情報が含まれています。

ビルディング LOD 1

GARStreetscapeGeometryQualityBuildingLOD_1 は、平らな上面に押し出された建物のフットプリントで構成されています。建物の高さは正確でない可能性があります。

ビルディング LOD 2

GARStreetscapeGeometryQualityBuildingLOD_2 は、より忠実度の高いジオメトリになります。メッシュの壁と屋根が建物の形状に近くなります。煙突や屋根の通気口などの小さな対象物がメッシュの外側に突き出ていることもあります。

GARMesh について

GARMesh は、ストリートビュー ジオメトリの表面再構成を表すポリゴン メッシュです。 各 GARMesh には、頂点バッファとインデックス バッファが含まれています。

AR コンテンツを GARStreetscapeGeometry にアタッチする

GARSesssion.createAnchorOnStreetscapeGeometry:transform:error: を使用して、GARStreetscapeGeometry.meshTransform の近くにある特定のポーズにアンカーを作成します。このアンカーは親の GARStreetscapeGeometry からトラッキング ステータスを継承します。

GARStreetscapeGeometry に対してヒットテストを行う

GARSession.raycastStreetscapeGeometry:direction:error: を使用すると、ストリートビュー ジオメトリに対するヒットテストを行うことができます。交差が見つかった場合、GARStreetscapeGeometryRaycastResult にはヒットの場所に関するポーズ情報と、ヒットした GARStreetscapeGeometry への参照が含まれます。このストリートビュー ジオメトリを GARSesssion.createAnchorOnStreetscapeGeometry:transform:error: に渡して、それに接続するアンカーを作成できます。

NSArray<GARStreetscapeGeometryRaycastResult *> *results =
    [session raycastStreetscapeGeometry:arRaycastQuery.origin
                              direction:arRaycastQuery.direction
                                  error:&error];
[session createAnchorOnStreetscapeGeometry:results[0].streetscapeGeometry
                                 transform:results[0].worldTransform
                                     error:&error];