SA1910 — Лицевые якоря (Face Anchors)
Содержание страницы
Эта глава продолжается с того места, где закончилась предыдущая. Благодаря SwiftUI приложение AR Funny Face теперь имеет очень простой пользовательский интерфейс. В этой главе вы продолжите фокусироваться на этом компоненте распознавания лиц, используя привязки лиц в RealityKit.
Вы также получите, чтобы построить некоторые забавные сцены с этими сумасшедшими реквизит:

Огромные солнцезащитные очки, стеклянное глазное яблоко и эпические усы. С этими классными реквизитами в вашем распоряжении приложение AR Funny Face отлично стартует.
Примечание: Не стесняйтесь продолжить свой собственный окончательный проект из предыдущей главы. Если вы пропустили несколько вещей, загрузите проект starter из starter/ARFunnyFace/ARFunnyFace.xcodeproj, прежде чем продолжить.
Что такое лицевые якоря?
Повесить якорь на лицо звучит очень болезненно. К счастью, тип якоря, о котором мы говорим здесь, — это якорь AR Face-несомненно, один из самых крутых доступных типов якорей. Благодаря Reality Composer создавать лицевые якоря очень просто.
При использовании фронтальной камеры TrueDepth лицевые якоря предоставляют информацию о положении лица пользователя, его ориентации, топологии и выражении лица.
К сожалению, вы можете использовать отслеживание лиц только в том случае, если у вас есть устройство, оснащенное фронтальной камерой TrueDepth. Если устройство поддерживает Face-Id, все в порядке.
Когда камера обнаруживает лицо, якорь добавляется немного позади носа в середине головы.

Здесь симпатичная голова обезьяны демонстрирует, как создается якорь лица после обнаружения лица.
Также важно знать, что якорь использует правостороннюю систему координат, измеряемую в метрах.
Вот разбивка каждой оси:
- Ось X: красная стрелка, указывающая вправо,представляет эту ось.
- Ось Y: зеленая стрелка, указывающая вверх,представляет эту ось.
- Ось Z: синяя стрелка, указывающая вперед,представляет эту ось.
Создание анкеров лица
Пришло время погрузиться в действие и построить несколько сцен привязки лица с предоставленным реквизитом.
Когда проект приложения AR Funny Face открыт, выберите Experience.rcproject, а затем выберите Open in Reality Composer.

Проект открывается в Reality Composer с выбранной сценой по умолчанию. Сцена содержит кубический объект.
Выберите сцену по умолчанию и откройте панель свойств. Переименуйте сцену в Глаза. Измените тип привязки сцены на Face и отключите физику сцены, установив Objects collide with на Nothing. Наконец, выберите куб по умолчанию в сцене и удалите его.

Поскольку вы установили тип якоря в Face, теперь вы увидите белую маску в центре сцены. Маска представляет обнаруженное лицо в масштабе. Маска служит визуальным ориентиром, позволяющим узнать, где можно разместить объекты по отношению к обнаруженному лицу.
Добавьте объект в сцену, но выберите опцию Импорт, чтобы выбрать пользовательский объект. Найдите и выберите starter/resources/Eyeball.usdz затем выберите Импорт, чтобы завершить процесс.

Это импортирует красивое, блестящее стеклянное глазное яблоко в сцену, скрываясь за белой маской. Вращайте, пока не увидите глазное яблоко за маской. Выберите его, затем откройте панель свойств.
Переименуйте объект в Eye_R, который представляет правый глаз. В разделе Преобразование задайте Положение (X:-3.5cm, Y:4cm, Z:-3cm)
и Масштаб 170%
.

Теперь у вас есть хорошее представление о том, как будет выглядеть конечный продукт при просмотре сцены. Но тебе нужен хотя бы еще один глаз.
Если правое глазное яблоко все еще выбрано, нажмите Command-C, а затем Command-V, чтобы создать быструю копию.
Переименуйте объект в Eye_L, который представляет левый глаз. В разделе Преобразование задайте Положение (X:3.5cm, Y:4cm, Z:-3cm)
и Масштаб 170%
.

Конечный результат напоминает Гомера Симпсона. Идеально!
Теперь, когда глаза сделаны, пришло время добавить другие реквизиты.
Создание нескольких сцен
Чтобы добавить больше реквизита, вы должны создать несколько сцен в проекте Reality Composer. Каждая сцена будет содержать одну лицевую опору. Чтобы переключаться между различными реквизитами, вам просто нужно переключать разные сцены.
Это звучит как отличный план, так что приступайте к нему!
При открытой панели «Сцены» добавьте новую сцену в проект, нажав кнопку + в левом верхнем углу панели.

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

Переименуйте сцену в Очки и установите объекты, сталкивающиеся ни с чем.

Добавьте объект в сцену, а затем импортируйте starter/resources/Glasses.usdz.

Вращайте сцену до тех пор, пока не увидите очки за маской, затем выберите их и откройте панель свойств. В разделе Преобразование установите для позиции значение (X:0cm, Y:6cm, Z:-3cm:)
. Чтобы сделать очки красивыми и большими, установите шкалу на 140%
.

Ладно, Вилли Вонка, ты почти закончил. Осталось добавить в проект еще одну опору.
Следуя тому же процессу, что и раньше, убедитесь, что панель Сцен открыта, затем добавьте еще одну сцену в проект, нажав кнопку + в левом верхнем углу панели.

Когда вас спросят, установите тип якоря лицом. Не забудьте убедиться, что вы сняли флажок Использовать содержимое шаблона.

Переименуйте сцену в Mustache и добавьте объект в сцену, затем импортируйте starter/resources/Mustache.usdz.

Чтобы завершить работу, переименуйте объект в Mustache, установите положение (X:0cm, Y:6.5cm, Z:3cm)
и масштаб 130%
.

Вот и все, вы все сделали. Ваш проект Reality Composer теперь содержит три разных сцены привязки лица, по одной для каждой опоры.
Сохраните изменения, закройте Reality Composer и вернитесь в Xcode.

Теперь вы увидите свои три сцены в Xcode.
Генерация кода
Reality Composer тесно интегрирован в Xcode. Когда вы создадите проект, Xcode проверит все связанные файлы реальности в проекте и сгенерирует Swift-код.
Сгенерированный код обеспечивает строго типизированный доступ ко всему содержимому файла Reality. Он также предоставляет прямой доступ к вызову триггеров для пользовательских действий в вашем коде.

В этом случае Xcode генерирует файл Experience.swift со строго типизированным доступом к трем сценам, созданным в файле реальности.
Исправление проекта
Далее вы посмотрите на сторону кодирования проекта. Когда вы перекомпилируете свой проект, он генерирует ошибку.
Это потому, что вы удалили сцену коробки по умолчанию. Сгенерированный код Experience.swift больше не имеет никаких ссылок Experience.loadBox()
.
Выберите contentView.swift. Далее вы добавите к нему код.
Найдите makeUIView(context:)
и замените его содержимое следующим блоком кода:
arView = ARView(frame: .zero) return arView
Это инициализирует arView
. В качестве дополнительного бонуса вы просто избавились от кода, который вызывал ошибку компилятора.
Переключение на фронтальную камеру
Когда приложение запускается, вам нужно вручную переключиться на фронтальную камеру. Для этого вам понадобится небольшая помощь от Аркита.
ARKit-это технология, лежащая в основе RealityKit; вы узнаете больше об этом позже в книге.
Добавьте следующий импорт в верхнюю часть contentView.swift:
import ARKit
Отлично, теперь у вас есть низкоуровневый доступ к некоторому дополнительному контенту.
AR Сессия
Прежде чем двигаться дальше, вам нужно узнать о сеансе AR, доступ к которому вы можете получить через ARView.session
.
Объект сеанса AR является ключевой технологией, ответственной за отслеживание движения и обработку изображений. Он основан на сеансе, поэтому вам нужно создать экземпляр сеанса AR, а затем запустить этот сеанс, чтобы начать процесс отслеживания AR.
Конфигурация AR
Перед началом сеанса AR необходимо создать конфигурацию сеанса AR. Эта конфигурация используется для установления связи между реальным миром, где находится ваше устройство, и виртуальным 3D-миром, где находится ваш виртуальный контент.
Существует шесть типов конфигураций:
- AROrientationTrackingConfiguration: основные три степени свободы (3DOF) отслеживания, который использует заднюю камеру.
- ARWorldTrackingConfiguration: отслеживание шести степеней свободы (6DOF), которое также отслеживает людей, известные изображения и объекты. Он использует заднюю камеру.
- ARBodyTrackingConfiguration: отслеживает только человеческие тела. Он использует заднюю камеру.
- ARImageTrackingConfiguration: отслеживает только известные изображения, используя заднюю камеру.
- ARObjectScanningConfiguration: используется для сканирования 3D-объектов, которые вы хотите отслеживать. Он использует заднюю камеру.
- ARFaceTrackingConfiguration: отслеживает только лица и выражения лиц. При этом используется фронтальная камера.
Тот, который вы будете использовать сейчас ARFaceTrackingConfiguration
. Когда вы запустите эту конфигурацию, ваше приложение переключится на фронтальную камеру.
Добавьте следующий блок кода вupdateView(_:context:)
:
// 1 let arConfiguration = ARFaceTrackingConfiguration() // 2 uiView.session.run(arConfiguration, options:[.resetTracking, .removeExistingAnchors])
Внимательно посмотрите на то, что вы делаете с этим кодом:
- Сначала вы создаете новый экземпляр
ARFaceTrackingConfiguration
withinarConfiguration
. Теперь конфигурация содержит необходимую информацию, чтобы сообщить сеансу AR, что вы хотите начать отслеживание лиц. - Это запускает сеанс AR с недавно созданной конфигурацией AR вместе с несколькими дополнительными параметрами.
resetTracking
указывает, что вы хотите перезапустить процесс отслеживания AR.removeExistingAnchors
удаляет все существующие якоря, если таковые имеются.
Переключение между несколькими сценами
Наконец, вам нужно переключаться между тремя сценами, когда пользователь нажимает кнопки Previous или Next.
Добавьте следующий блок кода в нижнюю частьupdateView(:context:)
:
switch(propId) { case 0: // Eyes let arAnchor = try! Experience.loadEyes() uiView.scene.anchors.append(arAnchor) break case 1: // Glasses let arAnchor = try! Experience.loadGlasses() uiView.scene.anchors.append(arAnchor) break case 2: // Mustache let arAnchor = try! Experience.loadMustache() uiView.scene.anchors.append(arAnchor) break default: break }
Каждый раз, когда пользователь нажимает Next или Previous, значение propId
увеличивается или уменьшается на 1, что делает сцену недействительной и делает вызов updateView(:context:)
. Затем оператор switch проверяет значение propId
для переключения на соответствующую сцену.
Во-первых, вы инициализируетеarAnchor
, загружая соответствующую якорную сцену из Experience
. После загрузки вы добавляете якорь arView.scene.anchors
, который представляет эту конкретную сцену в представлении.
Тестирование приложения
Наконец, вы готовы сделать свою первую сборку и запустить. Перед этим подключите физическое устройство к компьютеру и выберите его в Xcode.
Примечание: У вас возникнут проблемы с компилятором, если вы не подключите свое физическое устройство к Xcode и не выберете его в качестве места назначения сборки.
Готовы к сборке и запуску? Дерзай!

Отлично, приложение запустилось, и вы можете использовать кнопки Next и Previous для выбора различных реквизитов.
Хотя это выглядит довольно круто, есть небольшая проблема — реквизит застревает и никогда не исчезает.
Снятие анкеров вручную
Каждый раз, когда вы переключаетесь с одной сцены на другую, вы загружаете якорь, который добавляется ARView.Scene.anchors
. Если вы продолжите добавлять несколько якорей, вы получите несколько опор, сложенных друг на друга.
Чтобы решить эту проблему, вам нужно вручную удалить ранее добавленные якоря перед добавлением нового.
Добавьте следующую строку кода в началоupdateView(_:context:)
:
arView.scene.anchors.removeAll()
Это удаляет все доступные якоря внутри arView.scene.anchors
.
Помните, что каждый раз, когда пользователь выбирает следующую или предыдущую кнопку, она делает сцену недействительной и делает вызов updateView(_:context:)
. Таким образом, каждый раз, когда пользователь переключается на новую опору, приложение удаляет предыдущую опору (лицевой якорь) перед добавлением новой.
Сделайте еще одну сборку и запустите, чтобы снова протестировать приложение.

Отлично, теперь вы можете переключаться между реквизитами без каких-либо проблем.
Примечание: Вы можете найти окончательный проект в final/ARFunnyFace/ARFunnyFace.xcodeproj.
Ключевые моменты
Поздравляем, вы дошли до конца этой главы, и ваше приложение AR Funny Face выглядит великолепно. Возьмите несколько селфи себя и некоторых друзей и попробуйте забавный реквизит.
Вот некоторые из ключевых моментов, которые вы рассмотрели в этой главе:
- Лицевые якоря: теперь у вас есть хорошее представление о том, что такое лицевые якоря и как их использовать в ваших сценах.
- Создание лицевых якорей: Благодаря Reality Creator создание лицевых якорей очень просто.
- Создание нескольких сцен: один композитор реальности может содержать несколько сцен, которые очень легко добавить.
- Генерация кода: Reality Composer тесно интегрирован в Xcode. При компиляции Xcode генерирует код, который обеспечивает строго типизированный доступ к содержимому сцен и объектов в файле реальности.
- Сеанс и конфигурация AR: Вы узнали о сеансе AR и о том, как создавать собственные конфигурации AR.
- Переключение между сценами: Наконец, вы узнали, как легко переключаться между несколькими сценами в приложении RealityKit.
В следующей главе вы расширите приложение AR Funny Face еще одной сценой, где вы сможете управлять гигантской головой робота с помощью собственных выражений лица!