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

Streetscape Geometry API는 장면에 있는 지형, 건물 또는 기타 구조물의 도형을 제공합니다. 이 도형은 Hit Test API를 통해 오클루전, 렌더링 또는 AR 콘텐츠 배치에 사용할 수 있습니다. 스트리트스케이프 도형 데이터는 Google 스트리트 뷰 이미지를 통해 가져옵니다.

샘플 사용해 보기

지리정보 샘플 앱은 거리 풍경 형태를 가져오고 렌더링하는 방법을 보여줍니다.

Geospatial API 설정

Streetscape Geometry를 사용하려면 프로젝트에서 Geospatial API를 설정해야 합니다. Geospatial API 사용 설정 안내에 따라 Geospatial API를 설정하세요.

거리 풍경 형태 사용 설정

Geospatial API는 GeospatialModeGeospatialMode.Enabled로 설정되고 StreetscapeGeometryModeStreetscapeGeometryMode.Enabled로 설정된 경우 Streetscape Geometry 데이터를 가져옵니다.

ARCore 세션에서 Streetscape Geometry 가져오기

ARStreetscapeGeometryManager 구성요소를 GameObject에 추가합니다. 날짜 거리 풍경 형태가 추가, 업데이트 또는 삭제되면 ARStreetscapeGeometryManager.StreetscapeGeometriesChanged 이벤트가 트리거됩니다.

public Material streetscapeGeometryMaterial;

List<ARStreetscapeGeometry> _addedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _updatedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _removedStreetscapeGeometries = new List<ARStreetscapeGeometry>();

public void OnEnable()
{
    StreetscapeGeometryManager.StreetscapeGeometriesChanged +=
        GetStreetscapeGeometry;
}

public void Update() {
  foreach (ARStreetscapeGeometry streetscapegeometry in _addedStreetscapeGeometries)
  {
    GameObject renderObject = new GameObject(
       "StreetscapeGeometryMesh", typeof(MeshFilter), typeof(MeshRenderer));

    if (renderObject)
    {
        renderObject.transform.position = streetscapegeometry.pose.position;
        renderObject.transform.rotation = streetscapegeometry.pose.rotation;
        renderObject.GetComponent<MeshFilter>().mesh = streetscapegeometry.mesh;
        renderObject.GetComponent<MeshRenderer>().material = streetscapeGeometryMaterial;
    }
  }
}

public void OnDisable()
{
    StreetscapeGeometryManager.StreetscapeGeometriesChanged -=
        GetStreetscapeGeometry;
}

private void GetStreetscapeGeometry(ARStreetscapeGeometriesChangedEventArgs eventArgs)
{
    _addedStreetscapeGeometries = eventArgs.Added;
    _updatedStreetscapeGeometries = eventArgs.Updated;
    _removedStreetscapeGeometries = eventArgs.Removed;
}

ARStreetscapeGeometry 이해하기

ARStreetscapeGeometry에는 건물에 대한 정보가 포함되어 있습니다.

LOD 1 빌드

BuildingLOD1는 평평한 상단까지 위쪽으로 돌출된 건물 접지면으로 구성됩니다. 건물 높이가 정확하지 않을 수 있습니다.

LOD 2 빌드

BuildingLOD2에는 도형의 충실도가 높아집니다. 메시 벽과 지붕이 건물의 모양과 더 잘 일치합니다. 굴뚝이나 지붕 환기구와 같은 작은 지형지물이 여전히 메시 바깥쪽을 뚫을 수 있습니다.

Mesh 이해하기

Mesh는 스트리트 풍경 도형의 표면 재구성을 나타내는 다각형 메시입니다. MeshMeshRenderer을 참고하세요. 노멀은 기본적으로 계산되지 않습니다. Mesh.RecalculateNormals()를 참조하여 계산합니다.

ARStreetscapeGeometry에 AR 콘텐츠 첨부

ARAnchorManager.AddAnchor()를 사용하여 ARStreetscapeGeometry.mesh의 꼭짓점 근처에 있는 지정된 포즈에 앵커를 만듭니다. 이 앵커는 상위 ARStreetscapeGeometry에서 추적 상태를 상속받습니다.

ARStreetscapeGeometry에 대해 Hit Test 실행

ARRaycastManagerExtensions.RaycastStreetscapeGeometry를 사용하여 Streetscape Geometry에 대한 히트 테스트를 진행할 수 있습니다. 교차점이 있으면 XRRaycastHit에 적중 위치에 대한 포즈 정보와 적중된 ARStreetscapeGeometry에 대한 참조가 포함됩니다. 이 거리 풍경 도형을 ARAnchorManager.AddAnchor()에 전달하여 연결된 앵커를 만들 수 있습니다.

Vector2 screenTapPosition = Input.GetTouch(0).position;
List<XRRaycastHit> hitResults = new List<XRRaycastHit>();
if (RaycastManager.RaycastStreetscapeGeometry(screenTapPosition, ref hitResults)){
  ARStreetscapeGeometry streetscapegeometry =
      StreetscapeGeometryManager.GetStreetscapeGeometry(hitResults[0].trackableId);
  if (streetscapegeometry != null)
  {
      ARAnchor anchor = StreetscapeGeometryManager.AttachAnchor(streetscapegeometry, hitResults[0].pose);
  }
}

Geospatial Depth 사용 설정

Geospatial Depth는 거리 풍경 형태를 결합합니다. 로컬 센서 입력으로 심도 데이터를 개선할 수 있습니다. Geospatial Depth가 사용 설정되면 출력 깊이와 원본 깊이 이미지가 로컬에서 관찰된 깊이 외에도 래스터화된 Streetscape Geometry를 포함하도록 수정됩니다. 이렇게 하면 심도를 사용하는 포즈의 정확성이 개선될 수 있습니다.