AR-фреймворки для iOS: какой выбрать?
ARKit
К несомненным достоинствам ARKit можно отнести его нативность. Интеграция и настройка занимают всего несколько минут. Xcode любезно делает за вас половину необходимых операций, после чего фреймворк «просто работает». Очень легко организовать взаимодействие между ARKit и другими системными фреймворками (SpriteKit, SceneKit, Metal, CoreLocation и т.д.).
Библиотека хорошо оптимизирована и по-максимуму использует возможности железа последних моделей iPhone и iPad. Огромное количество вычислений, которые происходят под капотом, практически не сказывается на UX. Радует точность, с какой фреймворк распознает плоскости и маркеры. Не мешают этому ни плохое освещение, ни резкое перемещение устройства. Благодаря дополняющим друг друга технологиям VIO (Visual Inertial Odometry) и IMU (Inertial Measurement Unit), которые и составляют основу ARKit, ребятам из Apple удалось минимизировать ошибки в расчетах.
Не обошлось, конечно, и без недостатков. Во-первых, ARKit доступен только на устройствах с iOS 11+, поддерживается только на iPhone 6s и младше, iPad Pro (9.7, 10.5 или 12.9). К сожалению, это может оттолкнуть заказчиков, которые боятся потерять часть целевой аудитории.
ARKit спроектирован таким образом, что информация об объектах окружающего мира и положении в нем устройства постоянно калибруется. Из-за этого в начале сессии, пока данные недостаточно точны, создается ощущение «нестабильности» работы, избавиться от которого пока не удастся. Кроме того, если сессия достаточно длинная, незначительные, казалось бы, ошибки в показателях сенсоров будут накапливаться и становиться все более заметными.
При распознавании изображений возникают проблемы с позиционированием AR-объекта, объект плавает, не фиксируется четко в указанной точке. Аналогичное поведение наблюдается и в примере, опубликованном Apple. Тем не менее, объект, размещенный в заданной точке пространства практически не перемещается.
В некоторых случаях (маленькие черно-белые изображения не очень хорошего качества) распознавание маркера происходит, но система неверно определяет его координаты. В результате AR-объект отрисовывается в неправильном месте.
ARKit очень легок в освоении, чтобы начать работать, вам потребуется минимальный багаж знаний. В Сети уже опубликовано достаточно большое количество обучающих статей и примеров кода, а сообщество большое и отзывчивое, так что отыскать ответы на возникающие в процессе написания кода вопросы будет несложно.
OpenCV
Написанная на C++ библиотека OpenCV распространяется бесплатно и предоставляет вам возможность скачать iOS SDK с официального сайта или скомпилировать его самостоятельно.
Уже на этапе внедрения поклонников Swift ждет увлекательный квест по устранению ошибок компиляции, который грозит растянуться на несколько часов. К счастью, в Сети доступны пошаговые инструкции, опубликованные нашими боевыми товарищами, уже одолевшими несговорчивый фреймворк (например, OpenCV with Swift — step by step).
После того как вам удастся наконец запустить проект с подключенной библиотекой, возникнет вопрос, что же делать дальше. Возможно, вы решите поискать туториалы на официальном сайте. Там iOS-разработчиков будут ждать три примера использования старой версии фреймворка в проектах, ориентированных на iOS 8. Современных же статей, посвященных мобильной разработке с OpenCV, не так уж много. Видимо, это связано с тем, что все желающие освоить эту библиотеку давным давно это сделали и в разъяснениях больше не нуждаются.
Впрочем у новичков все же есть шанс освоить этот, вне всякого сомнения, мощный инструмент. Однако понадобится на это немало времени и сил. Как и любая другая низкоуровневая библиотека, OpenCV требует глубокого вдумчивого изучения, подробного разбора документации, просеивания тысяч дискуссий на форумах в поисках ответа на свой вопрос и бесконечных экспериментов.
Не забудьте, кстати, добавить к этому еще время на восстановление в памяти университетского курса математики, ведь выводить формулы за вас OpenCV не станет.
Wikitude
Начнем с того, что Wikitude — платный и отнюдь не дешевый фреймворк. Бесплатная версия содержит водяные знаки, поэтому использовать ее для релизной сборки вы не сможете.
Тем не менее библиотека стоит своих денег. В отличие от ARKit она поддерживает даже более старые устройства и версии системы. Продукт хорошо документирован, имеет множество статей, уроков и примеров кода, поэтому интеграция и реализация простейших задач у неподготовленного программиста займет всего несколько часов.
Основной сферой применения библиотеки является распознавание маркеров. В качестве последних могут использоваться любые изображения без альфа-канала. Правда, работает Wikitude только с родными форматами. Изображения маркеров приходится запаковывать в формат .wtc, 3D-модели преобразовывать в .wt3-файлы. Справедливости ради следует отметить, что Wikitude предоставляет средства для конвертации на своем веб-сайте.
В целом со своей задачей фреймворк справляется хорошо: маркеры распознаются, AR-объекты размещаются там, где вы запланировали, не плавают при изменении угла обзора или смещении камеры. Разместить картинку, видео или 3D-модель не составит труда, равно как и обеспечить их интерактивность. Поддерживается одновременная работа с несколькими маркерами, но при конфигурации классов библиотеки лучше ограничить их количество для повышения производительности.
Замечу однако, что при плохом освещении, а также неаккуратном перемещении устройства возникают проблемы с распознаванием маркеров даже в том случае, если для их создания использовались качественные исходные изображения.
Wikitude поддерживает JS и нативную версии SDK.
Если выберете для интеграции JS-версию, готовьтесь отринуть удобный Swift или милый сердцу Objective-C и сконцентрироваться на написании JavaScript кода. А так как последнее довольно мучительно при работе в Xcode, установите заодно Sublime или один из его заменителей. И постарайтесь писать сразу правильно, потому что процесс отладки и исправления ошибок будет нелегким.
Еще одно замечание касается оптимизации. При сколько-нибудь длительном взаимодействии с AR объектами JS версия фреймворка начинает заметно тормозить, fps сильно просаживается, что впрочем не удивительно.
Нативная версия SDK при всей своей дружелюбности практически лишена «магии». Фактически она только оповещает вас о том, что маркер распознан, сообщает его идентификатор и координаты в пространстве, после чего передает флаг вам в руки. Далее вы вольны использовать для отрисовки AR объектов свой любимый инструмент, например, OpenGL.
Источник
Тестируем возможности ARKit. Создаем игру с дополненной реальностью
На WWDC 2017 Apple анонсировала ARKit — SDK для работы с дополненной реальностью. Благодаря ему порог вхождения в эту технологию стал значительно ниже. Можно ожидать появления большого количества качественных игр и приложений.
Если вы смотрели Keynote, то, вероятно, вы уже в восторге от увиденного. Игровой мир, который инженеры Apple смогли развернуть на обычном столе при помощи ARKit, не может оставить равнодушными даже самых искушенных геймеров. Это был не просто прототип, а хорошо работающая технология, над которой действительно потрудились. В этом легко убедиться, запустив несколько демо или попробовав самим привнести что-либо виртуальное в наш мир.
Вынужден расстроить счастливых обладателей iPhone 6 и ниже. На данных девайсах все эти прелести жизни будут недоступны. Для использования всех ключевых функций ARKit необходим процессор А9 и выше. Apple, конечно, даст урезанный доступ к функциональности, но это уже совсем не то.
Дополненная реальность
Дополненная реальность (augmented reality, AR) — это виртуальная среда, которая накладывается на реальный мир для придания ему большей выразительности, информативности или просто ради развлечения. Термин, предположительно, был предложен исследователем компании Boeing Томасом Коделлом еще в 1990 году. Уже тогда начали появляться первые примеры устройств с применением данной технологии. Впервые дополненная реальность была реализована на электронных шлемах летчиков для вывода информации о полете и радаре.
Хочется спросить, чем же все занимались почти 20 лет и почему масштабное развитие эта технология получила лишь сейчас. Все предельно просто. Появление хороших камер в телефонах, сенсоров и развитие технологий компьютерного зрения сделали это возможным.
Что же можно сделать полезного и чего ждать в ближайшее время на полках AppStore? На самом деле все ограничивается лишь фантазией разработчиков. Можно с уверенностью назвать несколько отраслей, где AR произведет революцию с выходом нового фреймворка от Apple:
Возможности ARKit
ARKit — не волшебная палочка Гарри Поттера, а инструмент, который умеет грамотно обрабатывать большое количество данных, полученных от устройства. Благодаря камере и датчикам движения фреймворк отслеживает движение, находит поверхности и определяет освещенность. После анализа данных мы получаем конкретное представление об окружающем мире в виде точек пересечения, координат поверхностей и положении камеры в пространстве.
Основой задачей ARKit является слежение за окружающим миром (World Tracking) для создания виртуальной модели реального мира. Фреймворк распознает особенности видеокадров, отслеживает изменения их положения и сравнивает эту информацию с данными от датчиков движения. Результатом является виртуальная модель реального мира. Отдельная возможность — распознавание плоских горизонтальных поверхностей. ARKit находит плоскости и сообщает об их расположении и размерах.
Слежение за окружающим миром требует анализа картинки, получаемой от камеры. Для достижения наилучшего результата, необходимо хорошее освещение.
Основой ARKit являются ARSCNView и ARSKView . Они служат для отображения live видео и рендеринга 3D и 2D изображений. Как все уже догадались, это наследники от SCNView и SKView . Следовательно, ARKit не привносит каких-то невероятных особенностей в отображении данных. Это все те же движки для работы с 2D и 3D графикой, с которыми уже все знакомы. Поэтому порог вхождения в данную технологию будет достаточно низким. Apple знаменита любовью к своим технологиям и продуктам, но несмотря на это разработчики ARKit сделали поддержку Unity и Unreal Engine. Это положительно скажется на количестве качественных приложений, которые появятся в ближайшее время.
ARSCNView и ARSKView содержат в себе сердце ARKit — ARSession . Именно этот класс содержит в себе все необходимое для работы с дополненной реальностью. Для запуска ARSession необходимо передать конфигурацию работы сессии.
Тип конфигурации определяет стиль и качество работы AR, которое может быть достигнуто:
- На девайсах с процессором A9 и новее можно использовать ARWorldTrackingSessionConfiguration . Именно эта конфигурация дает возможность воспользоваться всей мощью нового фреймворка. Для вас будет создана модель окружающего мира в виртуальной реальности и предоставлена информация о плоскостях в поле видимости камеры. Это поможет расположить виртуальные объекты с максимальной точностью.
- На остальных девайсах, поддерживающих ARKit, будет доступна лишь ARSessionConfiguration . Базовый класс предоставляет только информацию о движении устройства в пространстве, но не строит виртуальных моделей. Это не даст необходимого эффекта и не позволит насладиться всем качеством новой технологии. Вам будет недоступна возможность фиксации виртуальных объектов относительно объектов реального мира.
После выбора типа конфигурации необходимо создать ее экземпляр, произвести настройку и запустить сессию:
Важно помнить, что ARKit потребляет довольно много энергии для расчетов. Если View с контентом не отображается в данный момент на экране, то имеет смысл приостановить сессию на это время, используя session.pause() .
После запуска сессии можно начинать работать с виртуальным контентом. Если хотите, чтобы ARKit распознавал плоскости, не забудьте установить значение planeDetection у конфигурации в значение horizontal . Изначально распознавание горизонтальных поверхностей выключено. Будем надеяться, что в будущем появится возможность находить и вертикальные поверхности, но пока только горизонтальные.
Способ получения информации об окружающей среде зависит от того, какой вид отображения данных вы будете использовать ARSCNView , ARSKView или Metal . Единицей информации, которую предоставляет ARKit, является ARAnchor . Если у вас включено распознавание поверхностей, то вы столкнетесь с сабклассом ARPlaneAnchor . Он содержит в себе информацию о найденных плоскостях. Благодаря данным якорям есть возможность ориентироваться в пространстве. В случае использования Metal вам придется вручную заниматься рендерингом. Тогда можете подписаться на обновления, используя делегат ARSessionDelegate у класса ARSession , и получать якоря от сессии. Если используете один из Apple движков для рендеринга объектов, тогда есть возможность воспользоваться более удобными делегатами ARSCNViewDelegate или ARSKViewDelegate .
На первый взгляд все довольно просто. Почти всю сложную работу делает ARSession . Давайте попробуем сделать тестовое приложение.
Тестируем возможности ARKit
Дополненная реальность сейчас у всех ассоциируется с игрой Pokémon GO, которая взорвала рынок игровой индустрии. Попробуем сделать нечто похожее.
Для создания тестового приложения мы воспользуемся ARSCNView для создания и рендеринга 3D моделей. Наша игра будет состоять из 2 этапов. Сначала мы будем расставлять мишени по комнате, а после пытаться как можно быстрее попасть по ним всем. Игра довольна примитивна, но продемонстрирует простоту создания игр с дополненной реальностью.
Начнем с того, что растянем на весь ViewController ARSCNView и создадим IBOutlet. Далее будем работать с ней, как с обычной SCNView . Произведем первоначальную настройку. Сделаем контроллер делегатом контактов физического мира и выведем статистику. Настроим запуск и паузу сессии при появлении и скрытии контроллера.
Выбор конфигурации сессии зависит от модели устройства, на котором запустили приложение. Крайне важно сделать эту проверку. Иначе, в случае неверной конфигурации, сессия пришлет ошибку и игра не запустится вообще.
ARKit настолько прост, что мы больше не будем использовать никакие его настройки. Единственное, что еще понадобится — это расположение камеры в пространстве виртуального мира. Остальное — дело техники и немного SceneKit.
Мы не будем здесь описывать обработку нажатий или подсчет очков. Это не так важно, и вы можете это увидеть сами в ДЕМО, представленном в конце статьи.
Наша игра содержит две модели объектов: шарик, которым мы будем стрелять, и летающие логотипы Touch Instinct. Для добавления этих моделей на экран, необходимо создать их, используя SCNNode .
Что понадобится, чтобы создать физический объект:
- задать фигуру определенного размера;
- создать фигуру с физическими свойствами для контролирования контактов с другими объектам;
- создать физическое тело для описания поведения объекта при соприкосновении;
- задать текстуры.
Пример реализации классов патрона в виде шара и логотипа в виде куба с нужными текстурами.
Хочется обратить внимание на CollisionCategory. Это структура используется для определения типа объекта при контакте.
Это стандартная тактика для определения контакта. Свойство categoryBitMask задает маску конкретного объекта, а contactTestBitMask настраивает все контакты, которые нам будут интересны и о которых мы хотим получать уведомления.
Раз мы заговорили про обработку контактов, давайте посмотрим, как это выглядит в контроллере. Во viewDidLoad мы уже подписались на события контактов физического мира. Осталось реализовать одну функцию.
Самое интересное — это первая проверка того, что произошло именно соударение патрона и мишени в виде куба. Она выполняется на основе битовой маски. Это очень удобно и избавляет от большого количества других проверок.
При соударении мы убавляем счетчик оставшихся логотипов и удаляем оба объекта. Второй объект удаляется с небольшой задержкой для визуализации столкновения.
Две основные игровые функции — это добавление мишени и выстрел. Добавление происходит на небольшом расстоянии от экрана в той стороне, куда направлена камера. Мы просто создаем уже сконфигурированный объект куба, добавляем его на сцену и настраиваем его расположение относительно камеры в пространстве.
При выстреле мы также создаем объект шара. Добавляем его на сцену. Но теперь нам необходимо не просто его добавить, но и придать ему ускорение. Для этого мы определяем позицию посередине экрана и придаем ускорение, приложив силу в нужном направлении.
Вот так всего за пару десятков строк мы создали простую игру.
Будущее наступит в сентябре
Как видите, Apple потрудились на славу. Благодаря новому фреймворку ARKit создание приложений с дополненной реальностью — так же просто, как сделать приложение с несколькими контроллерами. При этом вам не нужно беспокоиться о красивых декорациях. Эта технология точно изменит наше представление о мобильных приложениях.
Скачивайте новый Xcode 9, и создавайте приложения, которые добавят в наш мир виртуальной магии. Будущее уже здесь. Ну или будет здесь ближе к сентябрю, после очередной презентации Apple.
Источник