ARKit Relocalization не работает после .resetTracking - PullRequest
0 голосов
/ 17 апреля 2019

В моем приложении ARKit у меня есть метод делегата "sessionShouldAttemptRelocalization", возвращающий true, чтобы сеанс мог возобновиться после прерывания.

func sessionShouldAttemptRelocalization(_ session: ARSession) -> Bool {
    return true
}

Это работает отлично, и после любого прерывания, если пользователь возвращается в исходное место + удерживает устройства примерно в одинаковой ориентации, все объекты будут автоматически отрегулированы.

Однако проблема, с которой я столкнулся, заключается в том, что, если пользователь сбросит конфигурацию один раз, дальнейшие перемещения будут неудачными.

Например:

  1. Пользователь размещает объекты AR.
  2. Пользователь прерывает сеанс. (Останавливает Центр уведомлений и ждет пару секунд)
  3. Пользователь возобновляет сеанс и возвращается в исходное положение. (Здесь все идет хорошо, и все отображается так же, как до прерывания. Это может повторяться несколько раз, и это будет работать каждый раз)
  4. Пользователь прерывает сеанс.
  5. Пользователь возобновляет сеанс, и до успешного перемещения локализации пользователь нажимает кнопку «Сбросить кнопку AR»
  6. Пользователь размещает другие объекты AR.
  7. Пользователь прерывает сеанс.
  8. Пользователь возобновляет сеанс. (Здесь перемещение никогда не будет успешным. Это можно повторить несколько раз, нажав кнопку «Сброс AR», размещая новые объекты, прерывая, возобновляя и пытаясь переместить их. Это никогда не будет работать)

Метод сброса отслеживания, который я использую, следующий:

func resetTracking() {
    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = [.horizontal]
    configuration.isLightEstimationEnabled = true
    sceneView.session.run(configuration, options: [.resetTracking])

    // ... code to remove all nodes...
}
...