Unity의 Geospatial Creator에서 프로그래매틱 방식으로 앵커 만들기 및 수정

이 가이드에서는 Geospatial Creator를 사용하여 C# 스크립트를 작성하여 Unity의 수정 모드에서 ARGeospatialCreatorAnchor 객체 생성 및 이동과 같은 일반적인 작업을 빠르게 수행하는 방법을 설명합니다. 이 기능은 스프레드시트나 KML 파일과 같은 사전 정의된 목록에서 여러 앵커를 만드는 데 유용할 수 있습니다.

Unity의 Geospatial Creator를 사용하면 Unity 편집기에서 지리정보 콘텐츠를 미리 볼 수 있습니다. 빠른 시작 가이드에서는 Geospatial Creator를 소개하고 Unity 편집기 UI를 사용하여 최소한의 프로그래밍으로 지리정보가 사용 설정된 첫 AR 환경을 빌드하는 방법을 안내합니다. 고급 프로젝트의 경우 Unity 편집기 UI를 사용하는 대신 Geospatial Creator GameObject를 프로그래매틱 방식으로 만들고 조작하는 것이 좋습니다.

이 가이드에서는 사용자가 빠른 시작에서 소개한 기본 Geospatial Creator 개념에 익숙하고 장면에 Geospatial Creator 앵커를 추가할 준비가 되었다고 가정합니다. Geospatial Creator가 사용 설정되고 API 키와 함께 해당 장면의 초기 AR 세션 객체가 필요합니다. 처음부터 시작하는 경우 계속하기 전에 빠른 시작 가이드의 'Geospatial Creator 사용 설정' 섹션을 자세히 살펴보세요.

시작하기

이 예에서는 미국 캘리포니아주 샌프란시스코 시청 주변에 AR 콘텐츠를 배치하려는 일련의 알려진 위치가 있다고 가정해 보겠습니다. 이러한 각 위치에 앵커 객체를 만든 다음 이 앵커에 기본 도형을 연결해야 합니다.

앵커를 만들려면 먼저 ARGeospatialCreatorOrigin를 지정해야 합니다. 이 값은 Unity 세계 좌표와 위도, 경도, 고도를 변환하는 기준점입니다. 원점에는 CesiumGeoreference 하위 구성요소와 Cesium3DTileset 하위 객체도 포함됩니다. 이를 통해 Cesium은 Unity 편집기의 Scene(장면) 뷰에서 주변 영역을 렌더링할 수 있습니다. 이렇게 하려면 빠른 시작에 설명된 대로 Google Map Tiles API 키가 필요합니다.

출처 만들기

Geospatial Creator용 API에는 장면에 ARGeospatialCreatorOrigin를 만들고 필요한 Cesium 구성요소를 추가하는 팩토리 메서드가 포함되어 있습니다. 다음 코드는 지정된 Map Tiles API 키를 사용하여 가까운 위도, 경도 및 고도에 출발지를 만듭니다.

ARGeospatialCreatorOrigin origin =
  GeospatialCreatorCesiumAdapter.CreateOriginWithCesiumGeoreference(
    37.77954, -122.417581, 0.0, "<MAP_TILES_KEY>");

기본적으로 이 객체는 Unity 세계 좌표에서 (0, 0, 0)에 배치되며, 이 예에서는 잘 작동합니다.

ARAnchorManager 참조 가져오기

런타임 시 지리정보 앵커를 확인하려면 ARAnchorManager가 필요하므로 장면의 ARAnchorManager 참조도 필요합니다. ARCore 확장 프로그램과 함께 번들로 제공되는 지리정보 샘플 애플리케이션으로 시작한 경우 앵커 관리자가 'AR 세션 출처' GameObject에 연결됩니다. 장면에 정확히 하나의 앵커 관리자가 있다고 가정하면 다음과 같이 참조를 가져올 수 있습니다.

ARAnchorManager anchorManager =
    Resources.FindObjectsOfTypeAll<ARAnchorManager>()[0];

이제 출처와 앵커 관리자가 있으므로 ARGeospatialCreatorAnchor 객체를 만들 수 있습니다.

지형 앵커 만들기

미국 캘리포니아주 샌프란시스코에 있는 시청의 동쪽 방향 3점의 정확한 위도와 경도를 나타내는 다음과 같은 double 값의 2차원 배열을 가정해 보겠습니다.

double[,] _cityHallEastPoints = {
    { 37.77936, -122.418617 }, // in front of city hall
    { 37.77965, -122.418680 }, // right of city hall
    { 37.77917, -122.418577 }}; // left of city hall

AR 애플리케이션에서 지면 수준의 각 위치에 1미터 정육면체를 배치한다고 가정해 보겠습니다. 다음 코드는 ARGeospatialCreatorAnchor 객체를 만들고 속성을 적절한 값에 할당합니다.

for (int i = 0; i < _cityHallEastPoints.GetLength(0); i++)
{
  ARGeospatialCreatorAnchor anchor =
    new GameObject("City Hall " + i).AddComponent<ARGeospatialCreatorAnchor>();
  anchor.Origin = origin;
  anchor.AnchorManager = anchorManager;
  anchor.Latitude = _cityHallEastPoints[i, 0];
  anchor.Longitude = _cityHallEastPoints[i, 1];
  anchor.AltitudeType = AnchorAltitudeType.Terrain;

  GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
  cube.transform.parent = anchor.transform;
}

이렇게 하면 각 지점에 지형 앵커가 생성됩니다. Geospatial Creator는 ARGeospatialCreatorOrigin 객체를 기준으로 위치를 계산하여 적절한 Unity 세계 좌표에 자동으로 앵커를 배치합니다. 지형 앵커의 고도를 조정하려면 Altitude 속성을 지형 표면 위 또는 아래의 미터 단위로 설정합니다.

런타임 시 지형 앵커는 실행 중인 앱의 지면 수준에서 확인되며 Altitude 속성으로 오프셋됩니다. 그러나 편집기의 장면 뷰에서는 기본적으로 3D 타일 도형을 기준으로 하지 않고 WGS84 고도 0으로 렌더링됩니다. 이 위치는 보기 원하는 위치가 아닐 때가 많으므로 UseEditorAltitudeOverride 속성을 true로 설정하고 EditorAltitudeOverride 속성을 사용하여 WGS84미터의 고도를 지정하여 편집기의 장면 뷰에서 앵커의 기본 고도를 재정의할 수 있습니다.

anchor.UseEditorAltitudeOverride = true;
anchor.EditorAltitudeOverride = -13.5; // WGS84 altitude at ground level for City Hall plaza

이 두 속성은 편집기 모드 외부에는 영향을 미치지 않으며 실행 중인 앱에 컴파일되지 않습니다.

시티 홀 플라자의 지리정보 앵커

루프톱 앵커 만들기

다음 앵커로 시티홀 옥상에 앵커를 배치한다고 가정해 보겠습니다. 앵커도 똑같은 방식으로 만들 수 있습니다. 단, AltitudeType 속성이 AnchorAltitudeType.Rooftop로 설정됩니다.

ARGeospatialCreatorAnchor cityHallRoofAnchor =
  new GameObject("City Hall Roof").AddComponent<ARGeospatialCreatorAnchor>();
cityHallRoofAnchor.Origin = origin;
cityHallRoofAnchor.AnchorManager = anchorManager;
cityHallRoofAnchor.Latitude = 37.77959;
cityHallRoofAnchor.Longitude = -122.419006;
cityHallRoofAnchor.AltitudeType = AnchorAltitudeType.Rooftop;

GameObject roofCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
roofCube.transform.parent = cityHallRoofAnchor.transform;

지형 앵커와 마찬가지로 UseEditorAltitudeOverrideEditorAltitudeOverride 속성을 사용하여 편집기의 장면 뷰에서 루프톱 앵커의 고도를 미세 조정할 수 있습니다. 이 예에서 WGS84 지붕의 고도는 약 10.7미터입니다.

지붕의 지리 공간 앵커

특정 고도에 앵커 만들기

마지막 고정 장치는 시청 돔 맨 위에 배치됩니다. 이 앵커의 경우 정확한 고도가 중요하므로 지형 또는 루프톱 앵커 대신 WGS84 앵커를 사용하여 명시적으로 고도를 설정합니다.

ARGeospatialCreatorAnchor cityHallDomeAnchor =
  new GameObject("City Hall Dome").AddComponent<ARGeospatialCreatorAnchor>();
cityHallDomeAnchor.Origin = origin;
cityHallDomeAnchor.AnchorManager = anchorManager;
cityHallDomeAnchor.Latitude = 37.77928;
cityHallDomeAnchor.Longitude = -122.419241;
cityHallDomeAnchor.AltitudeType = AnchorAltitudeType.WGS84;
cityHallDomeAnchor.Altitude = 73;

GameObject domeCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
domeCube.transform.parent = cityHallDomeAnchor.transform;

고도가 WGS84에 따라 이미 지정되어 있으므로 편집기 전용 고도 재정의를 사용할 필요가 없습니다. 물론 편집기에서 지도 타일 도형의 높이가 실제보다 잘못된 것으로 판명되더라도 편집기 재정의를 사용하여 장면 뷰에서 앵커의 위치를 변경할 수 있습니다.

돔의 지리정보 앵커