Streetscape Geometry API는 장면의 지형지물, 건물 또는 기타 구조물의 도형을 제공합니다. 이 도형은 히트 테스트 API를 통한 가림, 렌더링 또는 AR 콘텐츠 배치에 사용할 수 있습니다. 스트리트스케이프 도형 데이터는 Google 스트리트 뷰 이미지를 통해 가져옵니다.
샘플 사용해 보기
Geospatial 샘플 앱에서는 거리 풍경 도형을 가져오고 렌더링하는 방법을 보여줍니다.
Geospatial API 설정
Streetscape Geometry를 사용하려면 프로젝트에서 Geospatial API를 설정해야 합니다. Geospatial API 사용 설정 안내에 따라 Geospatial API를 설정하세요.
거리 풍경 도형 사용 설정
Geospatial API는 GeospatialMode
가 GeospatialMode.Enabled
로 설정되고 StreetscapeGeometryMode
가 StreetscapeGeometryMode.Enabled
로 설정된 경우 Streetscape Geometry 데이터를 가져옵니다.
ARCore 세션에서 Streetscape Geometry 가져오기
GameObject
에 ARStreetscapeGeometryManager
구성요소를 추가합니다. Streetscape 도형이 추가, 업데이트 또는 삭제되면 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
에는 건물에 대한 정보가 포함되어 있습니다.
-
ARStreetscapeGeometry.streetscapeGeometryType
StreetscapeGeometry를 지형지물 또는 건물로 식별합니다. -
ARStreetscapeGeometry.mesh
이 지형지물 또는 건물에 해당하는 다각형Mesh
을 가져옵니다. -
ARStreetscapeGeometry.quality
메시 데이터의 품질을 제공합니다. 세부 수준은 CityGML 2.0 표준에 설명되어 있습니다.
건물 LOD 1
BuildingLOD1
는 평평한 상단까지 위쪽으로 돌출된 건물 접지면으로 구성됩니다. 건물 높이가 부정확할 수 있습니다.
건물 LOD 2
BuildingLOD2
는 더 높은 충실도 도형을 갖습니다. 메시 벽과 지붕이 건물의 모양과 더 잘 일치합니다. 굴뚝이나 지붕 통풍구와 같은 작은 지형지물은 메시지 외부에 표시될 수 있습니다.
Mesh
이해하기
Mesh
는 거리 풍경 도형의 표면 재구성에 해당하는 다각형 메시입니다.
Mesh
및 MeshRenderer
를 참고하세요. 노멀은 기본적으로 계산되지 않습니다. 노멀을 계산하려면 Mesh.RecalculateNormals()
를 참고하세요.
ARStreetscapeGeometry
에 AR 콘텐츠 첨부
ARAnchorManager.AddAnchor()
를 사용하여 ARStreetscapeGeometry.mesh
의 정점 근처에 지정된 포즈로 앵커를 만듭니다. 이 앵커는 상위 ARStreetscapeGeometry
에서 추적 상태를 상속받습니다.
ARStreetscapeGeometry
에 대해 Hit Test 실행
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
를 사용하여 Streetscape Geometry에 대해 히트 테스트를 실행할 수 있습니다. 교차점이 발견되면 XRRaycastHit
에는 충돌 위치에 관한 포즈 정보와 충돌한 ARStreetscapeGeometry
에 대한 참조가 포함됩니다. 이 Streetscape Geometry는 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는 Streetscape Geometry와 로컬 센서 입력을 결합하여 깊이 데이터를 향상시킵니다. Geospatial Depth가 사용 설정되면 로컬에서 관찰된 깊이 외에 래스터화된 거리 풍경 도형을 포함하도록 출력 깊이 및 원시 깊이 이미지가 수정됩니다. 이렇게 하면 깊이를 사용하는 포즈의 정확성이 향상될 수 있습니다.