从CMRotationMatrix得到俯仰,偏航,滚动

Jon*_*lli 8 opengl-es ios core-motion

我有一个CMRotationMatrix*rot,我想得到矩阵中的俯仰,偏航,滚动.任何想法我怎么能这样做?

谢谢

iSe*_*ker 26

使用四元数比使用欧拉角更好....滚动,俯仰和偏航值可以使用以下公式从四元数导出:

roll  = atan2(2*y*w - 2*x*z, 1 - 2*y*y - 2*z*z)
pitch = atan2(2*x*w - 2*y*z, 1 - 2*x*x - 2*z*z)
yaw   =  asin(2*x*y + 2*z*w)
Run Code Online (Sandbox Code Playgroud)

它可以实现为:

CMQuaternion quat = self.motionManager.deviceMotion.attitude.quaternion;
myRoll = radiansToDegrees(atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z)) ;
myPitch = radiansToDegrees(atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 - 2*quat.x*quat.x - 2*quat.z*quat.z));
myYaw = radiansToDegrees(asin(2*quat.x*quat.y + 2*quat.w*quat.z));
Run Code Online (Sandbox Code Playgroud)

其中radianstoDegrees是一个预处理器指令,实现如下:

#define radiansToDegrees(x) (180/M_PI)*x
Run Code Online (Sandbox Code Playgroud)

这样做是为了将公式给出的弧度值转换为度.

有关转换的更多信息可以在这里找到: tinkerforge和这里:四元数和欧拉角之间的转换.

  • 我很好奇,"使用Quaternion比使用Euler Angles更好"背后的原因是什么? (2认同)
  • 谢谢。它运作良好。motionManager.deviceMotion.attitude.pitch/roll/yaw 真的很不稳定。我想知道为什么 Apple 不修复它们。 (2认同)
  • 这是因为欧拉角会落入[万向节锁](https://en.wikipedia.org/wiki/Gimbal_lock),你失去了一个你无法成功恢复的自由度。有一些解决方法(例如检测接近万向节锁定状态),但更好、更有效的解决方案是使用其他表示(四元数或旋转矩阵)。仍然欧拉角易于使用(和理解)并且适用于许多用例。 (2认同)
  • 我同意这里的其他评论;Apple 的横滚/俯仰/偏航值似乎不稳定/容易受到万向节锁定状况的影响。具体来说,当我大幅改变设备的俯仰角时,即使我实际上没有“滚动”设备,滚动值也会变得不稳定。 (2认同)