我正在使用从iPhone的TrueDepth摄像头捕获的值,在ARKit中为一个ARSCNFaceGeometry设置动画。
摄影机以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文档中找不到任何现成的方法来做这件事,它甚至没有解释矩阵的哪些列或行与旋转有关。
我已经完成了以下工作,通过创建一个“虚拟”节点,将simdTransform应用到它,然后访问它的旋转属性,这是有效的。但这感觉很麻烦,因为我在场景中创建对象只是为了执行编程操作。
let tempNode = SCNNode(geometry: nil)
tempNode.simdTransform = faceTransformArray[index]
ARFaceNode.rotation = tempNode.rotation
tempNode.removeFromParentNode()
有人能提供一个更干净的解决方案吗?
附言:我是个矩阵新手。
提前谢谢你。
发布于 2020-12-04 12:37:42
3D旋转表示为quaternion,它由描述绕其旋转的轴的3D向量和描述围绕该轴旋转的角度组成。
要从4x4SIMD矩阵中获取四元数,可以从矩阵中初始化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)
您可以在这里看到结果是相同的:
https://stackoverflow.com/questions/65126349
复制相似问题