以每秒特定速率获取帧的位置

Get frame's position at an specific rate per second

我试图通过添加渲染器委托方法(ARSCNViewDelegate 中的方法)获取 camera 在场景中的当前位置:

func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) {

    guard let pointOfView = sceneView.pointOfView else { return }
    let transform = pointOfView.transform
    let position = SCNVector3Make(transform.m41, transform.m42, transform.m43)
    let orientation = SCNVector3Make(transform.m31, transform.m32, transform.m33)
    ...
}

我想以每秒特定的帧数(在我的例子中为 25 fps)获得这些位置。我可以通过修改这个参数来得到这个:preferredFramesPerSecond 但它总是自动调整到 30 fps,而不是 25。 它适用于 5、15、20、30、45 或 60,但为什么不适用于 25 fps?

override func viewDidLoad() {

    super.viewDidLoad()
    ...
    sceneView.preferredFramesPerSecond = 25
    ...
}

无论如何,当然降低 FPS 意味着更差的 AR 性能所以...是否有另一种方法可以在我每次需要时向 ARKit 询问帧相机位置?特别是每 25 fps。

非常感谢!

这用于运行 特定时间后的代码块。 (你的情况是 1/25)

func recurringFunction(){
    // your code here
    guard let pointOfView = sceneView.pointOfView else { return }
    let transform = pointOfView.transform
    let position = SCNVector3Make(transform.m41, transform.m42, transform.m43)
    let orientation = SCNVector3Make(transform.m31, transform.m32, transform.m33)
    ....

    DispatchQueue.main.asyncAfter(deadline: .now() + 1/25) {
        self.recurringFunction()
    }
}

它还有助于 运行在不降低您通常的 fps 的情况下安装您的应用程序。