다음을 통해 공유


SessionOrigin 이해

SessionOrigin은 AR Foundation에 도입된 비교적 새로운 구현이지만, 렌더링 엔진의 수십 년 전으로 거슬러 올라가면 카메라 장비에도 이 아이디어가 등장했습니다. MRTK Playspace 노드로 잘 알고 있을 것입니다. 매우 강력하지만, 불행하게도 설명이 부족해서 제대로 이해되지 않았습니다.

SessionOrigin이란?

SessionOrigin은 카메라가 연결된 Transform 개체일 뿐입니다. 가장 간단하게 말하면, 이는 가상 장면에서 카메라의 배치를 허용합니다. 좀 더 복잡하게 말하면, 이는 특별한 좌표 공간을 정의합니다.

Unity(및 모든 최신 렌더링 엔진)의 부모-자식 변환 관계와 마찬가지로 부모가 "이동"하면 자식이 "이동"됩니다. 이 컨텍스트에서 "이동"이라는 용어의 의미는 부모의 전역 포즈가 변경되면 자식의 전역 좌표가 변경되고, 한 개체의 전역 좌표가 변경될 때 해당 개체가 전역 좌표가 변경되지 않은 개체를 기준으로 이동한 것으로 보인다는 것입니다.

카메라는 이러한 이유로 렌더링되지 않으므로 다소 특별합니다. 렌더러의 뷰포인트를 결정합니다. 구체적인 예를 보면 명확히 알 수 있습니다.

SessionOrigin의 가장 간단한 예

시작 시 카메라가 원점이고(AR 애플리케이션에서는 정상) 카메라 앞의 Z축 10m에 빨간색 구가 하나 있는(position=(0,0,10)) 매우 간단한 장면을 상상해 보세요.

가장 간단한 가상 장면

이유가 어떻든, 사용자가 구에서 1미터 떨어진 곳에서 시작하도록 하려고 합니다.

다음과 같은 두 가지 흥미로운 옵션이 있습니다.

  1. 카메라를 새 위치 (0,0,9)로 이동합니다.
  2. 구를 새 위치 (0,0,1)로 이동합니다.

두 가지 옵션

두 옵션은 다른 컨텍스트 없이 궁극적으로 동일하다는 것이 분명합니다. 두 경우 모두 시작 시 구는 카메라 앞에서 1미터 떨어져 있습니다. 유일한 차이점은 두 개체의 절대 전역 좌표입니다. 둘 사이의 벡터인 상대 좌표는 두 경우 모두 동일합니다.

옵션 1을 사용하려면 어떻게 해야 할까요? 카메라의 좌표를 설정하면 추적 시스템에 의해 덮어써집니다. 대신 카메라를 부모 개체에 연결한 다음, 부모를 이동합니다. 추적기는 카메라의 로컬 포즈를 설정하여 부모를 기준으로 이동합니다. 이제 부모가 SessionOrigin입니다.

구 대신 카메라를 이동하는 이유는 무엇인가요?

이 간단한 사례에서 두 옵션은 명확하게 서로 바꿔 사용할 수 있습니다. 그러나 "구"는 실제로 "장면의 모든 것이 아니라 카메라"를 나타낸다는 것을 기억하세요. 장면의 복잡성이 증가할수록 모든 것을 이동하는 것이 더 복잡해집니다. SessionOrigin을 통해 카메라를 이동하는 것은 항상 똑같은 작업입니다.

또한 파티클 시스템이나 탐색 메시와 같이 재배치하기 어렵거나 불가능한 개체 유형이 있습니다. 그러나 이러한 개체가 포함되지 않더라도 장면의 단일 개체인 SessionOrigin의 좌표를 변경하는 경우는 다른 모든 항목의 전역 좌표를 변경하는 경우보다 분명한 이점이 있습니다.

SessionOrigin은 모든 것을 이동해서는 안 됩니다.

가장 간단한 예제를 다시 생각해 보세요. 그러나 이는 AR 애플리케이션이므로 사용자에게 렌더링된 빨간색 구와 함께 물리적 환경도 표시됩니다. 단순한 표현을 위해 물리적 환경은 표시된 것처럼 단일 녹색 의자로 제한됩니다.

가상 개체와 물리적 개체 모두

이제 SessionOrigin을 통해 카메라를 이동할 때 빨간색 구를 기준으로 이동했지만, 분명히 사용자를 집어서 녹색 의자를 기준으로 이동하지는 않았습니다. 이제 구가 더 가깝게 나타나지만 의자는 정확히 같은 위치에 있습니다.

물리적 사용자를 기준으로 고정된 물리적 개체

의자 시트에 앵커가 있으면 어떻게 해야 할까요? 앵커가 빨간색 구와 함께 이동해야 할까요? 아니면 의자 시트에 상대적으로 고정된 상태를 유지해야 할까요? 앵커의 요점은 물리적 세계를 기준으로 고정된 상태로 유지하는 것이므로 의자와 함께 있어야 합니다.

또 다른 예로 공간 메시가 있습니다. 컨텍스트, 광선 캐스팅 등에 대한 물리적 환경의 가상 버전을 제공하기 위해 생성된 메시입니다. 우리는 확실히 공간 메시가 물리적 세계에 고정된 상태로 유지되기를 바랍니다.

손 메시부터 시선 응시 벡터까지 다양한 예제가 있습니다. 모두 카메라의 좌표가 조정(변환)되는 경우 해당 개체의 좌표가 동일한 조정을 받아야 한다는 공통 특성을 공유합니다.

따라서 개념적으로 카메라에 맞춰 이동하는 모든 개체도 SessionOrigin에 연결됩니다. SessionOrigin이 빨간색 구와 같은 전역 개체를 기준으로 이동하면 이러한 모든 개체가 함께 이동합니다.

이는 머리 추적으로 인한 카메라의 움직임과 무관하다는 것을 알아 두어야 합니다. 추적기는 SessionOrigin을 기준으로 카메라를 이동합니다.

약간 더 수학적인 설명

Unity의 전역 좌표계는 AR 애플리케이션에서 기본적으로 임의로 배치됩니다. 중력 벡터(Y축)를 "위쪽"으로 맞추는 것과 별개로, 위치와 방향은 전적으로 추적기가 시작 시 카메라를 배치하는 위치에 따라 결정됩니다.

이는 많은 애플리케이션에서 괜찮을 수 있지만 전역 좌표 공간의 임의성을 제거할 수 있으므로 다양한 가능성이 열립니다.

이전 예제를 다시 보면,가상의 빨간색 구가 표시된 물리적 의자를 기준으로 배치되는 것이 애플리케이션에 중요하다고 상상해 보세요. SessionOrigin을 조정하여 이 작업을 수행할 수 있습니다.

원하는 레이아웃

(0,0,10)에 있는 구가 의자에서 X축으로 1미터에 있도록 하려면 의자가 (-1,0,10)에 있어야 합니다. 카메라가 원점에 있을 때 카메라가 음의 Z축을 따라 직접 의자에서 2미터 뒤에 있도록 하면 의자의 현재 위치는 (0,0,2)입니다. 물리적 개체에는 내재된 좌표가 없으며 카메라 및 가상 개체에 대한 근접성이 암시하는 좌표만 있습니다.

초기 레이아웃

그러나 SessionOrigin 변환을 (-1,0,8)로 설정하면 이제 카메라의 위치는 (-1,0,8)입니다. 2미터 바로 앞에 있는 의자는 (-1,0,10)에 있습니다. 그리고 원하는 경우 (0,0,10)에 있는 빨간색 구는 의자에서 오른쪽으로 1미터 거리에 나타납니다.

조정된 레이아웃

따라서 SessionOrigin 변환을 효과적으로 사용하여 빨간색 구와 다른 모든 전역 개체가 물리적 세계를 기준으로 올바른 위치에 표시되도록 Unity의 전역 공간을 재배치했습니다.

Unity의 전역 좌표 공간을 물리적 세계에 맞추는 이 단순하지만 강력한 메커니즘을 활용하여 복잡한 레이아웃, 좌표 공간의 지속성, 디바이스 간에 공유되는 좌표 공간 등을 지원할 수 있습니다.

추가 정보