【问题标题】:Check if ARSession is running (ARKit)检查 ARSession 是否正在运行(ARKit)
【发布时间】:2018-10-12 00:51:38
【问题描述】:

我有一个 ARSCNView,它可以根据情况偶尔暂停其 session。有没有办法检查它的session 是否正在运行?

类似这样的:

class myARView: ARSCNView {
    ...
    func foo() {

        if(session.running) {
            // do stuff
        }
    }
    ...
}

【问题讨论】:

  • 一种方法是在您暂停/恢复会话时设置一个布尔值并在您的函数中检查该布尔值。
  • 对,我想过,但是 ARSCNView 是公开的,所以如果我/其他人忘记设置该布尔值或使用自定义启动/暂停方法,可能会导致不需要的行为。如果没有内置方法,那么将其发布为答案,我会接受。如果您这样做,请同时提及缺少此 API :)
  • 我不是 100% 确定是否真的没有办法使用 API 来实现这一点,我现在正在检查它。 :)

标签: ios swift scenekit arkit arscnview


【解决方案1】:

目前,ARSession 对象本身似乎无法检查会话是否正在运行。但是,通过实现ARSCNViewDelegate,您可以在会话中断或中断结束时收到通知。

实现目标的一种方法是设置一个布尔值并在您暂停/恢复会话时对其进行更新,并在您的函数中检查其值。

class ViewController: UIViewController, ARSCNViewDelegate {

    var isSessionRunning: Bool

    func foo() {
        if self.isSessionRunning {
            // do stuff
        }
    }

    func pauseSession() {
        self.sceneView.session.pause()
        self.isSessionRunning = false
    }

    func runSession() {
        let configuration = ARWorldTrackingConfiguration()
        sceneView.session.run(configuration)
        self.isSessionRunning = true
    }

    // ARSCNViewDelegate:
    func sessionWasInterrupted(_ session: ARSession) {
        self.isSessionRunning = false
    }

    func sessionInterruptionEnded(_ session: ARSession) {
        self.isSessionRunning = true
    }
}

【讨论】:

  • 好的,所以在尝试重现此内容时,我发现session.pause() 根本没有暂停任何内容,而且我忘记提及我正在尝试使用该功能:D。由于亲爱的Apple忘记在调用 pause() 时暂停场景,因此使用布尔值并按照您所说的那样跟踪它似乎是唯一可靠的方法(我刚刚尝试过,我可以确认在调用此 ARSession 的愚蠢构建后-在session.pause() 函数中,我的设备仍在跟踪运动)。
  • 澄清一下,问题不在于如何暂停,但我的意思是您的回答解决了跟踪问题(如所要求的那样),并且在尝试时我还认为布尔值是必要的,即使不是跟踪状态,因为 session.pause() 无论如何都不起作用
猜你喜欢
  • 1970-01-01
  • 2019-07-08
  • 2021-10-27
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 2014-08-25
相关资源
最近更新 更多