swift - ARKit 中的 FaceTracking – 如何在屏幕上显示“lookAtPoint”
问题描述
ARFaceTrackingConfiguration
ARKit将ARFaceAnchor
面部的位置和方向信息放置到场景中。其中,这个锚点具有lookAtPoint
我感兴趣的属性。我知道这个向量是相对于人脸的。如何在屏幕上为该位置绘制一个点,这意味着如何转换该点的坐标?
解决方案
.lookAtPoint
instance 属性仅用于方向的估计。
苹果文档说:
.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
中,您需要采用以下实例方法将点投影到 2D 视图上(sceneView
例如):
func projectPoint(_ point: SCNVector3) -> SCNVector3
或者:
let sceneView = ARSCNView()
sceneView.projectPoint(myPoint)
第二。在ARKit
您需要采用以下实例方法将点投影到 2D 视图上(arCamera
例如):
func projectPoint(_ point: simd_float3,
orientation: UIInterfaceOrientation,
viewportSize: CGSize) -> CGPoint
或者:
let camera = ARCamera()
camera.projectPoint(myPoint, orientation: myOrientation, viewportSize: vpSize)
此方法可帮助您将点从场景的 3D 世界坐标系投影到渲染器的 2D 像素坐标系。
还有相反的方法(用于取消投影点):
func unprojectPoint(_ point: SCNVector3) -> SCNVector3
...和 ARKit 的相反方法(用于不投影一个点):
@nonobjc func unprojectPoint(_ point: CGPoint,
ontoPlane planeTransform: simd_float4x4,
orientation: UIInterfaceOrientation,
viewportSize: CGSize) -> simd_float3?
推荐阅读
- python - GPT2 on Hugging face(pytorch transformers) RuntimeError: grad can be implicitly created only for scalar outputs
- python-3.x - 启动 Python3 命令时出现问题。模块 'lib' 没有属性 'core' [已解决]
- java - 使用 SSL 为 JerseyTest 配置 JettyTestContainer
- dll - Blazor - 客户端无法使用 dll 中定义的模型
- python - 从 Sanic 函数调用抛出“asyncio.run() 不能从正在运行的事件循环中调用”
- sed - sed 忽略了一些匹配项
- asynchronous - Axios Get 请求的问题 - 可能是异步问题
- javascript - 如何在javascript中更改键名数组对象?
- asp.net-core - 在重定向到其他 URL 并且没有身份验证的情况下在 cookie 上存储声明
- java - 有没有办法让 JSP 包含操作参数可选