Переключение ARKit между ARWorldTrackingConfiguration и ARFaceTrackingConfiguration - задняя и передняя камера

В моем проекте я хочу переключаться между ARWorldTrackingConfiguration и ARFaceTrackingConfiguration.

Я использую два разных типа обзора: ARSCNView для использования задней камеры и ARView для отслеживания лица. Сначала я запускаю ARSCNView, а потом, если пользователь хочет, он может переключиться на отслеживание лица

Я запускаю свой контроллер представления в этом режиме:

sceneView.delegate = self
sceneView.session.delegate = self

            // Set up scene content.
setupCamera()            
sceneView.scene.rootNode.addChildNode(focusSquare)

let configurationBack  = ARWorldTrackingConfiguration(
configurationBack.isAutoFocusEnabled = true
configurationBack.planeDetection = [.horizontal, .vertical]


sceneView.session.run(configurationBack, options: [.resetTracking, .removeExistingAnchors])

И я загружаю свой объект (.scn)

Когда я хочу переключиться на переднюю камеру, я перехожу к ARView, я делаю следующее:

 let configurationFront  = ARFaceTrackingConfiguration()

  // here I stop my ARSCNView session
  self.sceneView.session.pause()

    self.myArView = ARView.init(frame: self.sceneView.frame)

    self.myArView!.session.run(configurationFront)
    self.myArView!.session.delegate = self

    self.view.insertSubview(self.myArView!, aboveSubview: self.sceneView)

И затем я загружаю свой .rcproject

Итак, моя проблема начинается здесь, когда я пытаюсь вернуться к задней камере и снова перейти к ARWorldTracking.

Это мой метод:

// remove my ARView with face tracking
        self.myArView?.session.pause()

        UIView.animate(withDuration: 0.2, animations: {
            self.myArView?.alpha = 0
        }) { (true) in
            self.myArView?.removeFromSuperview()
            self.myArView = nil

        }
// here I restart the initial ARSCNView
    let configurationBack  = ARWorldTrackingConfiguration(
        configurationBack.isAutoFocusEnabled = true
        configurationBack.planeDetection = [.horizontal, .vertical]


    session.run(configurationBack, options: [.resetTracking, .removeExistingAnchors])

Когда я переключаюсь на заднюю камеру, датчик не отслеживает самолеты правильно.

Как я могу это исправить, так как я могу правильно переключаться между ARWorldTrackingConfiguration и ARFaceTrackingConfiguration?

заранее спасибо


person BlackRock    schedule 19.06.2019    source источник
comment
Кажется, ваш код в порядке. Что вы имеете в виду, что датчик не отслеживает самолеты правильно? Вы можете объяснить точное поведение?   -  person M Reza    schedule 19.06.2019
comment
@MoRezaFarahani Например, я помещаю квадрат фокуса на горизонтальную и вертикальную плоскости, чтобы указать пользователю, где будет размещен объект, но он не учитывает поверхность. Он летит посередине экрана   -  person BlackRock    schedule 19.06.2019
comment
Вам нужно одновременное обнаружение как по горизонтали, так и по вертикали?   -  person M Reza    schedule 19.06.2019
comment
Да, но это не работает только после того, как приложение вернется к использованию задней камеры с ARSCNView @MoRezaFarahani   -  person BlackRock    schedule 19.06.2019


Ответы (1)


Не забудьте также удалить все добавленные узлы в сцену, когда вы приостанавливаете сеанс. Добавьте ниже код после того, где вы приостанавливаете сеанс с помощью self.sceneView.session.pause():

self.sceneView.scene.rootNode.enumerateChildNodes { (childNode, _) in
    childNode.removeFromParentNode()
}
person M Reza    schedule 19.06.2019