ARKit - 转换矩阵4x4的eulerAngles

时间:2018-05-08 14:37:32

标签: swift matrix augmented-reality arkit sceneform

在我的项目中,我有一个变换,我希望在eulersAngles中获得该变换的方向。

如何从Swift语言的eulerAngles x 4矩阵变换中获取4

我至少需要Pitch,我可能需要Yaw,我可能需要Roll

4 个答案:

答案 0 :(得分:0)

假设mij是第i行和第j列中的矩阵元素。

R=atan2(m12, m22)
c2 = sqrt(m00^2 + m01^2)
P = atan2(-m02, c2)
s1 = sin(R), c1 = cos(R)
Y = atan2(s1*m20 - c1*m10, c1*m11-s1*m21)

来源: 本文档中很好地描述了数学:https://pdfs.semanticscholar.org/6681/37fa4b875d890f446e689eea1e334bcf6bf6.pdf

与四元数相反,有一些极端情况(万向节锁定)你必须担心上述解决方案处理得很好。

答案 1 :(得分:0)

pj_mukh在他的回答中没有说如何将我必须开始的转换矩阵转换为旋转矩阵,而mallett回答了这个问题here

获得旋转矩阵后,您可以按照pj_mukh所述计算旋转角度

答案 2 :(得分:0)

  

eulerAngles实例属性用于表示节点的方向,以弧度表示为pitchyawroll角。

var eulerAngles: SCNVector3 { get set }

组件的顺序如下:

  • 螺距X分量)是围绕节点X轴的旋转
  • 偏航Y分量)是绕节点Y轴的旋转
  • 滚动Z组件)是围绕节点的Z轴的旋转

使用eulerAngles实例属性比使用旋转4 x 4矩阵要简单得多。 ARKit和SceneKit框架使用 4 x 4转换矩阵来平移,旋转,缩放和剪切3D对象。让我们看看它们是如何工作的:

身份4 x 4矩阵内部包含16个元素:

enter image description here

在这16个元素之间,有6个不同的剪切系数:

shear XY
shear XZ
shear YX
shear YZ
shear ZX
shear ZY

在Shear Matrix中,它们如下:

enter image description here

因为该矩阵中根本没有Rotation coefficients ,所以六个Shear coefficients和三个Scale coefficients可以使X旋转3D对象,YZ轴使用魔术三角法(sincos)。

以下是使用Shear和Scale元素如何围绕其Z轴旋转3D对象(CCW)的示例:

enter image description here

使用“剪切”和“缩放”元素查看3种不同的旋转模式(俯仰,偏航和横滚):

enter image description here

翻译4 x 4矩阵如下:

enter image description here

希望这会有所帮助。

答案 3 :(得分:0)

接受的答案对我不起作用。最终,我设法找到了解决方案,这是计算的简单扩展:

extension simd_float4x4 {
    var eulerAngles: simd_float3 {
        simd_float3(
            x: asin(-self[2][1]),
            y: atan2(self[2][0], self[2][2]),
            z: atan2(self[0][1], self[1][1])
        )
    }
}

我已经通过比较Apple提供的默认ARFrame.camera.eulerAngles和使用扩展名计算出的ARFrmae.camera.transform.eulerAngles对它进行了测试。