【问题标题】:ARKit: How to tell if user's face is parallel to cameraARKit:如何判断用户的脸是否与相机平行
【发布时间】:2018-10-30 06:23:41
【问题描述】:

在我的Swift / ARKit / SceneKit 项目中,我需要判断前置摄像头中用户的脸是否与摄像头平行。

我能够通过比较相机的左右眼距离(使用faceAnchor.leftEyeTransformworldPosition 属性)来判断水平平行。

但我被困在垂直平行上。任何想法,如何实现?

【问题讨论】:

    标签: swift scenekit arkit


    【解决方案1】:

    假设您在应用程序中使用ARFaceTrackingConfiguration,您实际上可以检索ARFaceAnchor 和相机的变换以确定它们的方向。您可以使用ARFaceAnchor.transform 属性在世界空间中获取头部方向的simd_float4x4 矩阵。同样,您可以获得场景的SCNCameraARCamera 的变换。

    为了在 SceneKit 应用程序中比较相机和面部相对于彼此的方向(尽管在 ARKit 方面有类似的功能),我得到了附加到它们每个节点的世界变换,让我们调用他们faceNode 附加到ARFaceAnchorcameraNode 代表ARSCNView.pointOfView。例如,要找到相机和您的脸之间的角度,您可以执行以下操作:

    let faceOrientation: simd_quatf = faceNode.simdWorldTransform
    let cameraOrientation: simd_quatf = cameraNode.simdWorldTransform
    let deltaOrientation: simd_quatf = faceOrientation.inverse * cameraOrientation
    

    通过查看deltaOrientation.angledeltaOrientation.axis,您可以确定面部和相机之间每个轴上的相对角度。如果您执行deltaOrientation.axis * deltaOrientation.angles 之类的操作,您将获得一个simd_float3 向量,让您了解头部相对于相机的俯仰、偏航和滚动(以弧度为单位)。

    您可以通过多种方式使用面部锚点和相机变换来做到这一点,但这种 simd 四元数方法对我来说效果很好。希望这可以帮助!

    【讨论】:

    • 很好的答案!如果有的话,你能分享你的实现源代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2013-12-27
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多