Демонстрация ARKit: создание фильмов с дополненной реальностью

Опубликовано: 2022-03-11

AR и VR становятся мейнстримом, и за ними гонятся все ведущие крупные высокотехнологичные компании: у Apple есть ARKit, у Google — ARCore, у Microsoft — собственный HoloLens (и, конечно же, есть Unity). И поскольку несколько приложений привлекают большое внимание общественности, разработка приложений с дополненной реальностью становится очень желанным навыком для мобильных разработчиков.

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

Введение в ARKit

ARKit — это платформа Apple для создания приложений дополненной реальности для устройств iOS. С ним можно использовать несколько рендереров: SpriteKit для 2D-объектов, SceneKit для 3D и Metal, если мы хотим реализовать собственный рендерер.

В этой демонстрации мы будем использовать SceneKit для рендеринга и размещения полностью визуализированных 3D-объектов (ножей).

изображение: различие между рендерерами

Начиная с ARKit v2, в ARKit поддерживаются пять типов конфигурации:

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

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

ARFaceTrackingConfiguration — эта конфигурация в настоящее время поддерживается только iPhone X, поскольку для нее требуется камера TrueDepth (например, Face ID). Эта конфигурация отслеживает черты лица и его относительное отклонение от нейтрального выражения лица (например, приложение, в котором пользователи могут примерить модные солнцезащитные очки, прежде чем заказать их).

ARImageTrackingConfiguration — если у вас есть набор маркеров и вы хотите показать животных, выпрыгивающих из маркера, то эта конфигурация вам подходит. Это не обязательно должны быть карточные маркеры, а любое 2D-изображение. Вы могли навести камеру на Мону Лизу, и она повернула бы голову и что-то вам сказала. Недостатком является то, что вы должны заранее сказать, каков физический размер маркера изображения.

ARObjectScanningConfiguration — эта конфигурация является 3D-версией ARImageTrackingConfiguration.

В этой демонстрации мы добавим в сцену ножи и пули, и мы хотели бы иметь шесть степеней свободы, поэтому подходящим инструментом является ARWorldTrackingConfiguration.

Концепция приложения

Каждый, кто смотрел «Матрицу», может вспомнить, как Нео (Киану Ривз) уворачивался от пуль и останавливал их в воздухе. Наше приложение поможет нам воссоздать эту сцену из прямой трансляции с камеры. Таким образом, мы можем создавать собственные видеоролики, демонстрирующие неоподобные способности.

В нашем приложении будут 3D модели пуль и ножей. Пользователь сам решает, сколько пуль или ножей он хочет в своем фильме. Если вы хотите потратить некоторое время и добавить другие модели, код приложения имеет открытый исходный код и доступен на GitHub (https://github.com/altaibaar/toptal_ar_video_maker). Хотя это не полное руководство по AR, демонстрация и исходный код должны быть ценным ресурсом, если вы пытаетесь заняться разработкой приложений AR для iOS.

Предполагаемый сценарий использования выглядит следующим образом:

  1. попросите друга одеться как Нео (не обязательно для работы приложения, но может также хорошо выглядеть, пока мы это делаем).
  2. Попросите «Нео» встать примерно в 10 метрах от вас.
  3. Запустите приложение и отсканируйте наземную плоскость.
  4. Добавьте пули и ножи, летящие в «Нео».
  5. Удерживайте кнопку записи, чтобы записать видео, пока «Нео» выполняет несколько крутых движений, уклоняясь от пуль или останавливая их.
  6. отпустите кнопку записи и сохраните видео в свою библиотеку.

Создание приложения

Как упоминалось ранее, мы хотим иметь возможность свободно двигаться во время записи всех 360° сцены, а пули и ножи должным образом отслеживают движение камеры.

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

Ножи — это детализированные объекты, и я буду использовать бесплатную модель с https://poly.google.com/view/3TnnfzKfHrq (спасибо, Эндрю).

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

GameplayKit — это полезный инструмент, который пригодится, когда вам понадобится генерация случайного шума, конечный автомат, ИИ или принятие решений на основе вероятности.

 override init() { super.init(); // generate 50 gaussian distributed position around [0, 0, 0] let positions = Randomness.gaussian(center: SCNVector3Zero, count: 50); for pos in positions { let node = SCNNode(geometry: sphereGeometry()); node.position = pos; self.addChildNode(node); } } private func sphereGeometry() -> SCNGeometry { // radius of one projectile sphere is 5mm/0.2inch let sphere = SCNSphere(radius: 0.005); // sphere is reddish sphere.firstMaterial?.diffuse.contents = UIColor.red; // reflection on light is gray/silver sphere.firstMaterial?.reflective.contents = UIColor.gray; // metalness is 0.3 sphere.firstMaterial?.metalness.contents = 0.3; // shading should be realistic sphere.firstMaterial?.lightingModel = .physicallyBased; return sphere; }

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

Архитектура приложения

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

Вместо этого я просто изложу структуру проекта в качестве руководства, как ориентироваться в связанном проекте GitHub: каковы основные компоненты, как они связаны и почему они были выбраны.

В приложении всего три экрана:

PermissionViewController — экран, на котором мы просим пользователя предоставить приложению доступ к необходимым мобильным функциям.

  • Камера - однозначно
  • Галерея — для сохранения записанного видео и входа с микрофона.
  • Микрофон — разрешение требуется библиотеке, которую я использую для создания видео (по умолчанию звук с микрофона будет использоваться в качестве источника звуковой дорожки).

ExportViewController — на этом экране отображается записанное видео и предлагаются варианты обмена или сохранения видео.

MainViewController — здесь происходит вся магия.

По моему опыту, лучше всего обернуть все необходимые классы ARKit, такие как ARSession, ARConfiguration и все уникальные типы SCNNode. Таким образом, код говорит сам за себя.

ARSession наследуется от ToptalARSession, а новый класс сеанса имеет всего три метода: конструктор класса, в котором мы настраиваем все необходимое, и методы resetTracking и pauseTracking.

Приложение распознает четыре уникальных типа узлов SCNN:

  • KnifeNode — представляет 3D-объект ножа и автоматически загружает 3D-нож в качестве его геометрии.
  • BulletsNode — этот узел представляет собой набор патронов для дробовика. Случайный гауссов шум, цвета и режим физического освещения настраиваются автоматически.

    В классах, использующих KnifeNode или BulletsNode, не требуется специальной или дополнительной работы, и их можно использовать в качестве шаблонов для настройки приложения для добавления дополнительных видов 3D-объектов.

  • ReticleNode — оборачивает 3D-модель, которая появляется в сцене над полом, чтобы показать, где будут добавлены ножи или пули.
  • DirectionalLightNode — это узел, представляющий вертикальный источник света, направленный вниз.

Ссылки и кредиты

Модель ножа: https://poly.google.com/view/3TnnfzKfHrq

Запись из SCNScene: https://github.com/svtek/SceneKitVideoRecorder

Иконки кнопок, демонстрационное приложение ARKit: https://developer.apple.com/documentation/arkit/handling_3d_interaction_and_ui_controls_in_augmented_reality