Unity의 좌표계

Windows Mixed Reality 방향 전용 및 좌석 크기 조정 앱부터 회의실 규모 앱까지 다양한 환경 규모에서 앱을 지원합니다. HoloLens에서는 더 나아가 사용자가 5미터를 넘어 건물 전체 층을 탐색할 수 있는 세계적 규모의 앱을 빌드할 수 있습니다.

Unity에서 혼합 현실 환경을 빌드하는 첫 번째 단계는 좌표계를 이해하고 앱이 대상으로 하는 환경 크기를 선택하는 것입니다.

방향 전용 또는 앉은 크기 환경 빌드

네임스페이스:UnityEngine.XR
형식:XRDevice

방향 전용 또는 사용자 지정 크기 환경을 빌드하려면 Unity를 고정 추적 공간 유형으로 설정해야 합니다. 고정 추적 공간은 Unity의 월드 좌표계를 설정하여 고정된 참조 프레임을 추적합니다. 고정 추적 모드에서는 앱이 시작될 때 카메라의 기본 위치 바로 앞에 있는 편집기(앞으로는 -Z)에 배치된 콘텐츠가 사용자 앞에 표시됩니다.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

네임스페이스:UnityEngine.XR
형식:InputTracking

360도 비디오 뷰어(위치 헤드 업데이트가 환상을 망칠 수 있음)와 같은 순수한 방향 전용 환경 의 경우 XR을 설정할 수 있습니다 . InputTracking.disablePositionalTracking 을 true로:

InputTracking.disablePositionalTracking = true;

좌석 크기 환경의 경우 사용자가 나중에 좌석에 앉은 원점이 될 수 있도록 XR을 호출할 수 있습니다. InputTracking.Recenter 메서드:

InputTracking.Recenter();

스탠딩 스케일 또는 룸 스케일 환경 구축

네임스페이스:UnityEngine.XR
형식:XRDevice

스탠딩 스케일 또는 룸 스케일 환경의 경우 바닥을 기준으로 콘텐츠를 배치해야 합니다. 첫 번째 실행 중에 설정된 사용자의 정의된 바닥 수준 원점 및 선택적 방 경계를 나타내는 공간 단계를 사용하여 사용자의 바닥에 대해 추론합니다.

Unity가 바닥 수준에서 월드 좌표계로 작동하도록 하려면 Unity가 RoomScale 추적 공간 유형을 사용하고 있는지 설정하고 테스트할 수 있습니다.

if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
    // RoomScale mode was set successfully.  App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
    // RoomScale mode was not set successfully.  App cannot make assumptions about where the floor plane is.
}
  • SetTrackingSpaceType이 true를 반환하면 Unity는 월드 좌표계를 성공적으로 전환하여 참조의 스테이지 프레임을 추적했습니다.
  • SetTrackingSpaceType이 false를 반환하는 경우 Unity는 사용자가 환경에서 바닥을 설정하지 않았기 때문에 참조의 스테이지 프레임으로 전환할 수 없습니다. 잘못된 반환 값은 일반적이지 않지만 스테이지가 다른 방에 설정되고 사용자가 새 스테이지를 설정하지 않고 디바이스를 현재 회의실로 이동하는 경우 발생할 수 있습니다.

앱이 RoomScale 추적 공간 유형을 성공적으로 설정하면 y=0 평면에 배치된 콘텐츠가 바닥에 표시됩니다. 0, 0, 0의 원점은 사용자가 회의실을 설치하는 동안 서 있는 층의 특정 위치이며, -Z는 설치 중에 마주보고 있던 정방향 방향을 나타냅니다.

네임스페이스:UnityEngine.Experimental.XR
형식:경계

그런 다음 스크립트 코드에서 UnityEngine.Experimental.XR.Boundary 형식에서 TryGetGeometry 메서드를 호출하여 경계 다각형을 가져오고 TrackedArea의 경계 형식을 지정할 수 있습니다. 사용자가 경계를 정의한 경우(꼭짓점 목록을 다시 가져오는 경우) 사용자가 만든 장면을 둘러 볼 수 있는 공간 규모 환경을 사용자에게 제공하는 것이 안전합니다.

참고

시스템은 사용자가 경계에 접근할 때 자동으로 경계를 렌더링합니다. 앱은 경계 자체를 렌더링하기 위해 이 다각형을 사용할 필요가 없습니다. 그러나 이 경계 다각형을 사용하여 장면 개체를 배치하여 사용자가 원격 보고 없이 해당 개체에 물리적으로 연결할 수 있도록 선택할 수 있습니다.

var vertices = new List<Vector3>();
if (UnityEngine.Experimental.XR.Boundary.TryGetGeometry(vertices, Boundary.Type.TrackedArea))
{
    // Lay out your app's content within the boundary polygon, to ensure that users can reach it without teleporting.
}

세계적 규모의 환경 구축

네임스페이스:UnityEngine.XR.WSA
형식:WorldAnchor

사용자가 5미터를 초과하여 방황할 수 있는 HoloLens의 진정한 세계적 규모의 환경 의 경우 회의실 규모 환경에 사용되는 기술을 넘어서는 새로운 기술이 필요합니다. 사용할 한 가지 주요 기술은 사용자가 얼마나 멀리 로밍했는지에 관계없이 실제 세계에서 홀로그램 클러스터를 정확하게 잠그는 공간 앵커 를 만든 다음 이후 세션에서 해당 홀로그램을 다시 찾는 것입니다.

Unity에서는 GameObject에 WorldAnchor Unity 구성 요소를 추가하여 공간 앵커를 만듭니다.

World Anchor 추가

월드 앵커를 추가하려면 실제 세계에서 고정하려는 변환을 사용하여 게임 개체에서 AddComponent<WorldAnchor>()를 호출합니다.

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

정말 간단하죠. 이제 이 게임 개체가 실제 세계의 현재 위치에 고정됩니다. Unity 월드 좌표가 시간이 지남에 따라 약간 조정되어 물리적 맞춤이 보장될 수 있습니다. 지속성을 사용하여 향후 앱 세션에서 이 고정된 위치를 다시 찾습니다.

World Anchor 제거

GameObject를 실제 월드 위치에 더 이상 잠그지 않고 이 프레임을 이동하지 않으려면 World Anchor 구성 요소에서 Destroy를 호출하면 됩니다.

Destroy(gameObject.GetComponent<WorldAnchor>());

GameObject 이 프레임을 이동하려면 DestroyImmediate를 대신 호출해야 합니다.

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

World Anchored GameObject 이동

World Anchor가 있는 동안에는 GameObject를 이동할 수 없습니다. GameObject 이 프레임을 이동해야 하는 경우 다음을 수행해야 합니다.

  1. Destroy World Anchor 구성 요소 수정
  2. GameObject 이동
  3. GameObject에 새 World Anchor 구성 요소를 추가합니다.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

위치 변경 처리

WorldAnchor는 특정 시점에 물리적 세계에서 찾을 수 없을 수 있습니다. 이 경우 Unity는 고정된 개체의 변환을 업데이트하지 않습니다. 또한 앱이 실행되는 동안 변경 될 수 있습니다. 위치 변경 사항을 처리하지 못하면 개체가 세계의 올바른 물리적 위치에 나타나지 않습니다.

위치 변경에 대한 알림을 받려면 다음을 수행합니다.

  1. OnTrackingChanged 이벤트 구독
  2. 이벤트 처리

OnTrackingChanged 이벤트는 기본 공간 앵커가 찾을 수 있는 상태와 찾을 수 없는 상태 간에 변경될 때마다 호출됩니다.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

그런 다음, 이벤트를 처리합니다.

private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
    // This simply activates/deactivates this object and all children when tracking changes
    self.gameObject.SetActiveRecursively(located);
}

앵커가 즉시 배치되는 경우도 있습니다. 이 경우 AddComponent<WorldAnchor>()가 반환될 때 앵커의 isLocated 속성이 true로 설정됩니다. 따라서 OnTrackingChanged 이벤트는 트리거되지 않습니다. 클린 패턴은 앵커를 연결한 후 초기 IsLocated 상태로 OnTrackingChanged 처리기를 호출하는 것입니다.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

여러 디바이스에서 앵커 공유

Azure Spatial Anchors를 사용하여 로컬 WorldAnchor에서 지속형 클라우드 앵커를 만듭니다. 그러면 앱이 여러 HoloLens, iOS 및 Android 디바이스에서 찾을 수 있습니다. 여러 디바이스에서 공통 공간 앵커를 공유하면 각 사용자는 동일한 물리적 위치에서 해당 앵커를 기준으로 렌더링된 콘텐츠를 볼 수 있습니다. 이렇게 실제 세계 공유 환경을 제공합니다.

Unity에서 공유 환경 빌드를 시작하려면 5분 Azure Spatial Anchors Unity 빠른 시작을 사용해 보세요.

Azure Spatial Anchors를 사용하여 실행한 후 Unity에서 앵커를 만들고 찾을 수 있습니다.

다음 개발 검사점

배치한 Unity 개발 검사점 여정을 따르는 경우 Mixed Reality 핵심 구성 요소를 탐색하는 중입니다. 여기에서 다음 구성 요소로 진행할 수 있습니다.

또는 Mixed Reality 플랫폼 기능 및 API로 이동합니다.

언제든지 Unity 개발 검사점으로 돌아갈 수 있습니다.

참고 항목