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

Posted

技术标签:

【中文标题】ARKit 中的 FaceTracking – 如何在屏幕上显示“lookAtPoint”【英文标题】:FaceTracking in ARKit – How to display the "lookAtPoint" on the screen 【发布时间】:2019-07-30 16:50:45 【问题描述】:

ARKit 的ARFaceTrackingConfigurationARFaceAnchor 与有关面部位置和方向的信息放在场景中。其中,这个锚点有我感兴趣的lookAtPoint 属性。我知道这个向量是相对于人脸的。如何在屏幕上为该位置绘制一个点,这意味着如何转换该点的坐标?

【问题讨论】:

使用leftEyeTransformrightEyeTransform 代替lookAtPoint 的方法也很受欢迎。 【参考方案1】:

.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() 的轴方向的图像:

回答您的问题

我可以说你不能直接管理这个点的坐标,因为它是 gettable-only 属性(并且只有 XYZ 方向,而不是 XYZ 平移)。

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

有两种投影方式

第一。在SceneKit/ARKit 中,您需要采用以下实例method 将点投影到2D 视图上(对于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)

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

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

func unprojectPoint(_ point: SCNVector3) -> SCNVector3

...和 ​​ARKit 的对立面 method(用于取消投影点):

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

【讨论】:

以上是关于ARKit 中的 FaceTracking – 如何在屏幕上显示“lookAtPoint”的主要内容,如果未能解决你的问题,请参考以下文章

iOS增强现实(ARKit)简单介绍

如何为 ARKit 将 dae 导入 SceneKit

ios - ARKit 3D模型素材

ARKit 是不是考虑 iPhone 和 iPad 中的镜头失真?

ARKit 中的 ChromaKey 视频

ARKit中的变换中的不同列代表什么?