如何从 ARKit 中的 simdTransform 中提取旋转值?

How do I extract rotation values from a simdTransform in ARKit?

我正在 ARKit 中为 ARSCNFaceGeometry 制作动画,使用从 iPhone 的 TrueDepth 相机捕获的值。

相机提供变换数据为simd_float4x4。这包含节点旋转、位置和比例。这是生成的示例:

simd_float4x4([
            [0.9482585, 0.0065377234, 0.31743154, 0.0],
            [-0.07080679, 0.9789629, 0.1913578, 0.0],
            [-0.3095027, -0.20393308, 0.9287729, 0.0],
            [0.13866597, 0.20701922, -0.57620335, 1.0]
])

我只对将旋转应用到我的 FaceGeometry 感兴趣,并且可以单独控制它的位置和比例。所以我需要从上面的矩阵中提取相关的旋转值。

我在 Apple 文档中找不到任何 'off the shelf' 方法来执行此操作,甚至也没有解释矩阵的哪些列或行与旋转有关。

我已经完成了以下操作,方法是创建一个 'dummy' 节点,对其应用 simdTransform,然后访问它的旋转 属性,这是有效的。但这感觉很老套,因为我在场景中创建对象只是为了执行编程操作。

let tempNode = SCNNode(geometry: nil)
tempNode.simdTransform = faceTransformArray[index]
ARFaceNode.rotation = tempNode.rotation
tempNode.removeFromParentNode()

谁能提供更清洁的解决方案?

P.S。我刚开始使用矩阵。

提前致谢。

3D 旋转表示为 quaternion,它由 3D 向量构成,描述了您围绕其旋转的轴,以及一个角度,描述了围绕该轴旋转的角度。

要从 4x4 simd 矩阵中获取四元数,您可以从矩阵中初始化 simd_quatf

let m = simd_float4x4([
    [0.9482585, 0.0065377234, 0.31743154, 0.0],
    [-0.07080679, 0.9789629, 0.1913578, 0.0],
    [-0.3095027, -0.20393308, 0.9287729, 0.0],
    [0.13866597, 0.20701922, -0.57620335, 1.0]
])
let q = simd_quatf(m)

SCNNoderotation属性表示为SCNVector4,其中x、y、z属性描述轴,w描述旋转。 simd_quatf 具有 axis (Float) 和 angle (SIMD3<Float>) 属性,因此要获取向量:

let sq = SCNVector4(q.axis.x, q.axis.y, q.axis.z, q.angle)

这里可以看到结果是一样的: