如何从 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)
SCNNode
的rotation
属性表示为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)
这里可以看到结果是一样的:
我正在 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)
SCNNode
的rotation
属性表示为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)
这里可以看到结果是一样的: