使用ARWorldTrackingConfiguration从ARKit获取6DOF向量

时间:2018-02-22 18:14:24

标签: ios swift arkit

使用带有ARWorldTrackingConfiguration的ARKit时,是否可以读取当前的6个自由度移动值(例如平移和旋转矢量)?

我指的是ARWorldTrackingConfiguration及其6个自由度,如https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration所述

我想获取设备运动的当前值,例如相对于原点的平移和旋转矢量(例如AR会话的起点)。

2 个答案:

答案 0 :(得分:1)

ARCamera表示任何ARKit会话中的设备姿势。如果您正在运行世界跟踪会话,则相机的transform矩阵是旋转和平移变换的串联。 (并且该变换相对于世界坐标原点,它基于您开始会话时的位置。)如果您没有世界跟踪会话,则没有平移(变换只是一个旋转矩阵)。

如果你需要帮助将变换矩阵分解为旋转/平移向量,那就不是ARKit特有的 - 如果你想看看它是如何工作的,请查看common 3D graphics question。但有些捷径:

  • 翻译向量是矩阵的最后一列(例如transform.columns.3
  • 您可以通过ARCamera.eulerAngles属性获得以俯仰/滚转/偏航角度表示的旋转。
  • 您可以将整个矩阵传递给simd_quatf初始化程序,从而将旋转作为四分之一。

答案 1 :(得分:0)

let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = .horizontal
arSceneView.session.run(configuration)

这会给你6DOF。只需确保在移动之前检测到飞机。

您可以使用触摸位置在ARKit场景中移动对象。您可以执行光线跟踪来实现此目的。这一切都在您通过相机检测到的水平平面上工作,仅此而已。

let hitResult = sceneView.hitTest(touchLocation, types: .existingPlane)

此hitResult数组将帮助您放置对象。  例如。

let velocity :CGPoint = recognizer.velocity(in: self.arSceneView)
self.objectModel.node.position.y = (self.objectModel.node.position.y + Float(velocity.y * -0.0001))

这是你的翻译。     let translation = recognizer.translation(in:recognizer.view!)

    let x = Float(translation.x)
    let y = Float(-translation.y)

    let anglePan = (sqrt(pow(GLKMathDegreesToRadians(x),2)+pow(GLKMathDegreesToRadians(y),2)))
    var rotationVector = SCNVector4()
    rotationVector.x = -y
    rotationVector.y = x
    rotationVector.z = 0
    rotationVector.w = anglePan

    self.objectModel.node.rotation = rotationVector
    self.sphereNode.rotation = rotationVector

在SceneKit中对模型进行旋转。这些只是如何在ARScene中进行翻译和旋转的示例。根据需要进行更改。

arSceneView.pointOfView是你的相机。此节点的旋转和位置变换应该为您提供设备的位置和旋转。

arSceneView.pointOfView?.transform // Gives you your camera's/device's SCN4Matrix transform
arSceneView.pointOfView?.eulerAngles // Gives you the SCNVector3 rotation matrix.
arSceneView.pointOfView?.position // Gives you the camera's SCNVector3 position matrix.