我如何才能绝对获得ARAnchor的偏航,俯仰和滚动?

时间:2018-11-17 15:07:52

标签: swift arkit

我已经尝试了好几天了。

给出一个基于ARKit的应用程序,该应用程序可以在其中跟踪用户的脸部,如何从其锚点绝对地获取脸部的旋转度?

我可以得到ARAnchor的变换,它是simd_matrix4x4。 有很多关于如何从该矩阵中获取位置的信息(这是第三列),但是旋转上没有任何信息!

我希望能够通过传递YAW,PITCH和ROLL来控制应用程序外部的3D对象。

我尝试过的最新的东西实际上可以起作用:

let arFrame = session.currentFrame!
guard let faceAnchor = arFrame.anchors[0] as? ARFaceAnchor else { return }

let faceMatrix = SCNMatrix4.init(faceAnchor.transform)
let node = SCNNode()

node.transform = faceMatrix
let rotation = node.worldOrientation

rotation.x .y和.z具有我可以使用的值,但是当我移动手机时,这些值会改变。例如,如果我转动180°并继续看着手机,则值会根据手机的位置而发生巨大变化。

我尝试在ARConfiguration中更改世界对齐方式,但这没什么不同。

我读错了参数吗?这本来应该容易得多!

2 个答案:

答案 0 :(得分:1)

我了解到您正在使用前置摄像头和ARFaceTrackingConfiguration,但这不能给您绝对的价值。我会尝试使用ARSession为后置摄像头配置第二个ARWorldTrackingConfiguration,它确实提供了绝对值。最终解决方案可能需要两个ARSession的值。我还没有检验这个假设,但这似乎是唯一的方法。

来自ARWorldTrackingConfiguration

UPDATE 报价-

  

ARWorldTrackingConfiguration类以六个自由度(6DOF)跟踪设备的运动:特别是三个旋转轴(滚动,俯仰和偏航)和三个平移轴(在x,y和z中移动)。这种跟踪可以创建身临其境的AR体验:即使用户将设备倾斜到物体上方或下方,或四处移动设备以查看虚拟物体,虚拟物体似乎也可以相对于现实世界停留在同一位置。物体的侧面和背面。

显然,其他跟踪配置没有具有此功能。

答案 1 :(得分:1)

我知道了...

一旦有了脸部定位点,就需要对其变换矩阵和相机的变换进行一些计算。

赞:

let arFrame = session.currentFrame!
guard let faceAnchor = arFrame.anchors[0] as? ARFaceAnchor else { return }

let projectionMatrix = arFrame.camera.projectionMatrix(for: .portrait, viewportSize: self.sceneView.bounds.size, zNear: 0.001, zFar: 1000)
let viewMatrix = arFrame.camera.viewMatrix(for: .portrait)

let projectionViewMatrix = simd_mul(projectionMatrix, viewMatrix)
let modelMatrix = faceAnchor.transform
let mvpMatrix = simd_mul(projectionViewMatrix, modelMatrix)

// This allows me to just get a .x .y .z rotation from the matrix, without having to do crazy calculations
let newFaceMatrix = SCNMatrix4.init(mvpMatrix)
let faceNode = SCNNode()
faceNode.transform = newFaceMatrix
let rotation = vector_float3(faceNode.worldOrientation.x, faceNode.worldOrientation.y, faceNode.worldOrientation.z)

rotation.x .y和.z将分别返回面部的俯仰,偏航,横滚

我要添加一个小的乘数并将轴的2反转,因此最终结果如下:

yaw = -rotation.y*3
pitch = -rotation.x*3
roll = rotation.z*1.5

Ph!