Акции и промокоды Отзывы о школах

ARKit без иллюзий: что реально работает, а что нет

#Блог

Знаете, что общего между Pokemon GO и приложением, которое позволяет примерить диван из IKEA, не вставая с собственного (возможно, уже порядком поднадоевшего) дивана? Правильно – ARKit, этакий швейцарский нож от Apple для создания приложений с дополненной реальностью на iOS.

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

Самое интересное, что благодаря использованию данных с камеры и гироскопа (знаете, та штука, которая определяет, как вы держите телефон), ARKit обеспечивает такую точность позиционирования виртуальных объектов, что порой начинаешь сомневаться – а не живем ли мы уже в той самой матрице?

Скриншот демонстрирует официальную документацию Apple по фреймворку ARKit, размещённую на сайте developer.apple.com. На нём виден раздел Overview, в котором кратко объясняется, что такое ARKit и какие функции он предоставляет: дополненная реальность с отслеживанием движения, распознаванием объектов и возможностью размещения 2D/3D-элементов в реальном мире.

Поддерживаемые устройства и требования

Прежде чем погрузиться в увлекательный мир дополненной реальности (и возможно, потратить несколько бессонных ночей на разработку), давайте разберемся с прозаичным вопросом – а на чем, собственно, это все будет работать?

Apple, как всегда верная своей философии «вчерашний день — это уже вчерашний день», поддерживает ARKit начиная с iPhone 6s и выше (да-да, тот самый телефон, который вы, возможно, отдали маме пару лет назад). Что касается планшетов – в игру вступают iPad Pro всех поколений и iPad от 2017 года (тот самый, который вы используете как подставку для ноутбука – самое время достать его и дать вторую жизнь!).

Минимальные требования к iOS – версия 11 и выше, хотя, давайте будем честными, если вы до сих пор не обновились, то AR – это, вероятно, наименьшая из ваших проблем. Важный момент – не все функции ARKit доступны на всех устройствах, некоторые особо продвинутые фишки требуют более новых процессоров и датчиков (спасибо, Apple, за еще один повод обновить телефон).

Начало работы с ARKit

Итак, вы решили погрузиться в мир ARKit (возможно, после просмотра очередной презентации Apple, где все выглядит подозрительно просто). Что ж, давайте начнем наше путешествие – и да, оно будет интереснее, чем квест по поиску пропавших точек с запятыми в коде.

Первым делом вам понадобится Xcode – та самая IDE от Apple, которая умудряется одновременно быть и вашим лучшим другом, и главным источником седых волос. Скачиваем последнюю версию (надеюсь, у вас есть свободные 50 ГБ на диске – да, я не шучу), создаем новый проект и выбираем шаблон «Augmented Reality App» (спасибо, Apple, что хотя бы здесь все очевидно).

Теперь о языке программирования. Swift – наш выбор, и если вы еще не знакомы с ним, приготовьтесь к увлекательному роману с optional binding и замыканиями (closure, а не то, о чем вы подумали). Базовые знания Swift необходимы как воздух – без них в ARKit вы будете чувствовать себя как рыба на велосипеде.

После создания проекта ARKit фреймворк уже будет добавлен автоматически (редкий случай, когда Apple все сделала за нас), но если вдруг нет – добавляем его через Project Settings > Frameworks (и молимся, чтобы линкер не устроил нам веселую жизнь).

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

Основные компоненты ARKit

Давайте познакомимся с главными героями нашей AR-саги – компонентами ARKit, без которых ваше приложение будет таким же полезным, как зонтик в подводной лодке.

Первый в списке – ARSession, этакий дирижер вашего AR-оркестра. Именно он управляет всем процессом дополненной реальности: следит за движением устройства, обрабатывает данные с камеры и делает еще миллион вещей, о которых вы даже не подозреваете. Создается примерно так:

let session = ARSession()
session.delegate = self // если хотите быть в курсе всех событий
session.run(configuration) // о конфигурации чуть позже

Следующий на сцене – ARConfiguration, или как я его называю, «настройщик реальности». Это базовый класс для различных конфигураций AR-сессии. Хотите отслеживать движение устройства в пространстве? ARWorldTrackingConfiguration к вашим услугам. Нужно распознавать лица? ARFaceTrackingConfiguration (только не пугайтесь, когда увидите себя в камеру в первый раз).

ARAnchor – это ваш якорь в море дополненной реальности. Представьте, что вы расставляете виртуальные Post-it записки в реальном мире – каждая такая «записка» привязана к определенной точке в пространстве через ARAnchor. Без них ваши виртуальные объекты будут летать в пространстве как осенние листья на ветру (что, конечно, может быть художественным замыслом, но чаще всего это просто баг).

И наконец, ARPlaneAnchor – специализированный якорь для работы с плоскостями. Это тот самый компонент, который позволяет вашему приложению понять, где находится пол, стены или стол, чтобы вы могли разместить на них свои виртуальные творения. Без него ваши 3D-объекты будут падать в бесконечность, как в кошмарном сне архитектора.

Все эти компоненты работают вместе как слаженный механизм (по крайней мере, в теории), создавая то магическое взаимодействие между реальным и виртуальным мирами, которое мы называем дополненной реальностью. И да, когда все работает правильно – это действительно выглядит как магия. А когда не работает… ну, тогда вы всегда можете сказать, что это «особенность», а не баг.

Обнаружение и обработка плоскостей

А теперь поговорим о том, как ARKit ищет плоскости в реальном мире – процесс, напоминающий работу особо дотошного геометра, только происходящий в реальном времени и без линейки.

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

Диаграмма наглядно показывает, как меняется эффективность определения горизонтальных и вертикальных плоскостей в зависимости от освещения.

Вот как это работает в коде (спойлер: сложнее, чем кажется на презентациях Apple):

let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical] // Ищем всё, что можно найти
sceneView.session.run(configuration)

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
// Здесь происходит магия обработки найденной плоскости
// И да, вам придется самим решать, что с ней делать
}

Когда ARKit находит плоскость, он создает ARPlaneAnchor – этакую виртуальную кнопку «Здесь можно что-то разместить». Плоскость может обновляться, расширяться или даже исчезать (прямо как ваши дедлайны), и ARKit будет держать вас в курсе всех этих изменений через делегаты – если, конечно, вы правильно их настроили.

И помните: реальный мир далек от идеальных геометрических форм из учебника. Иногда ARKit может принять вашу кошку за горизонтальную поверхность (особенно если она спит), а иногда проигнорировать perfectly flat стол. Такова жизнь в мире компьютерного зрения!

Работа с 3D-объектами в ARKit

Теперь самое интересное – как заставить трехмерные объекты жить в нашем мире. ARKit использует SceneKit (или Metal, если вы хардкорный разработчик) для рендеринга 3D-моделей.

guard let modelURL = Bundle.main.url(forResource: "art.scnassets/robot", withExtension: "usdz"),
  let model = try? SCNScene(url: modelURL),
  let node = model.rootNode.childNode(withName: "robot", recursively: true) else {
print("Что-то пошло не так, но вы же не читаете логи, правда?")
return
}

Анимации в ARKit – отдельная песня. SceneKit предлагает несколько способов оживить ваши модели:

// Простая анимация вращения
let rotation = SCNAction.rotateBy(x: 0, y: CGFloat(Float.pi * 2), z: 0, duration: 5.0)
let forever = SCNAction.repeatForever(rotation)
node.runAction(forever)

Для загрузки моделей ARKit поддерживает различные форматы (.usdz, .scn, .dae), но .usdz – любимчик Apple (кто бы мог подумать). Оптимизация моделей критична: слишком детальная модель может превратить ваш iPhone в портативную грелку.

А еще есть физика! Можно добавить гравитацию, коллизии и другие физические свойства:

node.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)
node.physicsBody?.mass = 1.0
// Теперь ваш объект будет падать как настоящий
// И да, это тоже можно считать фичей

Взаимодействие пользователя с AR-сценой

Что отличает крутое AR-приложение от цифрового натюрморта? Правильно – интерактивность! Давайте научим наши виртуальные объекты реагировать на прикосновения пользователя (звучит почти романтично).

// Добавляем распознавание жестов
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
let rotationGesture = UIRotationGestureRecognizer(target: self, action: #selector(handleRotation(_:)))

sceneView.addGestureRecognizer(tapGesture)
sceneView.addGestureRecognizer(pinchGesture)
sceneView.addGestureRecognizer(rotationGesture)

Обработка этих жестов – отдельное искусство. Вот вам пример обработки тапа (спойлер: в реальности всё сложнее):

@objc func handleTap(_ gesture: UITapGestureRecognizer) {
let location = gesture.location(in: sceneView)
let hitResults = sceneView.hitTest(location, types: .existingPlaneUsingExtent)
   
if let result = hitResults.first {
    // Здесь может быть ваш код
    // Если он когда-нибудь сработает с первого раза
}
}

И помните: тестируйте взаимодействие на реальных устройствах – симулятор врет как очевидец на допросе. Особенно когда дело касается мультитач жестов!

Оптимизация производительности AR-приложений

Создать AR-приложение – это полдела. Заставить его работать без превращения iPhone в портативную печку – вот настоящий квест для разработчика.

// Оптимизируем настройки сессии
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal] // Ищем только горизонтальные плоскости
configuration.environmentTexturing = .none // Отключаем текстурирование окружения
sceneView.antialiasingMode = .none // Прощай, сглаживание

Несколько золотых правил оптимизации:

  • Используйте низкополигональные модели (ваш 3D-художник будет плакать, но телефоны скажут спасибо)
  • Ограничивайте количество одновременно отображаемых объектов (нет, вам правда не нужна армия из 1000 виртуальных котиков)
  • Отключайте неиспользуемые функции ARKit (каждый включенный флаг – это дополнительная нагрузка на процессор)
  • Следите за размером текстур (4K текстуры для виртуальной чашки кофе? Серьезно?)

Помните: лучше красивое приложение с FPS 60, чем технологический шедевр, работающий как презентация PowerPoint на Windows 95.

Тестирование и отладка AR-приложений

Тестирование AR-приложений – это особый вид программистского мазохизма, требующий как минимум трех рук и бесконечного терпения.

// Включаем режим отладки
sceneView.debugOptions = [
.showFeaturePoints, // Показываем точки отслеживания
.showWorldOrigin,   // Где же центр мира?
.showPhysicsShapes  // Коллайдеры во всей красе
]

Xcode предоставляет симулятор для тестирования AR, но доверять ему можно примерно как прогнозу погоды на год вперед. Реальное тестирование нужно проводить на устройстве, причем в разных условиях освещения (и да, это значит, что вам придется побегать по офису с телефоном).

Для отладки используйте инструменты Xcode:

  • Instruments для профилирования производительности
  • Console для отлова странных ошибок
  • Memory Graph для поиска утечек памяти (спойлер: они будут)

И главное правило тестирования AR: если что-то работает идеально в офисе – обязательно сломается у первого же пользователя.

Примеры успешных AR-приложений на iOS

Давайте посмотрим на тех, кто уже покорил AR-Олимп (или хотя бы забрался на его склоны):

IKEA Place – пожалуй, самый практичный пример использования ARKit. Приложение позволяет расставлять виртуальную мебель в вашей квартире. Особенно полезно, когда вы пытаетесь объяснить второй половинке, почему двухметровый шкаф не влезет в вашу студию.

Pokemon GO – да, та самая игра, из-за которой люди натыкались на столбы и падали в фонтаны. Использует ARKit для размещения покемонов в реальном мире. Технически не самое сложное приложение, но показательный пример того, как правильный маркетинг может превратить простую механику в глобальный феномен.

Snapchat – возможно, вы не задумывались об этом, но все эти забавные маски и фильтры – это тоже AR. Приложение использует продвинутое отслеживание лиц через ARKit для создания тех самых эффектов, которые превращают вас в котика (или что там сейчас в тренде).

Complete Anatomy – серьезное медицинское приложение, использующее AR для визуализации анатомии человека. Теперь студенты-медики могут изучать строение тела человека, не пугая окружающих настоящими скелетами.

Заключение

ARKit открывает впечатляющие возможности для разработки приложений дополненной реальности на iOS. От простого размещения виртуальных объектов до сложных интерактивных сцен – всё ограничивается только вашей фантазией (ну, и производительностью устройства, конечно).

Несмотря на некоторые технические сложности и ограничения (куда же без них), ARKit предоставляет мощный инструментарий для создания по-настоящему инновационных приложений. С каждым обновлением iOS появляются новые возможности, и кто знает – может быть, именно ваше приложение станет следующим Pokemon GO (только, пожалуйста, сделайте так, чтобы пользователи не падали в фонтаны).

И помните: в мире AR даже самые безумные идеи могут оказаться гениальными. Главное – не забывать про оптимизацию и тестирование на реальных устройствах!

Кстати, если вы только начинаете свой путь в iOS-разработке или хотите углубить свои знания перед погружением в ARKit, стоит рассмотреть специализированные образовательные программы. На странице подборки курсов по iOS-разработке вы найдете обучающие материалы разного уровня сложности – от основ Swift до продвинутых тем, включая работу с дополненной реальностью. А теперь вернемся к нашему знакомству с ARKit и посмотрим, как написать первые строки кода для AR-приложения.

Читайте также
Категории курсов
Отзывы о школах