使用 RealityKit 跟踪相机位置 [英] Track camera position with RealityKit

查看:42
本文介绍了使用 RealityKit 跟踪相机位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

func session(_ session: ARSession, didUpdate frame: ARFrame) {//用新的变换做一些事情让 currentTransform = frame.camera.transformdoSomething(with: currentTransform)}

解决方案

使用 ARView 相机变换:

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

var cameraTransform: 变换

<块引用>

当前活动相机的变换.

因此假设您的 ARView 被称为 arView,您可以像这样访问 Transform:

让cameraTransform = arView.cameraTransform

然而,一个更有用的实现是使您的 ARView 能够通过使用以下内容来观察 SceneEvents.Update:

subscribe(to:on:_:)func subscribe<E>(事件:E.Type, on sourceObject: EventSource? = nil, _ handler: @escaping (E) -> Void) ->可取消,其中 E : 事件

这意味着你会有一个观察者:

<块引用>

事件每帧间隔触发一次,可用于执行每个帧的自定义逻辑.

要做到这一点,您将:首先导入Combine框架.

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

var sceneObserver:可取消!

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

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

其中每次更新调用以下内容:

////ARView 更新事件的回调///- 参数事件:SceneEvents.Updatefunc updateScene(事件:SceneEvents.Update){打印(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) {守卫让 arCamera = session.currentFrame?.camera else { return }打印("""ARCamera 变换 = \(arCamera.transform)ARCamera ProjectionMatrix = \(arCamera.projectionMatrix)ARCamera EulerAngles = \(arCamera.eulerAngles)""")}}

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

How can you track the position of the camera using RealityKit? Several examples are using SceneKit, but I found none using RealityKit. I need a function such as:

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

解决方案

Using ARView Camera Transform:

You can access the ARView Camera Transform using the following method:

var cameraTransform: Transform

The transform of the currently active camera.

So assuming your ARView was called arView you could access the Transform like so:

let cameraTransform = arView.cameraTransform

A more useful implementation however would be to enable your ARView to observe SceneEvents.Updateby making use of the following:

subscribe(to:on:_:)

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

Which means you would have an observer of any:

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

To do that you would: Firstly import the Combine Framework.

You would then create a Cancellable variable:

var sceneObserver: Cancellable!

Then in ViewDidLoad add something like the following:

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

Whereby each update calls the following:

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

  print(arView.cameraTransform)

}

Using ARSessionDelegate:

Alternatively you can access the ARCamera from within RealityKit by subscribing to the ARSessionDelegate e.g:

arView.session.delegate = self

And then registering for the following callback:

func session(_ session: ARSession, didUpdate frame: ARFrame)

Whereby a working example would look something like this:

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

  }

}

Hope it points you in the right direction.

这篇关于使用 RealityKit 跟踪相机位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆