ARKit会话已暂停且未恢复

joh*_*doe 9 ios arkit

在我的ARKit应用程序中,我提出了一个模态窗口.当我关闭模态并返回到ARSCNView时,我发现由于此代码,会话暂停:

 override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        // Pause the view's session
        sceneView.session.pause()
    } 
Run Code Online (Sandbox Code Playgroud)

当我关闭模态并返回到ARKit相机视图屏幕时,此代码被触发:

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        // Create a session configuration
        let configuration = ARWorldTrackingSessionConfiguration()

        // Run the view's session
        sceneView.session.run(configuration)
    }
Run Code Online (Sandbox Code Playgroud)

但是这段代码永远不会恢复会话.屏幕在其读取的最后一张图像上完全冻结.有任何想法吗?

我将viewDidAppear代码更新为以下内容.它仍然卡在相机屏幕上,图像被冻结.

  override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        // Create a session configuration
        let configuration = ARWorldTrackingSessionConfiguration()

        sceneView.session.delegate = self

        if self.isPaused {
            sceneView.session.run(sceneView.session.configuration!)
        } else {
            // Run the view's session
            sceneView.session.run(configuration)
        }


    }
Run Code Online (Sandbox Code Playgroud)

ric*_*ter 11

不确定为什么你的会话没有恢复,但是...这通常不是你想要的情况.

请注意自述文件附带Apple的ARKit示例代码(附加到ARKit上WWDC17会话):

避免中断AR体验.如果用户转换到应用中的另一个全屏UI,则AR视图在返回时可能不是预期的状态.

使用弹出式演示(甚至在iPhone上)用于辅助视图控制器,以在调整设置或进行模式选择时使用户保持AR体验.在此示例中,SettingsViewControllerVirtualObjectSelectionViewController类使用popover演示.

更详细一点:如果您暂停会话,当您的用户离开不同的全屏视图控制器时,它将无法跟踪世界.这意味着当您恢复时,放置在场景中的任何虚拟内容都不会位于您离开它的位置(相对于摄像机).


小智 5

我不知道 iOS 11 GM Seed 或 XCode 9 GM Seed 版本今天是否修复了这个问题,但是我可以像原始问题一样使用代码成功恢复暂停的 ARSCNview。

sceneView.session.run(sceneView.session.configuration!)
Run Code Online (Sandbox Code Playgroud)