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

이 가이드에서는 Geospatial Creator를 사용하여 C# 스크립트를 작성하는 방법을 설명합니다. 데이터를 생성하거나 이동시키는 것과 같은 일반적인 작업을 Unity의 수정 모드에 있는 ARGeospatialCreatorAnchor 객체 이는 스프레드시트 또는 KML과 같은 사전 정의된 목록에서 여러 앵커 만들기 파일에서 참조됩니다.

Unity의 Geospatial Creator를 사용하면 생성합니다 빠른 시작 가이드 Geospatial Creator를 소개하고 첫 번째 Google Cloud 함수를 빌드하는 방법을 Unity를 사용하여 최소한의 프로그래밍으로 지리정보 지원 AR 환경 편집기 UI 고급 프로젝트의 경우 Unity 편집기 UI를 사용하는 대신 프로그래매틱 방식으로 Geospatial Creator 게임 객체를 만들고 조작하는 것이 좋습니다.

이 가이드에서는 사용자가 기본적인 Geospatial Creator 개념에 익숙하다고 가정합니다. Google Cloud Platform에서 지리정보(Geospatial)를 크리에이터가 장면에 고정합니다. Geospatial Creator를 사용 설정하고 API 키로 구성해야 하며 장면의 초기 AR 세션 객체도 있어야 합니다. 처음부터 시작하는 경우 '지리적 크리에이터 사용 설정' 섹션을 포함하여 빠른 시작 가이드를 모두 완료한 후 계속 진행하세요.

시작하기

이 예에서는 뉴욕 시청 주변의 알려진 위치가 AR 콘텐츠를 배치할 위치를 선택합니다. 이러한 각 위치에 앵커 객체를 만든 다음 이러한 앵커에 기본 도형을 연결해야 합니다.

앵커를 만들려면 먼저 위도, 경도, 고도를 Unity 세계 좌표로 변환하고 그 반대로 변환하는 참조 지점인 ARGeospatialCreatorOrigin를 지정해야 합니다. 원점에는 CesiumGeoreference 하위 구성요소와 Cesium이 주변을 렌더링할 수 있는 Cesium3DTileset 하위 객체 영역에 있습니다. 이를 위해서는 빠른 시작에 설명된 대로 Google 지도 카드 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 확장 프로그램과 번들로 제공되는 Geospatial 샘플 애플리케이션으로 시작한 경우 앵커 관리자가 'AR 세션 출처' 게임 오브젝트에 연결됩니다. 장면에 정확히 하나의 앵커 관리자가 있다고 가정하면 다음과 같이 참조를 가져올 수 있습니다.

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

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

지형 앵커 만들기

다음과 같은 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 애플리케이션에서 지상 수준의 각 위치에 1m3의 큐브를 배치하려고 한다고 가정해 보겠습니다. 다음 코드는 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.7m입니다.

지붕 위의 지리정보 앵커

특정 고도에 앵커 만들기

마지막 앵커는 시청 돔의 맨 꼭대기에 배치됩니다. 이 앵커의 경우 정확한 고도가 중요하므로 지형지물 또는 옥상 앵커 대신 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에 따라 지정되어 있습니다. 물론 편집기의 지도 타일 도형 높이가 실제와 비교하여 잘못된 것으로 판명되더라도 편집기 재정의를 사용하여 장면 뷰에서 앵커의 위치를 변경할 수 있습니다.

돔의 지리정보 앵커