Что нового в ARKit 2.0

Прошло две недели после окончания конференции WWDC. Сессии отсмотрены, документация перечитана, демо проекты сделаны, а значит, можно оформить всю собранную информацию в статью.

2di0fzqtunavm8tg3hykpecsijc.jpeg

В первой версии ARKit была возможность отслеживать перемещение телефона в пространстве, определять количество и теплоту света вокруг, а также получать информацию о горизонтальных плоскостях. В ARKit 1.5, который вышел вместе с iOS 11.3, улучшили качество изображения, добавили определение вертикальных плоскостей, распознавание статичных 2D-изображений и автофокус. Давайте посмотрим, что добавили в версии 2.0.

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

Реализовано это так: у ARSession появился метод getCurrentWorldMapWithCompletionHandler, который возвращает ARWorldMap. Внутри этого объекта хранится информация об опорных точках, с помощью которых ARKit может восстановить нулевую координату сцены, а также массив ARAnchors, к которым могут быть привязаны объекты. ARWorldMap можно сохранить или отправить куда-нибудь. Для восстановления карты нужно передать её в поле initialWorldMap у ARSessionConfiguration перед запуском сессии. После запуска статус сессии перейдёт в состояние .limited с причиной .relocalizing. Как только ARKit соберёт достаточное количество точек для восстановления, нулевая координата будет выставлена в правильное положение и статус сессии перейдёт в состояние .normal.

Для лучшей работы Apple советует следующее:


  • сканируйте сцену с разных сторон. Массив точек будет больше и точнее;
  • окружение должно быть статическим и хорошо текстурированным;
  • массив точек должен быть достаточно плотным.

Самостоятельно следить за этими параметрами не нужно, так как теперь у ARFrame есть поле worldMappingStatus. Но нужно их учитывать при проектировании приложения.

Механизм сохранения карты окружения позволил синхронизировать систему координат между несколькими устройствами. Зная положение каждого из устройств относительно карты окружения, можно построить многопользовательские сценарии.

На презентации была показана игра SwiftShot, в которой нужно стрелять из своих рогаток по рогаткам соперника.

z1lprfnvrnxq2o2sqdkl2vin344.png

Игра написана на Swift + SceneKit. Синхронизация действий пользователей происходит с помощью фреймворка MultipeerConnectivity. Исходники приложения можно скачать по ссылке.

Добавляя металлический объект виртуальной реальности на сцену, хотелось бы увидеть в нём отражение объектов реального мира. Для этого у ARWorldTrackingConfiguration появилось поле environmentTexturing. Если вы в качестве движка используете SceneKit и выставите поле environmentTexturing в .automatic, вы получите вот такой результат:

f3baouz187lrgfla2rgmoxjydik.jpeg

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

В ARKit 1.5 появилось отслеживание только статичных изображений. Во второй версии ограничение снято, и теперь можно получать координаты перемещающихся изображений. Подобный функционал раньше предоставлял SDK Vuforia. На презентации в качестве примера использования показали замену фото на видео в фоторамке:

moick3qpoyutswqgder0umkdjgc.gif

Для лучшего трекинга нужно использовать контрастные, хорошо текстурированные изображения с отчётливыми признаками. Xcode выдаст предупреждение, если это требование не соблюдается.

Для отслеживания изображений нужно использовать ARImageTrackingConfiguration. В конфигурацию передаётся массив trackingImages и выставляется maximumNumberOfTrackedImages. Координаты изображения будут возвращены в виде ARImageAnchor.

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

Для отслеживания объектов нужно создать ARReferenceObject из файла или каталога ресурсов и добавить его к ARWorldTrackingConfiguration.detectionObjects. Информацию об объектах вы будете получать в ARFrame.

В качестве примера на презентации показали отображение информации о статуэтке в музее в дополненной реальности.

В предыдущих версиях можно было получать координаты и поворот лица, полигональную сетку лица и массив блендшейпов (51 эмоция с прогрессом от нуля до единицы). Во второй версии мы увидим три новшества:


определение направленного света.

ARKit 2 использует изображение лица как источник информации о свете. С его помощью можно определить интенсивность, температуру и направление света. Это позволит сделать маски более реалистичными;


отслеживание языка.

К блендшейпам добавили tongueOut, который показывает [0,1] степень «высуности» языка. От себя могу добавить, что пробовали показать язык практически все мои знакомые, которым я давал поиграться с animoji;


отслеживание взгляда.

У ARFaceAnchor появились три новых поля: leftEyeTransform, rightEyeTransform и lookAtPoint. В интернете уже есть демки с примерами использования:


  • ускорились инициализация и определение плоскостей;
  • стало точнее отслеживание телефона в пространстве и определение плоскостей;
  • улучшилась точность определения границ плоскостей при расширении плоскости;
  • добавлена поддержка соотношения сторон 4:3 (теперь этот формат будет выбран по умолчанию).

Все улучшения, кроме перехода на соотношение сторон 4:3, будут применены к вашим приложениям автоматически. Для последнего нужно пересобрать приложение с новым SDK.


Если для вас информация была полезной, поддержите меня стрелкой вверх. А на вопросы я готов ответить в комментариях.

© Habrahabr.ru