使用 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:
或者,您可以通过订阅 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)
""")
}
}
希望它能为您指明正确的方向。
如何使用 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:
或者,您可以通过订阅 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)
""")
}
}
希望它能为您指明正确的方向。