使用 ARView 相机变换:
您可以使用以下方法访问 ARView Camera Transform:
var cameraTransform: Transform
当前活动相机的变换。
所以假设你ARView
被调用arView
,你可以访问Transform
这样的:
let cameraTransform = arView.cameraTransform
然而,更有用的实现是让您能够通过以下方式ARView
进行观察:SceneEvents.Update
subscribe(to:on:_:)
func subscribe<E>(to event: E.Type, on sourceObject: EventSource? = nil, _ handler: @escaping (E) -> Void) -> Cancellable where E : Event
这意味着您将拥有以下任何一个观察者:
每帧间隔触发一次事件,您可以使用它为每帧执行自定义逻辑。
为此,您将:首先导入Combine
框架。
然后,您将创建一个Cancellable
变量:
var sceneObserver: Cancellable!
然后ViewDidLoad
添加如下内容:
sceneObserver = arView.scene.subscribe(to: SceneEvents.Update.self) { [unowned self] in self.updateScene(on: $0) }
因此,每次更新都会调用以下内容:
/// Callback For ARView Update Events
/// - Parameter event: SceneEvents.Update
func updateScene(on event: SceneEvents.Update) {
print(arView.cameraTransform)
}
使用 ARSessionDelegate:
或者,您可以通过订阅例如ARCamera
从内部访问:RealityKit
ARSessionDelegate
arView.session.delegate = self
然后注册以下回调:
func session(_ session: ARSession, didUpdate frame: ARFrame)
因此,一个工作示例看起来像这样:
extension ViewController: ARSessionDelegate {
func session(_ session: ARSession, didUpdate frame: ARFrame) {
guard let arCamera = session.currentFrame?.camera else { return }
print("""
ARCamera Transform = \(arCamera.transform)
ARCamera ProjectionMatrix = \(arCamera.projectionMatrix)
ARCamera EulerAngles = \(arCamera.eulerAngles)
""")
}
}
希望它为您指明正确的方向。