【问题标题】:Why does ARFaceAnchor have negative Z position?为什么 ARFaceAnchor 的 Z 位置为负?
【发布时间】:2021-02-03 05:48:00
【问题描述】:

我正在使用 ARKit 的 ARFaceTrackingConfigurationARConfiguration.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

【问题讨论】:

    标签: ios augmented-reality arkit realitykit truedepth-camera


    【解决方案1】:

    似乎很明显

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

     sceneView.debugOptions = [.showWorldOrigin]
    

    所以你的脸的位置必须在世界坐标的positive part of Z axis

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

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

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

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

    因此,当您通过 TrueDepth 相机“观察”时,4x4 Matrix 会被镜像

    【讨论】:

    • 我尝试添加.showWorldOrigin,但无法在实时视图中看到原点,示例代码here。基于Apple's documentation,原点应该在相机传感器内部,这可以解释它。但是还有一个问题:从您发布的图表中,似乎当我将头向右移动时,X会减小,但实际上X值会增加。换句话说:ARFaceAnchor 的坐标系似乎是左撇子,但您的图表是右撇子。
    • 请尝试打印ARFaceAnchortransform.column.3 向量并尝试移动头部,看看X、Y 和Z 坐标如何增加。
    • 嗨@sarasvati!我正在使用 ARFaceAnchor,我认为我面临同样的问题。你能解释一下在哪里调用 func faceAnchorPoseToRHS!谢谢!
    【解决方案2】:

    虽然我仍然不知道为什么面部锚的行为不像文档中描述的那样,但我至少可以回答如何将其左手系统纠正为 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多