使用 RealityKit 跟踪相机位置

Track camera position with RealityKit

如何使用 RealityKit 跟踪相机的位置?有几个示例使用的是 SceneKit,但我发现 none 使用的是 RealityKit。我需要一个函数,例如:

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

使用 ARView 相机变换:

您可以使用以下方法访问 ARView Camera Transform:

var cameraTransform: Transform

The transform of the currently active camera.

因此,假设您的 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

这意味着您将有一个观察者:

event triggered once per frame interval that you can use to execute custom logic for each frame.

为此,您需要: 首先导入Combine框架。

然后您将创建一个 Cancellable 变量:

var sceneObserver: Cancellable!

然后在ViewDidLoad中添加如下内容:

sceneObserver = arView.scene.subscribe(to: SceneEvents.Update.self) { [unowned self] in self.updateScene(on: [=14=]) }

每次更新调用以下内容:

/// Callback For ARView Update Events
/// - Parameter event: SceneEvents.Update
func updateScene(on event: SceneEvents.Update) {

  print(arView.cameraTransform)

}

使用 ARSessionDelegate:

或者,您可以通过订阅 ARSessionDelegateRealityKit 中访问 ARCamera,例如:

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

  }

}

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