我的基于运动和位置的 iOS 应用程序中有一些功能,它需要一个旋转矩阵作为输入。一些图形输出依赖于这个矩阵。随着设备的每一次移动,图形输出都会改变。这是代码的一部分,它使得:
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
toQueue:motionQueue
withHandler:
^(CMDeviceMotion* motion, NSError* error){
//get and process matrix data
}
Run Code Online (Sandbox Code Playgroud)
在此结构中,只有 4 个帧可用:
X任意Z垂直
XArbitraryCorrectedZVertical
XMagneticNorthZ垂直
XTrueNorthZ垂直
我需要另一个参考,fe 陀螺仪值而不是 North,而这些框架不能完全提供我想要的。
为了达到我的目标,我使用下一个结构:
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical
toQueue:motionQueue
withHandler:
^(CMDeviceMotion* motion, NSError* error){
//get Euler angles and transform it to rotation matrix
}
Run Code Online (Sandbox Code Playgroud)
你可能会问我,为什么我不使用内置的旋转矩阵?答案很简单。我需要制作某种自己的参考系,我可以通过放入修改后的角度值来实现。
为了从欧拉角获得旋转矩阵,我们需要为每个角度制作矩阵,然后将它们相乘。对于 3D 情况,我们将为每个轴(其中 3 个)设置矩阵。之后我们乘以矩阵。问题是输出取决于乘法的顺序。X Y Z 不等于 Z Y X。维基百科告诉我,有 12 种变体,我不知道哪一种适合 iOS 实现。我需要知道我需要按什么顺序将它们相乘。另外,我需要知道哪些角度代表X、Y、Z。例如,X-roll,Y-pitch,Z-yaw。
实际上,Apple 多年前就解决了这个问题,但我无法访问 .m 文件,而且我不知道哪种乘法顺序适合 iOS 设备。
transformation objective-c euler-angles ios rotational-matrices