Unity의 카메라 및 input frame 데이터 소스 -- frame source(Frame Source)
Frame source는 Unity에서 카메라 및 input frame 데이터의 제공자입니다. 이 문서에서는 frame source의 기본 개념, 유형, runtime 선택 방법을 소개합니다.
시작하기 전에
- AR Session의 기본 개념, 구성, workflow를 이해합니다.
- 카메라, input frame 등의 기본 개념을 이해합니다.
frame source란
Frame source(FrameSource)는 input frame(InputFrame)의 제공자이며, 카메라 및 input frame 데이터를 제공하는 기타 디바이스와 기능을 추상화합니다.
아래 다이어그램은 session에서 frame source의 위치를 보여줍니다:
flowchart LR
F[Frame Source]
A((Input Frame))
B[Session]
C([Camera])
O([Origin])
T([Target])
F --> A
A --> B
B -. transform .-> C
B -. transform .-> O
B -. transform .-> T
style F fill:#6e6ce6,stroke:#333,color:#fff
Frame source는 downstream AR 기능이 사용할 데이터를 제공하기만 할 수도 있고, motion tracking 같은 일부 AR 기능을 자체적으로 구현할 수도 있습니다. 일부 frame source는 카메라 디바이스의 control interface를 제공하여 사용자가 resolution, focus mode 등 카메라 파라미터를 선택할 수 있게 합니다.
frame source 유형
frame source를 제공하는 Unity 패키지에 따라 frame source는 두 가지 큰 범주로 나눌 수 있습니다:
- Built-in frame source: EasyAR Sense Unity Plugin 패키지가 제공하는 frame source이며, 일반적으로 대부분의 일반적인 사용 시나리오와 일부 헤드셋을 지원합니다.
- External frame source: EasyAR Sense Unity Plugin 확장 패키지가 제공하는 frame source이며, 일반적으로 특정 헤드셋 디바이스를 지원하는 데 사용됩니다. 많은 경우 external frame source는 헤드셋 제조사 또는 서드파티 개발자가 제공합니다.
external frame source와 달리 custom camera는 반드시 외부에서 제공되는 것은 아니며, built-in frame source 중 일부도 custom camera입니다.
Frame source는 0DoF, 3DoF, 5DoF, 6DoF 등 서로 다른 degrees of freedom의 motion data를 제공할 수 있습니다. 동일한 frame source도 작업 상태에 따라 서로 다른 degrees of freedom의 motion data를 제공할 수 있습니다.
다음 표는 EasyAR가 제공하는 frame source를 나열합니다:
| 이름 | Built-in | Custom camera | Motion data | 설명 |
|---|---|---|---|---|
| CameraDeviceFrameSource | 예 | 아니요 | 없음(0DoF) | 일반 카메라, 전/후면 카메라와 PC 지원 |
| EditorCameraDeviceFrameSource | 예 | 아니요 | 없음(0DoF) | 일반 카메라, editor에서 debugging 용도만 지원 |
| FramePlayer | 예 | 아니요 | playback 파일에 따라 결정 | EIF 파일을 재생하여 runtime simulation 구현 |
| ThreeDofCameraDeviceFrameSource | 예 | 아니요 | 3DoF | 3DoF tracking capability 제공 |
| InertialCameraDeviceFrameSource | 예 | 아니요 | 5DoF | inertial navigation capability 제공 |
| MotionTrackerFrameSource | 예 | 아니요 | 6DoF | EasyAR가 구현한 motion tracking 제공 |
| ARCoreFrameSource | 예 | 아니요 | 6DoF | ARCore의 motion tracking 제공 |
| ARKitFrameSource | 예 | 아니요 | 6DoF | ARKit의 motion tracking 제공 |
| AREngineFrameSource | 예 | 예 | 6DoF | AR Engine의 motion tracking 제공 |
| VisionOSARKitFrameSource | 예 | 예 | 6DoF | VisionOS ARKit의 motion tracking 제공 1 |
| XREALFrameSource | 예 | 예 | 6DoF | XREAL 디바이스의 motion tracking 제공 1 |
| ARCoreARFoundationFrameSource | 예 | 예 | 6DoF | ARCore에 대응하는 ARFoundation의 motion tracking 제공 |
| ARKitARFoundationFrameSource | 예 | 예 | 6DoF | ARKit에 대응하는 ARFoundation의 motion tracking 제공 |
| PicoFrameSource | 아니요 | 예 | 6DoF | Pico 디바이스의 motion tracking 제공 1 |
| RokidFrameSource | 아니요 | 예 | 6DoF | Rokid 디바이스의 motion tracking 제공 1 |
| MetaXRFrameSource | 아니요 | 예 | 6DoF | Meta XR 장치의 motion tracking을 제공합니다 1 |
runtime frame source 선택
session의 scene hierarchy에는 하나 이상의 frame source 컴포넌트가 포함됩니다. session runtime 중에는 모든 frame source 컴포넌트가 사용되는 것은 아닙니다.
다음 screenshot은 frame source 컴포넌트가 하나뿐인 scene hierarchy를 보여줍니다:
![]()
다음 screenshot은 여러 frame source 컴포넌트를 포함하는 scene hierarchy를 보여줍니다:

각 프레임 소스는 기능이 다르며, 이에 따라 적용 가능한 사용 시나리오와 장치도 결정됩니다. session 조립 시 이러한 컴포넌트 중 하나만 session의 프레임 소스로 선택됩니다.
AssembleOptions.FrameSourceSelection 속성은 session 실행 시 프레임 소스 선택 방법을 정의합니다.
| 이름 | 방법 |
|---|---|
| Auto (기본값) | transform 순서에 따라 첫 번째로 사용 가능하고 active인 자식 노드를 자동 선택합니다. |
| Manual | 수동 지정. session의 자식 노드만 지정할 수 있습니다. |
| FramePlayer | FramePlayer를 사용합니다. |
팁
Unity 오브젝트의 transform 순서는 Transform.GetSiblingIndex()로 판단할 수 있고, Hierarchy 뷰의 오브젝트 정렬 순서로도 판단할 수 있습니다. 단, 다음 옵션을 꺼야 합니다(기본적으로 꺼져 있음): Edit > Preferences > General > Enable Alphanumeric Sorting.
session 조립 과정에서 프레임 소스는 다음 단계를 거쳐 선택됩니다.
- session은 자식 노드를 순회하며 transform 순서대로 모든 active 프레임 소스 컴포넌트를 수집합니다.
- AssembleOptions의 소스 선택 전략(AssembleOptions.FrameSource)에 따라 후보 목록을 필터링합니다.
- Auto (기본값): 모든 후보를 유지합니다.
- Manual: 수동으로 지정한 프레임 소스만 유지합니다.
- FramePlayer: 후보 목록을 FramePlayer로 교체합니다.
- 후보 목록을 다시 필터링하여 다음 컴포넌트를 제거합니다.
- 컴포넌트 자체에 의해 비활성화된 컴포넌트.
- 사용자 지정 카메라가 꺼져 있을 때(AssembleOptions.EnableCustomCamera가 false) 모든 사용자 지정 카메라 컴포넌트.
- (Android 플랫폼) AssembleOptions.DeviceList의 timeout 설정이 0보다 크고 후보 목록에 MotionTrackerFrameSource, ARCoreFrameSource 또는 AREngineFrameSource가 포함되어 있으면, 해당 최신 장치 지원 목록 다운로드를 시도합니다. 다운로드 업데이트 후 이러한 프레임 소스의 가용성이 변경될 수 있습니다. 다운로드 완료 또는 timeout 후 다음 단계가 계속됩니다.
- FrameSource.CheckAvailability()를 호출하고 FrameSource.IsAvailable에 접근하여, 남은 후보 컴포넌트의 가용성을 목록 순서대로 확인합니다.
- 확인 결과 사용 가능한 첫 번째 프레임 소스를 선택합니다.
컴포넌트 자체의 비활성화 조건은 컴포넌트 내부에서 정의됩니다. 일반적인 경우는 다음과 같습니다.
- 지원되지 않는 시스템에서 실행되는 경우. 예를 들어 Android가 아닌 시스템에서는 AREngineFrameSource가 비활성화됩니다.
- 필요한 서드파티 SDK가 설치되지 않은 경우. 예를 들어 XREAL SDK가 설치되지 않으면 XREALFrameSource가 비활성화됩니다.
- 설정된 조건이 충족되지 않은 경우. 예를 들어 장치의 MotionTrackerCameraDeviceQualityLevel이 MotionTrackerFrameSource.DeviceQualityLevel보다 낮으면 MotionTrackerFrameSource가 비활성화됩니다.
최종적으로 어떤 프레임 소스도 선택되지 않으면 session은 Broken 상태로 들어가며, session 보고서의 BrokenReason 필드 값은 NoAvailabileFrameSource입니다.
참고
장치 목록 업데이트가 완료된 후 장치 목록이 변경되면 프레임 소스의 가용성도 변경될 수 있습니다. 이때 session의 동작은 장치 지원 및 session 보고서를 참고할 수 있습니다.
다음 단계
- scene에서 frame source 그룹 추가를 시도합니다