首页 > 解决方案 > 将 ARFaceAnchor 从左手坐标系翻转到右手坐标系

问题描述

通过打印进行一些测试后faceAnchor.transform.columns.3,挖掘 SO:ARFaceAnchor 有负 Z 位置?和 Apple 的文档:ARFaceAnchor,我意识到 z 轴实际上是翻转的,它不是文档中的右手坐标系。ARFaceAnchor 声明坐标:

在此处输入图像描述

x 正方向指向观察者的右侧(即面部自身的左侧),y 正方向指向上方(相对于面部本身,而不是世界),正 z 方向指向面部向外(朝向观众)


Sarasvati 给出了关于进行改造的建议:

    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
}

基于 Andy Fedoroff 的更新:

extension ViewController: ARSCNViewDelegate {
    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let faceAnchor = anchor as? ARFaceAnchor else { return }
        currentFaceAnchor = faceAnchor
        if node.childNodes.isEmpty, let contentNode = selectedContentController.renderer(renderer, nodeFor: faceAnchor) {
            node.addChildNode(contentNode)
        }
        selectedContentController.session = sceneView?.session
        selectedContentController.sceneView = sceneView
    }
    /// - Tag: ARFaceGeometryUpdate
    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
        guard anchor == currentFaceAnchor,
            let contentNode = selectedContentController.contentNode,
            contentNode.parent == node
            else { return }
        sceneView.session.currentFrame!.anchors.first!.transform
        print(currentFaceAnchor!.transform.columns.3)
        selectedContentController.session = sceneView?.session
        selectedContentController.sceneView = sceneView
        selectedContentController.renderer(renderer, didUpdate: contentNode, for: anchor)
    }
}

但是,我使用 True Depth 相机打印faceAnchor.transform.columns.3并获得了 z 负片。下面显示 x,y,z,w 轴:

在此处输入图像描述

有关如何校正 z 轴的任何建议?先感谢您

标签: swiftxcodeaugmented-realityscenekitarkit

解决方案


首先,让我们看看默认矩阵值是什么。


单位矩阵

这是一个Identity 4x4 matrix带有默认值的。

如果您需要有关4x4 matrices阅读这篇文章的元素的更多信息。

 // 0  1  2  3
 ┌              ┐
 |  1  0  0  0  |  x
 |  0  1  0  0  |  y
 |  0  0  1  0  |  z
 |  0  0  0  1  |
 └              ┘


位置镜像

要翻转实体的Z axisand X axis,以便将轴从人脸跟踪环境重新定向到世界跟踪环境,请使用以下形式的4x4 transform matrix.

 // 0  1  2  3
 ┌              ┐
 | -1  0  0  0  |  x
 |  0  1  0  0  |  y
 |  0  0 -1  0  |  z
 |  0  0  0  1  |
 └              ┘


旋转镜像

4x4 transform matrices轮流是combination of scale and skew一个。要选择右旋转的方向,顺时针 (CW) 或逆时针 (CCW) 使用+-表达式cos

这是一个正 Z 旋转表达式 (CCW)。

在此处输入图像描述

正面+cos(a)

 ┌                    ┐
 | cos -sin   0    0  |
 | sin  cos   0    0  |
 |  0    0    1    0  |
 |  0    0    0    1  |
 └                    ┘


这是一个负 Z 旋转表达式 (CW)。

在此处输入图像描述

负面-cos(a)

 ┌                    ┐
 |-cos -sin   0    0  |
 | sin -cos   0    0  |
 |  0    0    1    0  |
 |  0    0    0    1  |
 └                    ┘

推荐阅读