使用 RealityKit 跟踪相机位置 [英] Track camera position with 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:
或者,您可以通过订阅 ARSessionDelegate
从 RealityKit
中访问 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.Update
by 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屋!