【问题标题】:Track camera position with RealityKit使用 RealityKit 跟踪摄像头位置
【发布时间】:2019-12-06 06:03:26
【问题描述】:

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

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

【问题讨论】:

    标签: ios swift augmented-reality arkit realitykit


    【解决方案1】:

    使用 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:

    您也可以通过订阅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)
          """)
    
      }
    
    }
    

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

    【讨论】:

    • 一如既往的好答案!通过 Combine 订阅更新有什么好处?我习惯于在 SceneKit 中使用会话代表,并且也更愿意在 RealityKit 中这样做,除非 Combine 带来好处?
    猜你喜欢
    • 2018-01-29
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2015-09-14
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多