iOS AR Kit 3 World Tracking перестает работать после переключения камер - PullRequest
0 голосов
/ 23 февраля 2020

Я занимаюсь разработкой приложения AR Drawing и обнаружил ошибку / проблему в AR Kit 3. Отслеживание мира перестает работать, и 3D-объекты, добавленные в представление AR, заморожены.

Мое приложение переключается между передняя и задняя камера, в обоих случаях я включаю World Tracking.

1. Я включаю сеанс задней камеры следующим образом:

let configuration = ARWorldTrackingConfiguration()
configuration.isLightEstimationEnabled = true
configuration.planeDetection = [.horizontal, .vertical]
if #available(iOS 13.0, *) {
    configuration.frameSemantics = [.personSegmentationWithDepth]
}
sceneView.session.run(configuration)

Все работает идеально, если я просто запускаю эту конфигурацию в сеансе сцены.

2. Когда я переключаюсь на фронтальную камеру вот так:

let configuration = ARFaceTrackingConfiguration()
if #available(iOS 13.0, *) {
    configuration.isWorldTrackingEnabled = true
}
configuration.isLightEstimationEnabled = true
if #available(iOS 13.0, *) {
    configuration.frameSemantics = [.personSegmentation]
}
sceneView.session.run(configuration)

Все по-прежнему работает отлично.

3. Но когда я переключаюсь обратно на сеанс задней камеры (я переключаюсь назад, как в точке 1.):

3D-объекты, добавленные в сцену AR, замирают в режиме c, и мировая дорожка останавливается за работой. И нет никакого способа вернуть его к работе, кроме закрытия приложения и повторного открытия.

Забавные вещи:

  • Когда я отключаю configuration.isWorldTrackingEnabled = true часть Ошибка не появляется. Но мне нужно, чтобы был установлен configuration.isWorldTrackingEnabled = true.
  • Сеанс фронтальной камеры никогда не прерывается, даже после появления ошибки, если я переключаюсь обратно на фронтальную камеру, отслеживание мира там работает хорошо.

Вот видео (без ошибок) приложения с configuration.isWorldTrackingEnabled =false:

Видео без ошибок - https://www.youtube.com/watch?v=JPAa6zJe_kQ

А вот видео (появляется ошибка) приложения с configuration.isWorldTrackingEnabled =true:

Да, видео об ошибке - https://www.youtube.com/watch?v=UF2Z8c4A42I

Что я уже пробовал?

  • Сначала я попытался запустить приложение на фронтальной камере , чтобы посмотреть, не сломается ли при переходе на заднюю камеру. И да, он тоже ломается.
  • Я попытался запустить ARFaceTrackingConfiguration() с configuration.isWorldTrackingEnabled = true, а затем снова запустить его с configuration.isWorldTrackingEnabled = false, чтобы посмотреть, переопределит ли это что-нибудь и исправит ли это. Но без блокировки, все еще ломается.
  • Я также пытался приостановить сеанс и затем снова включить его между переключателями камеры, но все еще глючил. Даже с задержками.
  • Я также пытался запустить конфигурацию с настройками, такими как: sceneView.session.run(configuration,options: [.resetTracking,.removeExistingAnchors,.stopTrackedRaycasts]), но все же не повезло.

У всех есть идеи, как это исправить ? Кто-нибудь сталкивался с таким странным поведением?

1 Ответ

0 голосов
/ 24 февраля 2020

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

Я бы посоветовал изучить пример проекта Apple " Combining User Tracking и World Tracking *", который содержит подробности о том, как использовать отслеживание лица с задней камерой. Это предполагает, что вам нужно только отслеживать лицо, а не показывать фронтальную камеру, что не может быть разумным для вас.

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

Кроме того, возможно, стоит попытаться установить userFaceTrackingEnabled в значение true при настройке ARWorldTrackingConfiguration.

Короче говоря, вы на самом деле не переключаетесь между камерами, как вы думаете, вы переключаете конфигурации, которые происходят использовать разные камеры. В iOS / iPadOS 13 добавлена ​​возможность реализовывать отслеживание лиц в конфигурации отслеживания мира и отслеживание мира в конфигурации отслеживания лица, но с целью активного запуска обеих камер одновременно, но только для предварительного просмотра камеры одной из этих камер. пользователю во время сеанса (впоследствии, окклюзия людей на самом деле ничего не делает в конфигурации ARFaceTrackingConfiguration; она работает только на задней камере - вам нужно использовать AVDepthData для выполнения аналогичного эффекта).

...