ARKit – 变换矩阵的欧拉角 4x4
ARKit – eulerAngles of Transform Matrix 4x4
在我的项目中,我有一个转换,我想在 eulersAngles
中获得该转换的方向。
如何从 Swift 语言的 4
x4
矩阵的变换中得到 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 }
组件顺序如下:
- Pitch(
X
分量)是围绕节点的X
轴 的旋转
- Yaw(
Y
分量)是围绕节点的Y
轴的旋转
- Roll(
Z
分量)是绕节点的Z
轴旋转
使用eulerAngles
实例属性比使用旋转4
x4
矩阵要简单得多。 ARKit 和 SceneKit 框架使用 4
x4
变换矩阵 来平移、旋转、缩放和剪切 3D 对象。让我们看看它们是如何工作的:
恒等式4
x4
矩阵内部有16个元素:
在这 16 个元素之间有 6 个不同的剪切系数:
shear XY
shear XZ
shear YX
shear YZ
shear ZX
shear ZY
在剪切矩阵中它们如下:
因为在这个 Matrix 中根本没有 Rotation coefficients
,六个 Shear coefficients
和三个 Scale coefficients
允许你旋转 3D 对象X
、Y
和 Z
轴使用神奇的三角函数(sin
和 cos
)。
下面是如何使用剪切和缩放元素绕其 Z
轴旋转 3D 对象 (CCW) 的示例:
使用 Shear 和 Scale 元素查看 3 种不同的旋转模式(俯仰、偏航和滚动):
翻译4
x4
矩阵看起来像这样:
希望对您有所帮助。
已接受的答案对我不起作用。最终,我设法找到了解决方案,这是一个简单的计算扩展:
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 来测试它。
在我的项目中,我有一个转换,我想在 eulersAngles
中获得该转换的方向。
如何从 Swift 语言的 4
x4
矩阵的变换中得到 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 aspitch
,yaw
, androll
angles in radians.
var eulerAngles: SCNVector3 { get set }
组件顺序如下:
- Pitch(
X
分量)是围绕节点的X
轴 的旋转
- Yaw(
Y
分量)是围绕节点的Y
轴的旋转 - Roll(
Z
分量)是绕节点的Z
轴旋转
使用eulerAngles
实例属性比使用旋转4
x4
矩阵要简单得多。 ARKit 和 SceneKit 框架使用 4
x4
变换矩阵 来平移、旋转、缩放和剪切 3D 对象。让我们看看它们是如何工作的:
恒等式4
x4
矩阵内部有16个元素:
在这 16 个元素之间有 6 个不同的剪切系数:
shear XY
shear XZ
shear YX
shear YZ
shear ZX
shear ZY
在剪切矩阵中它们如下:
因为在这个 Matrix 中根本没有 Rotation coefficients
,六个 Shear coefficients
和三个 Scale coefficients
允许你旋转 3D 对象X
、Y
和 Z
轴使用神奇的三角函数(sin
和 cos
)。
下面是如何使用剪切和缩放元素绕其 Z
轴旋转 3D 对象 (CCW) 的示例:
使用 Shear 和 Scale 元素查看 3 种不同的旋转模式(俯仰、偏航和滚动):
翻译4
x4
矩阵看起来像这样:
希望对您有所帮助。
已接受的答案对我不起作用。最终,我设法找到了解决方案,这是一个简单的计算扩展:
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 来测试它。