这是关于问题的简要背景和介绍:
我的基于运动和位置的iOS应用程序中有一些功能需要旋转矩阵作为输入。一些图形输出依赖于此矩阵。随着设备的每次移动,图形输出都会发生变化。以下是实现此功能的代码的一部分:
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
toQueue:motionQueue
withHandler:
^(CMDeviceMotion* motion, NSError* error){
//get and process matrix data
}
在这个结构中,只有4个框架可用:
XArbitraryZVertical
XArbitraryCorrectedZVertical
XMagneticNorthZVertical
XTrueNorthZVertical
我需要另一个参考值,例如陀螺仪值,而这些框架不能完全满足我的需求。
为了达到我的目标,我使用下面的结构:
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical
toQueue:motionQueue
withHandler:
^(CMDeviceMotion* motion, NSError* error){
//get Euler angles and transform it to rotation matrix
}
你可能会问我,为什么不使用内置的旋转矩阵?答案很简单。我需要创建一种自己的参考框架,并且可以通过在角度的修改值中实现这一点。
问题:
为了从欧拉角得到旋转矩阵,我们需要为每个角度制作矩阵,然后将它们相乘。对于3D情况,我们将为每个轴(其中3个)制作矩阵。之后我们相乘矩阵。问题是输出取决于乘法的顺序。XYZ不等于ZYX。Wikipedia告诉我,有12种变体,我不知道哪一个是iOS实现的正确顺序。我需要知道需要按哪个顺序相乘。此外,我需要知道哪些角度代表X、Y、Z。例如,X-横滚,Y-俯仰,Z-偏航。
实际上,这个问题已经被苹果公司解决多年了,但我无法访问.m文件,也不知道iOS设备的正确乘法顺序。