2017-07-26 137 views
1

嘿,我试图不断获得设备相机/ ARCamera的价值。据我所知,只有一个功能允许我访问这些ARCamera特性。也就是说此功能在这里:如何不断获取旋转/欧拉角值ARCamera

代码:

// Only gets called couple times when camera state changes 

func session(_ session: ARSession, cameraDidChangeTrackingState camera: ARCamera) 

    print("\(camera.eulerAngles)") 

} 

我一直在想,也许使用一些诡计喜欢把重复的计时器中,将调用该值的功能。但是我不能打电话给一个本地选择器。什么我更追求的是沿着这个功能是如何行的东西:

func renderer(_ aRenderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { 
// This constantly gets called. 
} 

我不知道是否有以纳入ARCamera到函数的方式。

回答

1

如果你想持续获得相机状态更新,实现ARSessionDelegate.session(_:didUpdate:)

class MyDelegate: ARSessionDelegate { 

    func session(_ session: ARSession, didUpdate frame: ARFrame) { 
    print("\(frame.camera)") 
    } 

    /* ... */ 
} 

的ARFrame对象应包含所有必要的信息camera领域。


如果你只是想跟踪状态发生变化时就知道了,你可能想将状态从session(_:cameraDidChangeTrackingState:)存储在一个领域,是指它在你的渲染循环:

class MyDelegate: SCNSceneRendererDelegate, ARSessionObserver { 

    var camera: ARCamera! = nil 

    func session(_ session: ARSession, cameraDidChangeTrackingState camera: ARCamera) { 
    self.camera = camera 
    } 

    func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { 
    print("\(self.camera.trackingState)") 
    } 

    /* ... more methods ... */ 
} 
+0

谢谢您的回答非常感谢,但不幸的是,(cameraDidChangeTrackingState)只有在状态改变时才会被调用。所以它实际上没有记录camera.eulerAngles /特性。每一秒。所以(updateAtTime)将继续打印相同的东西。不幸的是,在这方面还没有任何信息。由于ARKits只有一两天的时间。 – Hunter

+0

你可以让你的类'ARSessionDelegate',它将接收'session(_:didUpdate:)'。第二个参数只是一个ARFrame,其中包含当前ARCamera实例的'camera'字段。更多:https://developer.apple.com/documentation/arkit/arsessiondelegate/2865611-session –