5

如何使用 RealityKit 跟踪相机的位置?有几个例子使用了 SceneKit,但我发现没有一个使用 RealityKit。我需要一个功能,例如:

func session(_ session: ARSession, didUpdate frame: ARFrame) {
    // Do something with the new transform
    let currentTransform = frame.camera.transform
    doSomething(with: currentTransform)
}
4

1 回答 1

11

使用 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从内部访问:RealityKitARSessionDelegate

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)
      """)

  }

}

希望它为您指明正确的方向。

于 2019-11-29T02:53:03.570 回答