# AR Foundation Study Note
## Unity XR SDK
- [Document](https://docs.unity3d.com/2022.1/Documentation/Manual/xr-sdk.html)
- 描述 Subsystem 和 Provider 的架構關係,可能是將來要**串接 novatek 程式的關鍵**。
- [XR Plug-in Framework](https://docs.unity3d.com/Manual/XRPluginArchitecture.html)
- [XR SDK Note](/t3rNlzdUSqepK7zNQbCCLA)
## XRLoader
- 每個 provider plug-in 都有一個 Loader。
- Loader 負責 create 和 destroy subsystem 的 instance。
## AR Foundation Debug menu
- [Document](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@5.0/manual/ar-debug-menu.html)
- 可以觀察效能表現的 Component ( ex. FPS、Tracking Mode )。
## Trackable 具有 [TrackingState](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@5.0/api/UnityEngine.XR.ARSubsystems.TrackingState.html)
- 分為三種 State:
- Limited:正在追蹤,但遭到限制或追蹤品質差 (物體部分離開畫面、遭到遮擋)
- None:不在追蹤
- Tracking:正在追蹤
## ARInputManager
- [Document](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@5.0/api/UnityEngine.XR.ARFoundation.ARInputManager.html)
- Unity 和 Plugin 的 API,負責將 SDK 偵測到的 Data 傳送進 AR Session。
## ARCameraManager
- [Document](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@5.0/api/UnityEngine.XR.ARFoundation.ARCameraManager.html)
- 管理 ARCamera 的特性。
- 可以偵測現實環境中光源的亮度值、顏色、方向等等。
- 儲存這些 Data 的 Struct [ARLightEstimationData](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@5.0/api/UnityEngine.XR.ARFoundation.ARLightEstimationData.html)
- [如何取得偵測值](https://www.youtube.com/watch?v=nw6-U_mSvQQ&ab_channel=DilmerValecillos)
## AR Session
- [Document](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@5.0/api/UnityEngine.XR.ARFoundation.ARSession.html)
- 控制一個 AR Session 的 lifecycles 和 configuration。
- 可以控制 AR 應用的 Frame Rate、確認是否可使用 AR、讓我們知道 AR Session 的狀態。
## XR Origin (a.k.a AR Session Origin before 5.0.0)
- [Document](https://docs.unity3d.com/Packages/com.unity.xr.core-utils@2.1/api/Unity.XR.CoreUtils.XROrigin.html)
- AR Session Space 的 Origin。
- 儲存一些會經由 locomotion 操作的 GameObject (ex. Camera)。
- 控制 camera 的 Y offset。
## Subsystem
- [Document](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@5.0/manual/arsubsystems/arsubsystems.html)
- Unity 的 Plug-in 提供可以 impilement subsystem 的 Provider。
- AR Foundation defines its AR features using subsystems.
- Subsystem implementations are called providers, and are typically made available in separate packages called provider plug-ins.
## Manager
- [Document](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@5.0/manual/trackable-managers.html)
### 簡介
- 一種 Manager 掌管一種 AR feature 對應的 AR subsystem。
- Manager is a component that provides a scripting interface for an AR feature in a scene.
- Managers make subsystem data accessible in a scene as GameObjects and components.
### Trackable Manager
- tracking subsystems 定義:AR Foundation subsystems detect and track objects in the physical environment
- 而這些 tracking subsystems 的 Manager 就是 Trackable Manager
- trackable 定義: a special component that represents anything that can be detected and tracked in the real world. (ex. Planes, point clouds, anchors, environment probes, faces, body, images, and 3D objects)
- Trackable Manager 藉由 tracking subsystems 所偵測到的 data 去控制 Trackable 和它的 GameObject。 (ex. ARPlaneManager generates ARPlane trackables using data from the XRPlaneSubsystem)
### ARHumanBodyManager
- 儲存 humanBodyPrefab
#### ARHumanBody
- Data:Joint (相對於 Human Body Origin 的 position 和 rotation), The pose for the human body origin
### AROcclusionManager
- Data:depth texture, depth confidence texture
### AREnvironmentProbeManager
- 控制 EnvironmentProbe 的生成
#### AREnvironmentProbe
- Data:Cubemap texture
- 可以控制偵測範圍 (extents)
#### ARInputManager
- XRInputSubsystem 提供 Device Tracking 功能,可以取得 Physical Device 的 Pose (ex. 手把、頭盔)
- TrackedPoseDriver 可以直接取得 Device 的 Pose,並將此訊息作用在 Session 中的 GameObject
## Extending AR Foundation
- [Document](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@5.0/manual/architecture/extensions.html)
- AR Foundation provides a native pointer to access platform-specific functionality and data when applicable. For example, the XRSessionSubsystem has a nativePtr property.
---
## Face Tracking 深入研究
- [UnityEngine.SubsystemsModule](https://docs.unity3d.com/2020.3/Documentation/ScriptReference/UnityEngine.SubsystemsModule.html) 描述 Unity 中 Subsystem 使用的 Class
- A subsystem is initialized from a SubsystemDescriptorWithProvider
### XRFaceSubsystemDescriptor
- 其中的 Create 可以創造 subsystem descriptor,此 descriptor 會註冊為一個 XRFaceSubsystem 的實作
- 主要紀錄此 XRFaceSubsystem 的規格,ex. 可否追蹤眼睛?可否生成 FaceMesh 的 vertices?是否可提供 normals、uvs?...
### XRFaceSubsystem.Provider
- 其中的 Method [GetChanges](https://docs.unity3d.com/Packages/com.unity.xr.arsubsystems@4.2/api/UnityEngine.XR.ARSubsystems.TrackableChanges-1.html#UnityEngine_XR_ARSubsystems_TrackableChanges_1_Dispose) 可以更新 add, update, remove 的 NativeArray
### SubsystemLifecycleManager
- [SubsystemLifecycleManager](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.SubsystemLifecycleManager-3.html#UnityEngine_XR_ARFoundation_SubsystemLifecycleManager_3_subsystem),subsystem 就是從這裡來的
- 其中的 `GetActiveSubsystemInstance()` 就是從 Loader 取得 subsystem 的 Method
- `EnsureSubsystemInstanceSet()` 會呼叫 `GetActiveSubsystemInstance()`
- 而 `EnsureSubsystemInstanceSet()` 會在 Manager OnEnable() 時呼叫
### ARTrackableManager
- [ARTrackableManager](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARTrackableManager-5.html)
- ARTrackableManager 繼承 SubsystemLifecycleManager
### ARFaceManager
- [Document](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARFaceManager.html)
- When enabled, this component subscribes to `ARFaceManager.facesChanged` event to update face data. If this component is disabled, and there are no other subscribers to those events, face detection will be disabled on the device.
### ARFace
- Data:Eye Transform, normals, vertices (Triangle Mesh)
### ARFaceMeshVisualizer
### ARFacesChangedEventArgs
### ARFaceUpdatedEventArgs