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

pho*_*bus 4 augmented-reality eye-tracking ios arkit

ARFaceTrackingConfigurationARKit场所ARFaceAnchor有关的位置和面部的朝向到现场信息。除其他外,此锚具有lookAtPoint我感兴趣的属性。我知道此向量相对于面部。如何在屏幕上为此位置绘制一个点,这意味着如何转换该点的坐标?

ARG*_*Geo 5

.lookAtPoint 实例属性仅用于方向估计。

苹果文档说:.lookAtPoint是在脸部坐标空间中的一个位置,仅估计脸部方向的视线。它是三个标量值的向量,只是可获取的,而不是可设置的:

var lookAtPoint: SIMD3<Float> { get }
Run Code Online (Sandbox Code Playgroud)

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

var rightEyeTransform: simd_float4x4 { get }
var leftEyeTransform: simd_float4x4 { get }
Run Code Online (Sandbox Code Playgroud)

关于如何使用此实例属性,这是一个假想的情况:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是显示ARFaceTrackingConfiguration()的轴方向的图像:

在此处输入图片说明

回答您的问题

我可以说您不能直接管理该点的坐标,因为它是仅可获取的属性(并且只有XYZ方向,而不是XYZ平移)。

因此,如果同时需要平移和旋转,请改用.rightEyeTransform.lefttEyeTransform实例属性

有两种投影方法

首先。在SceneKit/中,ARKit您需要采用以下实例方法将点投影到2D视图上(sceneView例如):

func projectPoint(_ point: SCNVector3) -> SCNVector3
Run Code Online (Sandbox Code Playgroud)

要么:

let sceneView = ARSCNView()
sceneView.projectPoint(myPoint)
Run Code Online (Sandbox Code Playgroud)

第二。在其中,ARKit您需要采用以下实例方法将点投影到2D视图上(arCamera例如):

func projectPoint(_ point: simd_float3, 
              orientation: UIInterfaceOrientation, 
             viewportSize: CGSize) -> CGPoint
Run Code Online (Sandbox Code Playgroud)

要么:

let camera = ARCamera()
camera.projectPoint(myPoint, orientation: myOrientation, viewportSize: vpSize)
Run Code Online (Sandbox Code Playgroud)

此方法可帮助您将一个点从场景的3D世界坐标系投影到渲染器的2D像素坐标系。

还有相反的方法(用于取消投影点):

func unprojectPoint(_ point: SCNVector3) -> SCNVector3
Run Code Online (Sandbox Code Playgroud)

...和ARKit的相反方法(用于取消投影点):

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