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

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

サンプルを試す

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

Geospatial API を設定する

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

街並みのジオメトリを有効にする

Geospatial API は、GARGeospatialMode が GARGeospatialModeEnabled に設定され、GARStreetscapeGeometryMode が GARStreetscapeGeometryModeEnabled に設定されている場合に、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];