在我的项目中,我有一个变换,我希望在eulersAngles
中获得该变换的方向。
如何从Swift语言的eulerAngles
x 4
矩阵变换中获取4
?
我至少需要Pitch
,我可能需要Yaw
,我可能需要Roll
。
答案 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
实例属性用于表示节点的方向,以弧度表示为pitch
,yaw
和roll
角。
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个元素:
在这16个元素之间,有6个不同的剪切系数:
shear XY
shear XZ
shear YX
shear YZ
shear ZX
shear ZY
在Shear Matrix中,它们如下:
因为该矩阵中根本没有Rotation coefficients
,所以六个Shear coefficients
和三个Scale coefficients
可以使X
旋转3D对象,Y
和Z
轴使用魔术三角法(sin
和cos
)。
以下是使用Shear和Scale元素如何围绕其Z
轴旋转3D对象(CCW)的示例:
使用“剪切”和“缩放”元素查看3种不同的旋转模式(俯仰,偏航和横滚):
翻译4
x 4
矩阵如下:
希望这会有所帮助。
答案 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对它进行了测试。