swift ARKit中的FaceTracking-如何在屏幕上显示“lookAtPoint”

zd287kbt  于 2023-06-28  发布在  Swift
关注(0)|答案(1)|浏览(117)

ARKit的ARFaceTrackingConfigurationARFaceAnchor与人脸在场景中的位置和方向信息一起放置。除此之外,这个锚具有我感兴趣的lookAtPoint属性。我知道这个矢量是相对于脸的。我如何在屏幕上为这个位置画一个点,这意味着我如何转换这个点的坐标?

3zwtqj6y

3zwtqj6y1#

.lookAtPoint属性仅用于方向估计

Apple文档说:.lookAtPoint是面部坐标空间中仅估计面部方向的注视的位置。它是一个包含三个标量值的向量,它只是可获取的,而不是可设置的:

var lookAtPoint: SIMD3<Float> { get }

换句话说,这是两个量的乘积的结果向量-.rightEyeTransform.leftEyeTransform示例属性(也是可获取的):

var rightEyeTransform: simd_float4x4 { get }
var leftEyeTransform: simd_float4x4 { get }

下面是一个关于如何使用这个示例属性的想象情况:

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
        
    if let faceAnchor = anchor as? ARFaceAnchor,
       let faceGeometry = node.geometry as? ARSCNFaceGeometry {
            
        if (faceAnchor.lookAtPoint.x >= 0) {         // Looking (+X)
            faceGeometry.firstMaterial?.diffuse.contents = UIImage(named: "redTexture.png")
        } else {                                     // Looking (-X)
            faceGeometry.firstMaterial?.diffuse.contents = UIImage(named: "cyanTexture.png")
        }

        faceGeometry.update(from: faceAnchor.geometry)
        facialExrpession(anchor: faceAnchor)
            
        DispatchQueue.main.async {
            self.label.text = self.textBoard
        }
    }
}

下面是一个显示ARFaceTrackingConfiguration()轴方向的图像:

回答您的问题

我可以说,您不能直接管理这个点的坐标,因为它是只能获取的属性(只有XYZ方向,没有XYZ平移)。
因此,如果您需要平移和旋转,请使用.rightEyeTransform.lefttEyeTransform示例属性。

投影点

SceneKit/ARKit中有两种点投影方法。使用以下示例method将点投影到二维视图上(对于sceneView示例):

func projectPoint(_ point: SCNVector3) -> SCNVector3

或:

let sceneView = ARSCNView()
sceneView.projectPoint(myPoint)

此外,在ARKit中,您必须实现以下示例method,以将点投影到2D视图上(对于arCamera示例):

func projectPoint(_ point: simd_float3, 
              orientation: UIInterfaceOrientation, 
             viewportSize: CGSize) -> CGPoint

或:

let camera = ARCamera()
camera.projectPoint(myPoint, orientation: myOrientation, viewportSize: vpSize)

此方法可帮助您将点从场景的三维世界坐标系投影到渲染器的二维像素坐标系。

取消拒绝点

还有SceneKit的method用于取消投影点:

func unprojectPoint(_ point: SCNVector3) -> SCNVector3

欲了解更多详情,请阅读这篇文章。
...和ARKit的method用于取消投影点:

@nonobjc func unprojectPoint(_ point: CGPoint, 
            ontoPlane planeTransform: simd_float4x4, 
                         orientation: UIInterfaceOrientation, 
                        viewportSize: CGSize) -> simd_float3?

相关问题