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

Epic Games выпустила 4.20 сразу после того, как стали доступны бета-версии iOS 12 и Xcode 10. Эта версия поддерживала API-интерфейсы ARKit 2.0, но не было достаточно времени для создания образца, который показал, как мы ожидали их использования в UE4. Для версии 4.21 Зак Пэрриш и я сокращали список образцов дополненной реальности, которые мы хотим сделать доступными. Два примера, которые имеют отношение к этому обсуждению, - это ARSaveLoad и ARSharedWorld.

ARSaveLoad

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

Первый шаг - создать сцену AR, которую вы хотите сохранить на потом. Нажав кнопку «Создать», вы перейдете к варианту нашего стандартного шаблона AR для портативных устройств. Как только плоскость станет видимой, вы можете коснуться любого места в пределах этой плоскости, чтобы создать фигуру. Затем вам нужно просканировать область, чтобы привести сцену AR в сопоставленное состояние. В этот момент кнопка сохранения станет зеленой, что позволит вам сделать снимок текущих данных. Сохраните снимок и закройте приложение.

Теперь снова запустите приложение, и вы увидите, что в главном меню включены кнопки загрузки и удаления.

Нажмите кнопку загрузки, и вы снова вернетесь в AR, снова отображая сцену. Он начинается с того момента, когда вы сохранили сцену, и начинает перемещать данные. Прежде чем актеры могут быть восстановлены в мире, необходимо завершить перемещение, чтобы они появлялись в тех же местах. Как только вы дойдете до этой точки, появятся ранее сохраненные формы. На видео ниже показан пример выполнения. Обратите внимание, что есть изображение в рамке изображения, которое было снято при сохранении данных AR. Эта картинка поможет вам согласоваться с вашей предыдущей позицией и ускорить процесс перестановки.

Теперь мы рассмотрим процесс Blueprint, который проведет вас от начала до конца. Прежде всего, это новый поток сцены.

Это наш стандартный процесс при запуске сеанса с использованием портативного шаблона AR. Он запускает сеанс с выбранным вами объектом конфигурации и добавляет меню отладки для детализации информации сцены AR. Я пропущу создание формы на основе прикосновения, поскольку это то же самое, за исключением добавления вновь созданной формы в список для повторения позже. После того, как наша сцена нанесена на карту, мы можем сохранить ее в слот для сохранения.

Наш объект сохранения состоит из 4 частей: список данных актера, снимок изображения с камеры, данные AR и, наконец, отметка времени, когда данные были сохранены. Для каждого актера мы сохраняем его преобразование, цвет и идентификатор меша, который он использует, как показано ниже.

И изображение предварительного просмотра, которое мы захватили из потока камеры, и данные мира AR представляют собой массив байтов. Оба элемента захватываются и сжимаются асинхронно. Переменные объекта сохранения Blueprint только для наших данных показаны ниже.

В процессе сохранения достаточно большое количество узлов, поэтому я разбил изображения на несколько частей. Первая часть показывает вам, как сохранить информацию об актере. Создается новый объект сохранения игры, каждый субъект посещается, строит структуру, которую мы видели ранее, и эта новая структура добавляется в список сохраненных субъектов.

После сохранения акторов мы просим ARKit сериализовать их граф объектов в байтовый массив, который мы сжимаем в фоновом режиме. Затем изображение камеры используется для создания JPEG, который поворачивается в зависимости от текущей ориентации устройства. Вращение и создание JPEG выполняются на графическом процессоре эффективно с использованием API-интерфейсов Apple для обработки изображений.

Последний шаг - сохранить массивы в объекте сохранения игры и заставить движок записать этот объект на диск. Обратите внимание, что мы используем только один слот для нашего сохранения, поэтому он перезапишет предыдущее сохранение, если оно есть.

Теперь, когда сцена AR сохранена, вы можете выйти из приложения, чтобы выполнить процесс загрузки. Этот процесс немного сложнее, потому что он выполняется поэтапно. Все данные загружаются изначально, но акторы не должны создаваться снова, пока отслеживание не будет перемещено. После загрузки данных изображение предварительного просмотра создается из сохраненного массива jpeg.

Сжатый граф объекта AR устанавливается на объекте конфигурации. Сессия начинается с того, что ARKit берет эти данные и использует их в качестве основы для процесса перемещения.

Статус отображения AR проверяется каждый кадр, и как только статус отображается, запускается событие для порождения актеров.

Есть кнопка удаления сохранения, но это не очень важно для настройки ваших собственных постоянных или общих миров, поэтому мы не будем углубляться в это здесь. Вы можете изучить Blueprints для этого после выпуска 4.21 и набора образцов AR на нашем рынке. Имейте в виду, что схема Blueprint или внешний вид некоторых экранов могут отличаться. Это предварительный просмотр того, что должно произойти, и Зак оттачивал вещи, даже когда я работал над этим постом.

ARSharedWorld

Как я упоминал в начале этого поста, совместное использование сцен AR для многопользовательской игры - это тот же процесс, что и в примере с сохранением и загрузкой. Образец ARSharedWorld следует немного другим путем. В этом примере у вас должно быть как минимум 2 iDevices для запуска. Один человек является хостом и отвечает за сканирование в общей AR-сцене. После того, как мир нанесен на карту, хост сеанса может поделиться данными с подключенным клиентом через встроенный сетевой код UE4. Поскольку это сетевой сеанс, образец использует функцию создания фигур, к которым прикасается пользователь, и добавляет для этого поддержку сети. Это позволяет клиенту или хосту создавать фигуры в сцене в общем пространстве AR. Каждому игроку дается уникальный цвет, поэтому вы можете сказать, кто какие фигуры породил.

Чтобы облегчить доставку потенциально больших объемов двоичных данных, я написал несколько базовых классов C ++ для наследования ваших проектов AR. Эти классы C ++ - ARSharedWorldGameMode, ARSharedWorldGameState, ARSharedWorldPlayerController. В игровом режиме осуществляется управление доставкой данных каждому игроку в игре. Состояние игры удерживает данные по мере их доставки и запускает событие, которое Blueprints может прослушивать для статуса завершения. Контроллер игрока сообщает игре, когда она готова к приему данных, а затем выполняет маршрутизацию данных от хоста к клиенту через вызовы RPC. Контроллер игрока определяет свое состояние готовности по тому, был ли ему реплицирован актор состояния игры. Это может занять некоторое время после подключения, поэтому контроллер игрока уведомит игровой режим, как только этот клиент получит объект. Вот как выглядит поток данных:

  1. Хост ждет подключения
  2. Клиент подключается
  3. Хост создает контроллер игрока, начинает реплицировать актеров клиенту
  4. Клиент получает контроллер игрока, начинает опрос состояния игры.
  5. Клиент получает актор состояния игры, вызывает функцию RPC ServerMarkReadyForReceiving ()
  6. Хост ожидает уведомления игры о том, что данные AR готовы к доставке, SetARWorldSharingIsReady ()
  7. Хост вызывает функцию RPC ClientInitSharedWorld () с размером изображения предварительного просмотра и размером мира AR, чтобы клиент мог отображать прогресс
  8. Хост вызывает 2 функции RPC за такт, ClientUpdatePreviewImageData () и ClientUpdateARWorldData (), пока не будут доставлены все данные.
  9. Клиент объединяет блоки данных в буферы, хранящиеся в состоянии игры.
  10. Состояние клиентской игры уведомляет игру после получения всех данных.
  11. Затем клиент выполняет те же шаги, что и в ARSaveLoad для загрузки мира AR.

Вы можете найти все источники для доставки общего мира в Engine / Source / Runtime / AugmentedReality. Поддерживаются способы настройки этих классов: как соединение в процессе, так и соединение при запуске. Если клиент присоединяется вначале, он будет видеть экран прогресса только до тех пор, пока хост не нанесет на карту мир и не доставит данные. Если хост уже создал свой моментальный снимок данных, то в тот момент, когда клиент присоединится и будет готов, потоковая передача начнется.

ПРИМЕЧАНИЕ. Если у вас возникают проблемы с переходом клиентов в сопоставленное состояние, убедитесь, что оба устройства используют одинаковую ориентацию (альбомная влево, альбомная вправо, портретная). .

Вот несколько видеороликов о том, как это выглядит из игрового процесса.

Вот последовательность действий хоста Blueprint от момента нажатия кнопки «Поделиться» до обмена данными AR.

А вот событие Blueprint в состоянии игры на клиенте.

UE4 4.21

В выпуске 4.21 будет код и образцы, с которыми вы можете поэкспериментировать. Если вы не против загрузить исходный код самостоятельно, вы можете получить его с GitHub прямо сейчас из ветки Dev-VR. Если у вас есть доступ Perforce, вы можете получить код из // UE4 / Dev-VR. В этих источниках нет образца контента, но вы сможете использовать базовую поддержку C ++. Мы думаем, что все образцы будут упакованы вместе как одна загрузка. В настоящее время у нас есть 5, которые мы надеемся предоставить, но мы посмотрим, чем завершится процесс контроля качества.

Специальная благодарность

Зак Пэрриш проделал всю полировку образцов, включая добавление более приятного пользовательского интерфейса, организацию Blueprints для согласованности и добавление комментариев к Blueprints. Вы можете сказать, что очистка произошла в образце общего мира до образца сохранения / загрузки. Он также терпел меня, пока мы вместе работали над этими сэмплами, и одно это заслуживает благодарности.