使用ARView相机变换:
您可以使用以下方法访问ARView相机变换:
var cameraTransform: Transform
当前活动摄像机的转换。
假设您的 ARView
被称为 arView
,则可以通过以下方式访问 Transform
:
let cameraTransform = arView.cameraTransform
然而,更有用的实现方式是通过使用以下内容使您的ARView
观察SceneEvents.Update
:
```csharp
this.sceneSubscriber = SceneEvents.Update.Subscribe(OnUpdate);
```
```csharp
private void OnUpdate(Scene scene)
{
// Your code here.
}
```
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) }
每次更新都会调用以下内容:
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)
""")
}
}
希望它能为您指明正确的方向。