Ios 用RealityKit跟踪摄像机位置

Ios 用RealityKit跟踪摄像机位置,ios,swift,augmented-reality,arkit,realitykit,Ios,Swift,Augmented Reality,Arkit,Realitykit,如何使用RealityKit跟踪相机的位置?有几个示例正在使用SceneKit,但我发现没有一个使用RealityKit。我需要一个函数,例如: func session(_ session: ARSession, didUpdate frame: ARFrame) { // Do something with the new transform let currentTransform = frame.camera.transform doSomething(with:

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

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

使用ARView相机变换:

可以使用以下方法访问ARView摄影机变换:

var cameraTransform: Transform
当前活动摄影机的变换

因此,假设您的
ARView
被调用为
ARView
,您可以访问
转换,如下所示:

let cameraTransform = arView.cameraTransform
但是,更有用的实现是使您的
ARView
能够观察
场景事件。通过使用以下内容更新

subscribe(to:on:_:)

func subscribe<E>(to event: E.Type, on sourceObject: EventSource? = nil, _ handler: @escaping (E) -> Void) -> Cancellable where E : Event
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)

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

subscribe(to:on:_:)

func subscribe<E>(to event: E.Type, on sourceObject: EventSource? = nil, _ handler: @escaping (E) -> Void) -> Cancellable where E : Event
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)

}
每次更新都会调用以下内容:

subscribe(to:on:_:)

func subscribe<E>(to event: E.Type, on sourceObject: EventSource? = nil, _ handler: @escaping (E) -> Void) -> Cancellable where E : Event
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:

或者,您可以通过订阅
ARSessionDelegate
RealityKit
中访问
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中和会议代表一起工作,也更愿意在现实中这样做,除非联合带来好处?