Всем привет, с вами я, Наиль Габутдинов, iOS разработчик.
На недавнем WWDC 2022 вместе с iOS 16 и iPadOS 16 обновился и ARKit. Я рад, что Apple продолжает инвестировать в область AR, каждый год предлагая больше функций и улучшений. Что нового в ARKit 6? Давайте рассмотрим!
4K видео
Несмотря на то, что аппаратная составляющая камер уже давно позволяла снимать видео в 4K, в ARKit видео такого высокого разрешения ранее не использовалось.
Использовалось изображение с большей части сенсора, однако, после захвата использовался процесс, называемый биннингом. Суть его простая: биннинг берет область размером 2x2 пикселя, усредняет значения пикселей и записывает в один пиксель, в итоге изображение уменьшается до 1920x1440 пикселей. В результате каждый кадр видео потребляет меньше памяти и вычислительной мощности. Это позволяет устройству запускать камеру со скоростью до 60 кадров в секунду и высвобождает ресурсы для рендеринга.
Теперь же, благодаря мощности новейшей аппаратной начинки, Apple включила полноценный видеорежим 4K в ARKit. Сейчас приложение может использовать преимущества изображения с более высоким разрешением, пропуская этап биннинга и напрямую обращаясь к нему в полном разрешении 4K. В остальном, приложение будет работать, как и раньше.
Новый режим 4K можно включить, выполнив несколько простых шагов. Давайте посмотрим, как это выглядит в коде.
if let highResFormat = ARWorldTrackingConfiguration.recommendedVideoFormatFor4KResolution {
//назначение формата видео
config.videoFormat = highResFormat
}
session.run(config)
ARConfiguration получил новое удобное свойство recommendedVideoFormatFor4KResolution, которое возвращает формат видео 4K, если этот режим поддерживается на устройстве. Если устройство или конфигурация не поддерживают 4K, эта свойство вернет nil. Затем можно назначить этот формат видео своей конфигурации и запустить ARSession с этой конфигурацией.
Режим видео в 4K доступен на iPhone 11 и новее, а также на любом iPad Pro с чипом M1. Разрешение составляет 3840x2160 пикселей при 30 кадрах в секунду.
При использовании ARKit, особенно в разрешении 4K, важно следовать некоторым рекомендациям для достижения оптимальных результатов:
Не держите ARFrame слишком долго. Это может помешать системе освободить память и не позволит ARKit показывать новые кадры, что будет видно по пропущенным фреймам в рендеринге. В конечном итоге, состояние отслеживания ARCamera может вернуться к ограниченному.
Следите за warnings в консоли, чтобы убедиться, что вы не сохраняете слишком много изображений в определенный момент времени.
Также стоит подумать, действительно ли формат видео 4K подходит для вашего приложения. Такая потребность может возникнуть, например, в приложениях для кинопроизводства. Работа с изображениями и видео с более высоким разрешением требует дополнительных системных ресурсов, поэтому для игр и других приложений, требующих высокой частоты обновления, Apple по-прежнему рекомендует использовать видео в формате Full HD с частотой 60 кадров в секунду.
Улучшения по настройкам камеры
Помимо нового режима 4K, есть некоторые дополнительные улучшения, которые позволяют нам лучше использовать возможности камеры.
Захват highres изображений в фоне
Представьте ситуацию, когда вам во время работы приложения с ARSession нужно сделать фотографию, чтобы запечатлеть сцену, которую вы видите в AR. В ARKit 6 добавили возможность запрашивать захват отдельных фотографий по запросу в фоновом режиме, пока видеопоток работает непрерывно. Эти фотографии в полной мере используют сенсор вашей камеры. То есть на iPhone 13 это будут все 12 мегапикселей широкоугольной камеры. Другим вариантом использования, который значительно выиграет от этого API, является создание 3D-моделей с использованием захвата объектов (Object Capture).
Функция Object Capture делает множество фотографий реальных объектов, таких как эти кроссовки на иллюстрации, и с помощью алгоритмов Photogrammetry превращает их в реалистичные 3D-модели, готовые для использования в приложениях дополненной реальности.
Рассмотрим, как сделать захват фотографий с высоким разрешением в коде.
if let highResCaptureFormat = ARWorldTrackingConfiguration.recommendedVideoFormatForHighResolutionFrameCapturing {
//установка видео формата, который поддерживает захват изображений
config.videoFormat = highResCaptureFormat
}
session.run(config)
Во-первых, мы проверяем формат видео, который поддерживает захват изображений в hi-res. Для этого используется функция recommendedVideoFormatForHighResolutionFrameCapturing. После того, как мы убедимся, что формат поддерживается, мы можем установить новый формат видео и запустить ARSession.
session.captureHighResolutionFrame { (frame, error) in
if let frame = frame {
saveHighResImage(frame.capturedImage)
}
}
После запуска можно сделать снимок. ARSession имеет новую функцию сaptureHighResolutionFrame. Вызов этой функции запускает фоновый захват изображения с высоким разрешением. Асинхронно в обработчике завершения получаем доступ к ARFrame, содержащему изображение и все другие свойства кадра. В этом примере кадр сохраняется на диск.
HDR
Снимая и экспериментируя с камерой на iPhone, мы знаем, что при включении режима HDR некоторые детали на фото сохраняются гораздо лучше. Вот пример с облаками:
Посмотрим, как включается HDR для ARSession.
if config.videoFormat.isVideoHDRSupported {
config.videoHDRAllowed = true
}
session.run(config)
Через свойство isVideoHDRSupported мы можем узнать, поддерживает ли формат видео HDR. Если HDR поддерживается, устанавливаем true для videoHDRAllowed в ARConfiguration и ARSession. Стоит понимать, что включение HDR повлияет на производительность, поэтому нужно использовать его только тогда, когда в этом есть необходимость.
Доступ к AVCaptureDevice
На случай, когда вам нужно ручное управление такими настройками, как экспозиция или баланс белого, ARKit 6 предлагает удобный интерфейс прямого доступа к AVCaptureDevice и изменения любых его настроек через свойство configurableCaptureDeviceForPrimaryCamera.
if let device = ARWorldTrackingConfiguration.configurableCaptureDeviceForPrimaryCamera {
do {
try device.lockForConfiguration()
//конфигурация настроек AVCaptureDevice
device.unlockForConfiguration()
} catch {
//обработка ошибок
}
}
EXIF data
ARKit предоставляет доступ к данным EXIF в приложении. Теперь они доступны в ARFrame.
open class ARFrame: NSObject, NSCopying {
...
@available(iOS16.0, *)
var exifData: [String: Any] { get }
}
EXIF содержит полезную информацию о балансе белого, экспозиции и других настройках, которые могут быть полезны для постобработки.
Улучшенное распознавание движений
Представленное в ARKit 3 распознавание движений (Motion capture) позволяет отслеживать движения человеческого тела и использовать их в качестве входных данных для дополненной реальности. С каждым обновлением добавляется распознавание большего числа поз тела и жестов. Определение положения тела и его частей становится все точнее, и мы можем теперь отслеживать движения с большего расстояния.
Что добавили и улучшили в ARKit 6:
Отслеживание положения левого и правого уха (2D);
Улучшенное определение позы (3D). Определяемый скелет человека обновлен и теперь имеет больше суставов;
Существенно меньшая задержка и большая временная согласованность в целом;
Больше стабильности и точности, когда часть тела закрыта или человек подходит близко к камере.
Улучшение в Location Anchors
Эта функциональность была добавлена в ARKit 4, но в 6-й версии она значительно улучшилась. Вообще, Location Anchors нужны для привязки AR объектов к координатам определенной геолокации в реальном мире. Благодаря Location Anchors можно, например, размещать названия улиц и навигационные элементы в дополненной реальности в их точном положении.
Новые города, где стали доступны Location Anchors:
Ванкувер, Торонто, Монреаль (Канада)
Сингапур
Токио, Фукуока, Хиросима, Осака, Киото, Нагоя, Йокогама (Япония)
Мельбурн, Сидней (Австралия)
Позже в этом году станут доступны:
Окленд (Новая Зеландия)
Париж (Франция)
Тель-Авив (Израиль)
Вывод
Как мы видим, абсолютно нового функционала ARKit на WWDC Apple не представила. Видимо, у Apple большие планы на 2023 год – презентация совершенно новой AR-гарнитуры. Однако, можем заметить, что в этом году мы получили существенные улучшения и расширения по представленным ранее функциям, такие как: поддержка 4K, HDR, захват highRes фото и доступ к настройкам камеры. Это позволяет делать всё более качественные и сложные AR продукты для профессиональных целей и развлечения ради.