Демонстрация ARKit: создание фильмов с дополненной реальностью
Опубликовано: 2022-03-11AR и 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.
Предполагаемый сценарий использования выглядит следующим образом:
- попросите друга одеться как Нео (не обязательно для работы приложения, но может также хорошо выглядеть, пока мы это делаем).
- Попросите «Нео» встать примерно в 10 метрах от вас.
- Запустите приложение и отсканируйте наземную плоскость.
- Добавьте пули и ножи, летящие в «Нео».
- Удерживайте кнопку записи, чтобы записать видео, пока «Нео» выполняет несколько крутых движений, уклоняясь от пуль или останавливая их.
- отпустите кнопку записи и сохраните видео в свою библиотеку.
Создание приложения
Как упоминалось ранее, мы хотим иметь возможность свободно двигаться во время записи всех 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