我已经尝试了好几天了。
给出一个基于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中更改世界对齐方式,但这没什么不同。
我读错了参数吗?这本来应该容易得多!
答案 0 :(得分:1)
我了解到您正在使用前置摄像头和ARFaceTrackingConfiguration
,但这不能给您绝对的价值。我会尝试使用ARSession
为后置摄像头配置第二个ARWorldTrackingConfiguration
,它确实提供了绝对值。最终解决方案可能需要两个ARSession
的值。我还没有检验这个假设,但这似乎是唯一的方法。
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!