iOS에서 주변 건물과 지형 사용

Streetscape Geometry API는 장면의 지형지물, 건물 또는 기타 구조물의 도형을 제공합니다. 이 도형은 히트 테스트 API를 통한 가림, 렌더링 또는 AR 콘텐츠 배치에 사용할 수 있습니다. 거리 풍경 형태 데이터는 Google 스트리트 뷰 이미지를 통해 얻을 수 있습니다.

샘플 사용해 보기

GeospatialExample 앱에서는 거리 풍경 도형을 가져오고 렌더링하는 방법을 보여줍니다.

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에는 정점 버퍼와 색인 버퍼가 포함됩니다.

GARStreetscapeGeometry에 AR 콘텐츠 첨부

GARSesssion.createAnchorOnStreetscapeGeometry:transform:error:를 사용하여 GARStreetscapeGeometry.meshTransform 근처의 지정된 포즈에 앵커를 만듭니다. 이 앵커는 상위 GARStreetscapeGeometry에서 추적 상태를 상속합니다.

GARStreetscapeGeometry에 대해 히트 테스트를 실행합니다.

GARSession.raycastStreetscapeGeometry:direction:error:를 사용하여 Streetscape Geometry에 대해 히트 테스트를 실행할 수 있습니다. 교차점이 발견되면 GARStreetscapeGeometryRaycastResult에는 충돌 위치에 관한 포즈 정보와 충돌한 GARStreetscapeGeometry에 대한 참조가 포함됩니다. 이 Streetscape Geometry는 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];