如何在ARKit中获取相机位置和图像对象位置之间的角度和距离?

Rak*_*Dev 5 augmented-reality swift arkit ios12

在开发 AR 应用程序时,一旦跟踪图像并放置 3D 模型,我需要将对象放置在 ARImageAnchor 上,那么它不应该随着图像锚点移动,它应该只跟随 iPhone 上的相机角度和给定的锚点距离。

尝试了很多代码。

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    let node = SCNNode()
    if let imageAnchor = anchor as? ARImageAnchor {
            self.mainNode.simdTransform = anchor.transform
            self.sceneView.scene.rootNode.addChildNode(self.mainNode)
}
Run Code Online (Sandbox Code Playgroud)

另一种尝试:

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    let node = SCNNode()
    if let imageAnchor = anchor as? ARImageAnchor {
            guard let pointOfView = self.sceneView.pointOfView else { return }
            let transform = pointOfView.transform
            self.mainNode.transform = transform
self.sceneView.scene.rootNode.addChildNode(self.mainNode)
Run Code Online (Sandbox Code Playgroud)

}

func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) {
    guard let pointOfView = self.sceneView.pointOfView else { return }
    let transform = pointOfView.transform


let translationMatrix = SCNMatrix4Translate(transform, 1.0 , -0.5, -3.0)
}
Run Code Online (Sandbox Code Playgroud)

无法理解如何获取 pointOfView 变换和 Anchor.tranform 之间的距离和角度。任何帮助将非常感激。提前致谢。

小智 3

您需要使用相机变换和/或 eulerAngle:

let cameraTransform = self.sceneView.session.currentFrame.camera.transform
let cameraEulerAngle = self.sceneView.session.currentFrame.camera.eulerAngle
Run Code Online (Sandbox Code Playgroud)

cameraTransform是一个4x4的矩阵,如果你想要单个坐标,你需要获取第三列:

let x = cameraTransform.columns.3.x
let y = cameraTransform.columns.3.y
let x = cameraTransform.columns.3.z
Run Code Online (Sandbox Code Playgroud)

这是三轴坐标。

cameraEulerAngle是一个3x3矩阵,可以得到:

  • 螺距(x 旋转)
  • 偏航(y 轴旋转)
  • 滚动(z 轴旋转)

let angleX = cameraEulerAngle.x
let angleY = cameraEulerAngle.y
let angleZ = cameraEulerAngle.z
Run Code Online (Sandbox Code Playgroud)

如果您希望节点位于相机前面,则需要使用相机 X,Y 坐标并给出 Z 值,即距相机的距离(以米为单位)。请注意,如果您想更精确,您需要根据相机旋转在轴坐标上添加偏移量。

您可以在此处此处获取更多信息 (ARCamera)