Unity에서 주변 건물과 지형 사용
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
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 세션에서 거리 풍경 도형 가져오기
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
에는 건물에 관한 정보가 포함됩니다.
건물 LOD 1
BuildingLOD1
는 평평한 상단으로 위쪽으로 돌출된 건물 풋프린트로 구성됩니다. 건물 높이가 부정확할 수 있습니다.

건물 LOD 2
BuildingLOD2
는 더 높은 충실도의 도형을 갖습니다. 메시 벽과 지붕은 건물의 모양에 더 근접합니다. 굴뚝이나 지붕 통풍구와 같은 작은 지형지물은 메시지 외부에 표시될 수 있습니다.

Mesh
는 거리 풍경 도형의 표면 재구성에 해당하는 다각형 메시입니다.
Mesh
및 MeshRenderer
를 참고하세요. 법선은 기본적으로 계산되지 않습니다. 법선을 계산하려면 Mesh.RecalculateNormals()
를 참고하세요.
ARAnchorManager.AddAnchor()
를 사용하여
ARStreetscapeGeometry.mesh
의 정점 근처에 지정된 포즈로 앵커를 만듭니다. 이 앵커는 상위
ARStreetscapeGeometry
에서 추적 상태를 상속합니다.
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가 사용 설정되면 로컬에서 관찰된 깊이 외에 래스터화된 거리 풍경 도형을 포함하도록 출력 깊이 및 원시 깊이 이미지가 수정됩니다.
이렇게 하면 깊이를 사용하는 포즈의 정확성이 향상될 수 있습니다.
달리 명시되지 않는 한 이 페이지의 콘텐츠에는 Creative Commons Attribution 4.0 라이선스에 따라 라이선스가 부여되며, 코드 샘플에는 Apache 2.0 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 Google Developers 사이트 정책을 참조하세요. 자바는 Oracle 및/또는 Oracle 계열사의 등록 상표입니다.
최종 업데이트: 2025-08-13(UTC)
[null,null,["최종 업데이트: 2025-08-13(UTC)"],[[["\u003cp\u003eThe Streetscape Geometry APIs utilize Google Street View data to provide 3D geometry of terrain and buildings for use in AR experiences.\u003c/p\u003e\n"],["\u003cp\u003eDevelopers can obtain and render Streetscape Geometries by enabling the Geospatial and Streetscape Geometry modes within the Geospatial API.\u003c/p\u003e\n"],["\u003cp\u003e\u003ccode\u003eARStreetscapeGeometry\u003c/code\u003e objects contain mesh data, geometry type (terrain or building), and quality level, enabling developers to interact with the geometry.\u003c/p\u003e\n"],["\u003cp\u003eAR content can be attached to or hit-tested against Streetscape Geometry using provided methods for anchoring and raycasting.\u003c/p\u003e\n"],["\u003cp\u003eEnabling Geospatial Depth can enhance depth data by combining Streetscape Geometry with local sensor input for improved accuracy.\u003c/p\u003e\n"]]],["Streetscape Geometry APIs provide terrain and building geometry from Google Street View imagery for AR applications. To use it, enable the Geospatial API and set both `GeospatialMode` and `StreetscapeGeometryMode` to `Enabled`. An `ARStreetscapeGeometryManager` component obtains the data, triggering an event when geometries change. The data, provided as meshes, can be used for occlusion, rendering and placing AR content with anchors. Geometry quality varies from basic (`BuildingLOD1`) to high fidelity (`BuildingLOD2`). Hit-tests against geometry can return the point of contact. Geospatial Depth combines sensor input with Streetscape geometry to improve depth data.\n"],null,["# Use buildings and terrain around you on Unity\n\nThe Streetscape Geometry APIs provide the geometry of terrain, buildings, or other structures in a scene. The geometry can be used for occlusion, rendering, or placing AR content via hit-test APIs. Streetscape Geometry data is obtained through Google Street View imagery.\n\nTry the sample\n--------------\n\nThe [Geospatial sample app](https://github.com/google-ar/arcore-unity-extensions/tree/master/Samples~/Geospatial) demonstrates how to obtain and render Streetscape Geometries.\n\nSet up the Geospatial API\n-------------------------\n\nTo use Streetscape Geometry, you'll need to set up the Geospatial API in your project.\nFollow instructions on [Enabling the Geospatial API](/ar/develop/unity-arf/geospatial/enable) to set up the Geospatial API.\n\nEnable Streetscape Geometry\n---------------------------\n\nThe Geospatial API obtains Streetscape Geometry data when the [`GeospatialMode`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#geospatialmode) is set to [`GeospatialMode.Enabled`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#geospatialmode_enabled) and [`StreetscapeGeometryMode`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#streetscapegeometrymode) is set to [`StreetscapeGeometryMode.Enabled`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#streetscapegeometrymode_enabled).\n\nObtain Streetscape Geometry in an ARCore session\n------------------------------------------------\n\nAdd an [`ARStreetscapeGeometryManager`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometryManager) component to a `GameObject`. When Streetscape Geometries are added, updated, or removed, the [`ARStreetscapeGeometryManager.StreetscapeGeometriesChanged`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometryManager#streetscapegeometrieschanged) event is triggered.\n\n\u003cbr /\u003e\n\n public Material streetscapeGeometryMaterial;\n\n List\u003cARStreetscapeGeometry\u003e _addedStreetscapeGeometries = new List\u003cARStreetscapeGeometry\u003e();\n List\u003cARStreetscapeGeometry\u003e _updatedStreetscapeGeometries = new List\u003cARStreetscapeGeometry\u003e();\n List\u003cARStreetscapeGeometry\u003e _removedStreetscapeGeometries = new List\u003cARStreetscapeGeometry\u003e();\n\n public void OnEnable()\n {\n StreetscapeGeometryManager.StreetscapeGeometriesChanged +=\n GetStreetscapeGeometry;\n }\n\n public void Update() {\n foreach (ARStreetscapeGeometry streetscapegeometry in _addedStreetscapeGeometries)\n {\n GameObject renderObject = new GameObject(\n \"StreetscapeGeometryMesh\", typeof(MeshFilter), typeof(MeshRenderer));\n\n if (renderObject)\n {\n renderObject.transform.position = streetscapegeometry.pose.position;\n renderObject.transform.rotation = streetscapegeometry.pose.rotation;\n renderObject.GetComponent\u003cMeshFilter\u003e().mesh = streetscapegeometry.mesh;\n renderObject.GetComponent\u003cMeshRenderer\u003e().material = streetscapeGeometryMaterial;\n }\n }\n }\n\n public void OnDisable()\n {\n StreetscapeGeometryManager.StreetscapeGeometriesChanged -=\n GetStreetscapeGeometry;\n }\n\n private void GetStreetscapeGeometry(ARStreetscapeGeometriesChangedEventArgs eventArgs)\n {\n _addedStreetscapeGeometries = eventArgs.Added;\n _updatedStreetscapeGeometries = eventArgs.Updated;\n _removedStreetscapeGeometries = eventArgs.Removed;\n }\n\nUnderstand [`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry)\n--------------------------------------------------------------------------------------------------------------------\n\n[`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry) contains information about a building:\n\n- [`ARStreetscapeGeometry.streetscapeGeometryType`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry#streetscapegeometrytype) \n Identifies the StreetscapeGeometry as either terrain or a building.\n- [`ARStreetscapeGeometry.mesh`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry#mesh) \n Obtain a polygon [`Mesh`](https://docs.unity3d.com/ScriptReference/Mesh.html) that corresponds to this terrain or building.\n- [`ARStreetscapeGeometry.quality`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry#quality) \n Provides the quality of the mesh data. Levels of detail are described in the [CityGML 2.0 standard](https://portal.ogc.org/files/?artifact_id=16675).\n\n### Building LOD 1\n\n[`BuildingLOD1`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#streetscapegeometryquality_buildinglod1) consists of building footprints extruded upwards to a flat top. Building heights may be inaccurate.\n\n### Building LOD 2\n\n[`BuildingLOD2`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#streetscapegeometryquality_buildinglod2) will have higher fidelity geometry. Mesh walls and roofs will more closely match the building's shape. Smaller features like chimneys or roof vents may still poke outside of the mesh.\n\nUnderstand [`Mesh`](https://docs.unity3d.com/ScriptReference/Mesh.html)\n-----------------------------------------------------------------------\n\n[`Mesh`](https://docs.unity3d.com/ScriptReference/Mesh.html) is a polygon mesh representing a surface reconstruction of the Streetscape Geometry.\n\nSee [`Mesh`](https://docs.unity3d.com/ScriptReference/Mesh.html) and [`MeshRenderer`](https://docs.unity3d.com/Manual/class-MeshRenderer.html). Note that the normals are not calculated by default;\nsee [`Mesh.RecalculateNormals()`](https://docs.unity3d.com/ScriptReference/Mesh.RecalculateNormals.html) to calculate them.\n\nAttach AR content to a [`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry)\n--------------------------------------------------------------------------------------------------------------------------------\n\nUse [`ARAnchorManager.AddAnchor()`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARAnchorManager.html#UnityEngine_XR_ARFoundation_ARAnchorManager_AddAnchor_UnityEngine_Pose_) to create an anchor at a given pose near vertices in [`ARStreetscapeGeometry.mesh`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry#mesh). This anchor will inherit its tracking state from the parent [`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry).\n\n\u003cbr /\u003e\n\n### Perform a hit-test against [`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry)\n\n[`ARRaycastManagerExtensions.RaycastStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARRaycastManagerExtensions#raycaststreetscapegeometry) can be used to hit-test against Streetscape Geometry. If intersections are found, [`XRRaycastHit`](https://docs.unity3d.com/Packages/com.unity.xr.arsubsystems@4.2/api/UnityEngine.XR.ARSubsystems.XRRaycastHit.html) contains pose information about the hit location as well as a reference to the [`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry) which was hit. This Streetscape Geometry can be passed to [`ARAnchorManager.AddAnchor()`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARAnchorManager.html#UnityEngine_XR_ARFoundation_ARAnchorManager_AddAnchor_UnityEngine_Pose_) to create an anchor attached to it. \n\n Vector2 screenTapPosition = Input.GetTouch(0).position;\n List\u003cXRRaycastHit\u003e hitResults = new List\u003cXRRaycastHit\u003e();\n if (RaycastManager.RaycastStreetscapeGeometry(screenTapPosition, ref hitResults)){\n ARStreetscapeGeometry streetscapegeometry =\n StreetscapeGeometryManager.GetStreetscapeGeometry(hitResults[0].trackableId);\n if (streetscapegeometry != null)\n {\n ARAnchor anchor = StreetscapeGeometryManager.AttachAnchor(streetscapegeometry, hitResults[0].pose);\n }\n }\n\nEnable Geospatial Depth\n-----------------------\n\n[Geospatial Depth](/ar/develop/unity-arf/depth/geospatial-depth) combines Streetscape Geometry\nwith local sensor input to enhance depth data. When Geospatial Depth is enabled,\nthe output depth and raw depth images are modified to include rasterized Streetscape Geometry in addition to locally observed depth.\nThis may improve the accuracy of poses using Depth."]]