3

我正在使用 ARKitARFaceTrackingConfiguration对齐ARConfiguration.WorldAlignment.camera,但我发现文档(似乎)并没有反映现实;

根据下面的文档摘录,我希望面部锚点transform以右手坐标系表示。但是,当我尝试移动头部时,我注意到面部锚点的 Z 坐标始终为负(即faceAnchor.transform.columns.3.z < 0)。请注意,在 X 和 Y 方向上移动头部对应于预期结果(与 Z 坐标不同)。

相机对齐根据设备相机的本机传感器方向定义坐标系。相对于一个AVCaptureVideoOrientation.landscapeRight方向的相机图像,x 轴指向右侧,y 轴指向上方,z 轴指向设备的前部(朝向用户)

我希望transform按照文档行事,即面部锚的 Z 坐标应该是正的,因为文档说“ z 轴指向设备的前面(朝向用户) ”。到目前为止,Z 轴似乎指向设备的背面……

我错过了一些明显的东西吗?

我尝试通过以下代码修复旋转,但我不确定它是否是解决此问题的正确方法:

// Repair rotation
let oldFaceRotation = simd_quatf(face.transform) // get quaternion from 
let repairedFaceRotation = simd_quatf(ix: oldFaceRotation.axis.y, iy: oldFaceRotation.axis.x, iz: -oldFaceRotation.axis.z, r: oldFaceRotation.real)

// Repair translation
var repairedPosition = face.transform.columns.3
repairedPosition.z *= -1

// Combine
var correctedFaceTransform = float4x4(repairedFaceRotation)
correctedFaceTransform.columns.3 = repairedPosition
4

2 回答 2

3

这似乎很明显

当 ARSession 运行并且 ARCamera 开始跟踪环境时,它会WorldOriginAxis 在您的面前放置在(x: 0, y: 0, z: 0). 只需使用以下命令检查它:

 sceneView.debugOptions = [.showWorldOrigin]

所以你的脸的位置必须在positive part of Z axisWorld Coordinates

在此处输入图像描述

因此,ARFaceAnchor也将放置在 Z 轴正方向。

在此处输入图像描述

当您使用ARFaceTrackingConfigurationvs时ARWorldTrackingConfiguration,需要考虑两件事:

  • 后置摄像头沿负 Z 轴(正 X 轴在右侧)朝向对象移动。

  • 前置摄像头沿正 Z 轴(正 X 轴在左侧)朝向面移动。

因此,当您通过TrueDepth Camera “查看”时, a4x4 Matrixmirrored

于 2019-08-23T20:03:58.850 回答
1

虽然我仍然不知道为什么面部锚的行为不像文档中描述的那样,但我至少可以回答如何将其左手系统纠正为对 Metal 和 SceneKit 友好的右手系统(X 轴到右,Y 轴向上,Z 轴从屏幕朝向用户):

func faceAnchorPoseToRHS(_ mat: float4x4) -> float4x4 {
    let correctedPos = float4(x: mat.columns.3.x, y: mat.columns.3.y, z: -mat.columns.3.z, w: 1)

    let quat = simd_quatf(mat)
    let newQuat = simd_quatf(angle: -quat.angle, axis: float3(quat.axis.x, quat.axis.y, -quat.axis.z))
    var newPose = float4x4(newQuat)
    newPose.columns.3 = correctedPos

    return newPose
}
于 2019-08-24T01:01:28.483 回答