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

时间:2018-09-24 10:21:37

标签: swift augmented-reality arkit ios12

在AR应用程序上工作,一旦跟踪了图像并放置了3d模型,则需要将对象放置在ARImageAnchor上,然后它不应与图像锚点一起移动,而应该跟随iPhone上的摄像头角度并与锚点保持一定距离。 / p>

尝试了很多代码。

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

另一种尝试:

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)

}

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

无法理解如何获取pointOfView转换和Anchor.tranform之间的距离和角度。 任何帮助将不胜感激。 预先感谢。

1 个答案:

答案 0 :(得分:0)

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

let cameraTransform = self.sceneView.session.currentFrame.camera.transform
let cameraEulerAngle = self.sceneView.session.currentFrame.camera.eulerAngle

cameraTransform是一个4x4矩阵,如果要使用单个坐标,则需要获取第三列:

let x = cameraTransform.columns.3.x
let y = cameraTransform.columns.3.y
let x = cameraTransform.columns.3.z

这是三轴坐标。

cameraEulerAngle是3x3矩阵,您可以获得:

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

let angleX = cameraEulerAngle.x
let angleY = cameraEulerAngle.y
let angleZ = cameraEulerAngle.z

如果要将节点放置在相机的前面,则需要使用相机的X,Y坐标并给出Z值,该值是距相机的距离(以米为单位)。 请注意,如果要更精确,则需要基于相机旋转在轴坐标上添加偏移量。

您可以获得更多信息herehere (ARCamera)