在我的Swift
/ ARKit
/ SceneKit
项目中,我需要确定前置摄像头中用户的脸部是否与摄像头平行。
通过比较左眼和右眼距离(使用faceAnchor.leftEyeTransform
和worldPosition
属性),我就能分辨出水平方向的平行度。
但是我被困在垂直平行线上。有什么想法,如何实现?
答案 0 :(得分:6)
假设您在应用中使用ARFaceTrackingConfiguration
,则实际上可以检索ARFaceAnchor
和相机的变换以确定它们的方向。您可以使用simd_float4x4
属性来获得世界空间中头部方向的ARFaceAnchor.transform
矩阵。同样,您可以获取场景的SCNCamera
或ARCamera
的变换。
要在SceneKit应用中比较相机和脸部的相对方向(尽管事物在ARKit方面具有相似的功能),我获得了附加到它们各自的节点的世界变换,我们称之为它们faceNode
附加在ARFaceAnchor
上,而cameraNode
代表ARSCNView.pointOfView
。例如,要找到相机和脸部之间的角度,可以执行以下操作:
let faceOrientation: simd_quatf = faceNode.simdWorldTransform
let cameraOrientation: simd_quatf = cameraNode.simdWorldTransform
let deltaOrientation: simd_quatf = faceOrientation.inverse * cameraOrientation
通过查看deltaOrientation.angle
和deltaOrientation.axis
,可以确定人脸与相机之间各轴的相对角度。如果您执行类似deltaOrientation.axis * deltaOrientation.angles
的操作,则您有一个simd_float3
向量,可以使您感觉到头部相对于摄像机的俯仰,偏航和侧倾(以弧度为单位)。
您可以通过多种方式使用面部锚和摄影机转换来执行此操作,但是这种simd四元数方法对我来说效果很好。希望这可以帮助!