Table of Contents

Камера Unity в AR-сценах

AR-опыт в Unity зависит от камеры. В этой статье объясняется роль камеры в AR-сценах и то, как session управляет свойствами камеры, чтобы обеспечить корректный AR-опыт.

Перед началом

Роль камеры в AR-сценах

В Unity камера используется для отображения игрового мира игроку, но в AR-сценах ее роль еще важнее. Она не только рендерит виртуальный контент, но и должна выравниваться с реальным миром, чтобы виртуальные объекты корректно накладывались на реальную сцену.

Это видео показывает простую AR-сцену. Слева находится вид Scene, справа - вид Game. Видео было записано в режиме Play в Unity Editor с использованием simulation data. Содержимое в виде Game такое же, как видит пользователь на телефоне в реальном мире.

В этом видео камера, представляющая пользователя (значок камеры), движется в соответствии с движением пользователя в реальном мире. Белый конус показывает положение и ориентацию камеры за прошедший период. В виде Game камера не только показывает виртуальный контент из вида Scene, но и накладывает изображение реального мира в нижней части виртуального контента. Это типичное поведение камеры в AR-сцене.

Чтобы виртуальные объекты корректно накладывались на реальную сцену, некоторые свойства камеры нужно настраивать в соответствии с состоянием выполнения AR. Эти свойства включают:

  • transform камеры (позиция и ориентация)
  • field of view (FOV), aspect ratio и projection matrix камеры
  • настройки culling камеры (<xref:UnityEngine.GL.invertCulling?displayProperty=nameWithType>)
Предупреждение

При разработке приложения изменять эти свойства на session camera не поддерживается, потому что это может привести к некорректному выравниванию виртуального контента с реальным миром и повлиять на пользовательский опыт. Даже если эти свойства будут изменены каким-либо способом, AR-система перезапишет эти изменения во время выполнения, либо может возникнуть непредсказуемое поведение из-за несоответствия между отрисованными и вычисленными данными.

В зависимости от объекта, который управляет этими свойствами, камера, используемая session, может быть двух типов: камера под управлением session и камера не под управлением session.

Камеры под управлением session

Если session camera не принадлежит какой-либо внешней системе, например гарнитуре или AR Foundation, session автоматически управляет указанными выше свойствами камеры, чтобы она была правильно выровнена с реальным миром.

transform

Transform камеры (позиция и ориентация) session корректирует в соответствии с состоянием выполнения AR-функции. Обычно session обновляет позицию и ориентацию камеры на основе данных motion tracking и/или данных tracking target, чтобы контент, видимый пользователю, соответствовал реальному миру.

В Unity центральная точка отсчета для всего AR-tracking называется session origin, а правило, определяющее этот origin во время выполнения session, называется center mode. Поведение transform камеры различается в разных center mode:

  • В center mode <xref:u:easyar.ARSession.ARCenterMode.Camera> камера может свободно перемещаться.

    Обычно mode <xref:u:easyar.ARSession.ARCenterMode.Camera> редко используется приложениями.

  • В других center mode, например <xref:u:easyar.ARSession.ARCenterMode.FirstTarget>, камера не может свободно перемещаться.

    <xref:u:easyar.ARSession.ARCenterMode.FirstTarget> - это режим, используемый большинством AR-приложений.

Предупреждение

Масштаб transform камеры всегда должен оставаться (1, 1, 1). Изменение масштаба камеры может привести к непредсказуемому поведению.

Projection matrix

Projection matrix камеры обновляется каждый кадр session в соответствии с intrinsics физической камеры, чтобы виртуальный контент корректно накладывался на реальную сцену.

Настройки culling

Настройки culling камеры (<xref:UnityEngine.GL.invertCulling?displayProperty=nameWithType>) корректируются в соответствии с настройками mirror session, чтобы виртуальный контент правильно рендерился в реальной сцене.

Когда параметр, соответствующий текущей камере в <xref:u:easyar.ARSession.HorizontalFlip>, равен <xref:u:easyar.ARSession.ARHorizontalFlipMode.World>, <xref:UnityEngine.GL.invertCulling?displayProperty=nameWithType> устанавливается в true. Это конфигурация по умолчанию для front camera.

Фоновый видеопоток AR

В AR-сценах камера обычно рендерит видеопоток с физической камеры в качестве фона для усиления эффекта погружения. Session автоматически обрабатывает получение и рендеринг видеопотока и обеспечивает его правильное выравнивание с виртуальным контентом.

Камеры не под управлением session

При использовании гарнитуры или AR Foundation, а также когда в реализации для <xref:u:easyar.FrameSource> указано <xref:u:easyar.FrameSource.IsCameraUnderControl> как false, session не управляет указанными выше свойствами камеры. Вместо этого ими управляет внешняя система.

Предупреждение

Хотя в этом случае session не управляет свойствами камеры, ими все равно управляет сторонняя система, например SDK гарнитуры или AR Foundation, поэтому изменять эти свойства во время разработки по-прежнему не поддерживается.

Что учитывать при копировании камер

Иногда может потребоваться скопировать параметры session camera на другую камеру. В этом случае обратите особое внимание на два момента:

  • Время получения свойств: при использовании управляемой камеры см. Получение результата session, чтобы получить эти параметры в нужный момент; при использовании камеры, не управляемой session, см. документацию сторонней системы, чтобы получить их в нужный момент.
  • Field of view (FOV), aspect ratio и projection matrix камеры: используйте <xref:UnityEngine.Camera.projectionMatrix?displayProperty=nameWithType>, чтобы получить projection matrix камеры и скопировать ее в другую камеру. <xref:UnityEngine.Camera.fieldOfView?displayProperty=nameWithType> и <xref:UnityEngine.Camera.aspect?displayProperty=nameWithType> математически являются частью projection matrix, поэтому одного использования <xref:UnityEngine.Camera.fieldOfView?displayProperty=nameWithType> и <xref:UnityEngine.Camera.aspect?displayProperty=nameWithType> недостаточно.

Следующие шаги

Связанные темы