Точка входа Unity AR — AR Session
AR-сеанс (session) — это входная точка для всех AR-функций. В этом разделе вы узнаете базовые понятия AR Session, ее состав, процесс выполнения и то, как она соотносится с AR Session в Unity AR Foundation. Вы также узнаете, как именно работает поток данных EasyAR Sense в Unity.
Что такое AR Session
Все AR-процессы, например отслеживание объектов, выполняются внутри нативной библиотеки, то есть EasyAR Sense. session — это основная входная точка AR-функций в Unity. Она управляет процессом работы и состоянием AR-системы, включая чтение данных из физической камеры и сенсоров, анализ реального мира, управление перемещением и рендерингом виртуальной камеры и других объектов в сцене.
flowchart LR
A((Изображения<br>и другие данные))
B[Session]
C([Camera])
O([Origin])
T([Target])
A --> B
B -. transform .-> C
B -. transform .-> O
B -. transform .-> T
[Необязательно] session EasyAR и session AR Foundation
EasyAR session — это ключевой компонент EasyAR в Unity, который может работать независимо от любых сторонних или системных AR-функций. А session AR Foundation является частью Unity XR framework и может использовать только функции, предоставляемые Unity XR-плагинами, такими как ARKit или ARCore.
flowchart TD
A1[EasyAR<br>AR Session]
A2[EasyAR Sense]
A1 --> A2
B1[AR Foundation<br>AR Session]
B2[ARKit Plugin]
B3[ARCore Plugin]
B1 --> B2
B1 --> B3
При использовании EasyAR обычно не требуется одновременно устанавливать и использовать AR Foundation. Например, функции отслеживания изображений, отслеживания движения и другие предоставляются EasyAR Sense самостоятельно.
В некоторых случаях может потребоваться совместить EasyAR Sense с AR Foundation, чтобы использовать дополнительные функции и интерфейсы, предоставляемые AR Foundation, например обнаружение плоскостей на части устройств. В этом случае EasyAR Sense взаимодействует с Unity Engine через интерфейсы, предоставляемые AR Foundation.
Однако, поскольку EasyAR предоставляет больше функций и более полную адаптацию устройств, чем системный AR, самостоятельное использование AR Foundation обычно не позволяет получить такой же эффект, как EasyAR.
Состав session
Типичная session в основном состоит из следующих частей:
- frame source: компонент, предоставляющий изображения физической камеры и данные сенсоров; иногда эти компоненты также предоставляют данные отслеживания движения. Например, CameraDeviceFrameSource и MotionTrackerFrameSource
- frame filter(s): компоненты, предоставляющие конкретные AR-функции, например ImageTrackerFrameFilter
- camera: объект виртуальной камеры в сцене
- origin: объект источника координат для отслеживания движения
Примечание
В понятиях AR Foundation отслеживание движения является обязательной функцией, поэтому origin предоставляется всегда.
В системе EasyAR отслеживание движения является необязательной функцией, поэтому origin также является необязательным.
[Необязательно] поток данных session
Поток данных — одно из ключевых понятий EasyAR Sense. Он не влияет на разработку AR-приложений в Unity. Если вы хотите глубже понять принцип работы session, можно прочитать этот раздел.
В Unity одна session обычно выражает один поток данных EasyAR Sense.
flowchart LR
S[Frame Source]
R[Input Frame Recorder<br>Video Input Frame Recorder]
ift[iFrameThrottler]
iff[iFrameFork]
i2f[i2FAdapter]
fb[fbFrameFork]
i2o[i2OAdapter]
FOT[Object Tracker]
FIT[Image Tracker]
FMT[Mega Tracker]
FSSM[Sparse Spatial Map]
FST[Surface Tracker]
FDS[Dense Spatial Map]
FCR[Cloud Recognizer]
ofj[oFrameJoin]
off[oFrameFork]
ofb[oFrameBuffer]
O(( ))
ODS(( ))
OCR(( ))
S ==> R ==> ift ==> iff
iff --> i2f
i2f --> fb
fb -.-> FOT -.-> ofj
fb -.-> FIT -.-> ofj
iff ==> i2o ==> ofj ==> off ==> ofb ==> O
iff -.-> FMT -.-> ofj
iff -.-> FSSM -.-> ofj
iff -.-> FST -.-> ofj
iff -.-> FDS -.-> ODS
iff -.-> FCR -.-> OCR
off --> i2f
ofb --> ift
Этот поток данных создается во время запуска session. За исключением выделенных на схеме путей данных, подключение остальных частей зависит от AR-компонентов, включенных во время запуска.
Поэтому, изменяя компоненты, включенные в session, можно гибко менять структуру и функции потока данных, а также удобно одновременно включать несколько AR-функций. Этот способ подробно описан в следующих абзацах.
Процесс session
flowchart LR
i[Инициализация<br>Initialize]
a[Сборка<br>Assemble]
starta["Запуск (собранной)<br>StartSession(Assembled)"]
start[Запуск<br>StartSession]
update((Обновление<br>update))
stop[Остановка<br>StopSession]
di[Деинициализация<br>Deinitialize]
i --> a --> starta --> update --> stop --> di
i --> start --> update
Инициализация
Инициализация — это процесс запуска EasyAR Sense с использованием license key. До инициализации доступны только очень немногие интерфейсы EasyAR Sense. После инициализации AR-функции активируются.Сборка (Assembling)
Процесс сборки на основе параметров сборки выбирает подходящие компоненты из сцены и соединяет их в единую рабочую единицу. Обычно этот процесс выполняется автоматически при запуске, но до запуска также можно вручную вызвать интерфейс сборки. После завершения сборки можно запустить уже собранную session, чтобы пропустить процесс сборки и ускорить запуск.
У процесса сборки есть еще одно важное назначение: определять доступность AR-компонентов и источников ввода, а также выбирать самый подходящий источник ввода из всех кандидатов. Этот шаг также можно использовать для определения, может ли текущая session работать на текущем устройстве.Процесс сборки делится на два этапа
- На первом этапе запускается обновление списка поддержки устройств, и после фиксированного времени ожидания согласно конфигурации начинается сборка. Если после ожидания первого этапа список поддержки устройств уже обновлен, процесс сборки завершается;
- Иначе процесс сборки переходит ко второму этапу, который выполняется после завершения обновления списка поддержки устройств. На этом этапе, если доступный frame source меняется с отсутствия доступного frame source на наличие доступного frame source и запуск session после первого этапа завершился ошибкой, будет выполнена попытка повторно запустить session.
Независимо от того, завершилось ли обновление списка устройств на первом этапе, session продолжит выполнять последующие шаги после завершения первого этапа.
Запуск
Запуск — это процесс начала работы AR-функций. До запуска компоненты AR-функций не обрабатывают никакие данные. После нормального запуска session начинает управлять перемещением некоторых объектов сцены и, при использовании некоторых источников ввода, управлять рендерингом изображения физической камеры.Обновление
Процесс обновления выполняется в каждом кадре рендеринг-цикла Unity. На основе результатов работы текущих AR-функций он каждый кадр изменяет transform виртуальной камеры (для некоторых источников ввода), origin и отслеживаемых targets. На разных устройствах момент выполнения процесса обновления отличается, но он обязательно выполняется до рендеринга.Остановка
Остановка завершает работу AR-функций; объекты в сцене больше не будут управляться session, а данные источника ввода не будут обрабатываться.Деинициализация
Деинициализация освобождает часть глобальных ресурсов (динамическая библиотека не выгружается). После деинициализации компоненты AR-функций нельзя использовать.
Примечание
Все AR-функции можно использовать только после ARSession.StartSession.
Жизненный цикл session по умолчанию
flowchart LR
uload("BeforeSceneLoad")
ustart("MonoBehaviour.Start")
udestroy("MonoBehaviour.OnDestroy")
oi{Initialize<br>OnStartup}
ostart{AutoStart}
i[Инициализация<br>Initialize]
start[Запуск<br>StartSession]
update((Обновление<br>update))
stop[Остановка<br>StopSession]
uload -.-> ustart -.-> udestroy
uload --> oi -. true .-> i
ustart --> ostart -. true .-> start
udestroy --> stop
i --> start --> update --> stop
Жизненный цикл session обычно определяется временем вызова интерфейсов. При настройках по умолчанию session автоматически выполняется в следующие моменты:
Инициализация (EasyARSettings.InitializeOnStartup ==
true)
Автоматическая инициализация выполняется в момент BeforeSceneLoad в Unity.Запуск (ARSession.AutoStart ==
true)
Автоматический запуск выполняется в момент MonoBehaviour.Start() session.Остановка
Автоматическая остановка выполняется в момент MonoBehaviour.OnDestroy() session.
Состояние session
ARSession.State описывает состояние session. У session есть следующие состояния:
| Состояние | Описание |
|---|---|
| None | Начальное состояние, session не запущена и не собрана |
| Broken | session повреждена из-за ошибки сборки или другой причины |
| Assembling | В процессе сборки; обычно процесс сборки может длиться несколько кадров |
| Assembled | Сборка успешно завершена, но session еще не запущена |
| Ready | session успешно запущена; это состояние длится только один кадр |
| Running | session выполняется |
| Paused | session приостановлена |
Обычно состояние session изменяется при вызове интерфейсов запуска, остановки и подобных. Во время выполнения, если возникает серьезная ошибка, session также может перейти в состояние Broken. session, перешедшая в состояние Broken, не может возобновить работу; необходимо вызвать остановку и затем запустить ее заново.
По состоянию session можно понять, находится ли текущая session в доступном состоянии. Подавляющее большинство функций можно использовать только в состояниях Ready или Running.
Состояние отслеживания движения
ARSession.TrackingStatus описывает состояние отслеживания движения session; оно показывает качество отслеживания движения устройства и имеет следующие состояния:
| Состояние | Описание |
|---|---|
| Optional<MotionTrackingStatus>.Empty | Функция отслеживания движения не включена или session не выполняется |
| NotTracking | Результат отслеживания движения недоступен; возможные причины: идет инициализация, отслеживание потеряно или выполняется релокализация |
| Limited | Отслеживание движения действительно, но результат не очень хороший; возможные причины: слишком слабая текстура текущей области или слишком быстрое движение |
| Tracking | Хорошее качество отслеживания движения |
Примечание
В понятиях AR Foundation отслеживание движения является обязательной функцией, поэтому его состояние отслеживания объединено с состоянием session.
В системе EasyAR отслеживание движения является необязательной функцией, поэтому состояние отслеживания существует отдельно и может быть пустым.
Где находятся состояния отслеживания других AR-функций
Поскольку AR-функции могут одновременно отслеживать несколько объектов, состояние отслеживания изображений и состояния отслеживания других AR-функций находятся не в session, а в компонентах отслеживаемых целей.
Можно использовать TargetController.IsTracked, чтобы узнать, находится ли отслеживаемая цель в состоянии отслеживания, или использовать события TargetController.TargetFound иTargetController.TargetLost, чтобы корректировать логику содержимого приложения при изменении состояния отслеживания.
Дальнейшие шаги
- В приложении использовать session
- Быстрый эксперимент
- Больше базовых компонентов
- Подробнее о принципах работы session
- Unity XR и AR Foundation
- Базовые принципы Sense
Создание
- Попробуйте создать session в сцене
Управление выполнением
- Узнайте о способах и назначении инициализации
- Узнайте, как определять доступность и поддержку устройства
- Узнайте о способах управления выполнением session
Доступ к компонентам и результатам
- Попробуйте обращаться к компонентам AR-функций
- Узнайте, как получать результаты работы session
Справочник компонентов
- Справочник компонента ARSession