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

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

サンプルを試す

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

Geospatial API を設定する

Streetscape Geometry を使用するには、プロジェクトに Geospatial API を設定する必要があります。 Geospatial API を有効にするの手順に沿って、Geospatial API を設定します。

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

Geospatial API は、GARGeospatialModeGARGeospatialModeEnabled に設定され、GARStreetscapeGeometryModeGARStreetscapeGeometryModeEnabled に設定されている場合に、Streetscape Geometry データを取得します。

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

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

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

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];