ARKit – 变换矩阵的欧拉角 4x4

ARKit – eulerAngles of Transform Matrix 4x4

在我的项目中,我有一个转换,我想在 eulersAngles 中获得该转换的方向。

如何从 Swift 语言的 4x4 矩阵的变换中得到 eulerAngles

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

设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

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

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

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

eulerAngles instance property is used for node’s orientation, expressed as pitch, yaw, and roll angles in radians.

var eulerAngles: SCNVector3 { get set }

组件顺序如下:

  • PitchX分量)是围绕节点的X
  • 的旋转
  • YawY分量)是围绕节点的Y轴的旋转
  • RollZ分量)是绕节点的Z轴旋转

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

恒等式4x4矩阵内部有16个元素:

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

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

在剪切矩阵中它们如下:

因为在这个 Matrix 中根本没有 Rotation coefficients,六个 Shear coefficients 和三个 Scale coefficients 允许你旋转 3D 对象XYZ 轴使用神奇的三角函数(sincos)。

下面是如何使用剪切和缩放元素绕其 Z 轴旋转 3D 对象 (CCW) 的示例:

使用 Shear 和 Scale 元素查看 3 种不同的旋转模式(俯仰、偏航和滚动):

翻译4x4矩阵看起来像这样:

希望对您有所帮助。

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

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 来测试它。