В моем приложении ARKit у меня есть метод делегата "sessionShouldAttemptRelocalization", возвращающий true, чтобы сеанс мог возобновиться после прерывания.
func sessionShouldAttemptRelocalization(_ session: ARSession) -> Bool {
return true
}
Это работает отлично, и после любого прерывания, если пользователь возвращается в исходное место + удерживает устройства примерно в одинаковой ориентации, все объекты будут автоматически отрегулированы.
Однако проблема, с которой я столкнулся, заключается в том, что, если пользователь сбросит конфигурацию один раз, дальнейшие перемещения будут неудачными.
Например:
- Пользователь размещает объекты AR.
- Пользователь прерывает сеанс. (Останавливает Центр уведомлений и ждет пару секунд)
- Пользователь возобновляет сеанс и возвращается в исходное положение. (Здесь все идет хорошо, и все отображается так же, как до прерывания. Это может повторяться несколько раз, и это будет работать каждый раз)
- Пользователь прерывает сеанс.
- Пользователь возобновляет сеанс, и до успешного перемещения локализации пользователь нажимает кнопку «Сбросить кнопку AR»
- Пользователь размещает другие объекты AR.
- Пользователь прерывает сеанс.
- Пользователь возобновляет сеанс. (Здесь перемещение никогда не будет успешным. Это можно повторить несколько раз, нажав кнопку «Сброс AR», размещая новые объекты, прерывая, возобновляя и пытаясь переместить их. Это никогда не будет работать)
Метод сброса отслеживания, который я использую, следующий:
func resetTracking() {
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal]
configuration.isLightEstimationEnabled = true
sceneView.session.run(configuration, options: [.resetTracking])
// ... code to remove all nodes...
}