CMAttitude滚动和俯仰计算

时间:2011-12-10 15:27:00

标签: iphone core-motion pitch

问题本身很简单。当使用CMDeviceMotion运动时,它包含一个名为为CMAttitude类型的姿态的对象,其中包含滚动和俯仰。滚动和俯仰描述物体围绕Y轴和X轴的旋转。当iPhone位于桌面上时,显示屏朝上,滚动和间距均为0.当围绕Y或X轴旋转iPhone时,这些值会更新。

我想知道如何计算这些值。有一种方法可以根据设备的当前重力矢量计算滚动和俯仰。音高似乎是: pitch = -asin(motion.gravity.y)但是我无法弄清楚如何计算音量。

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

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)); // PITCH !!!
myYaw = radiansToDegrees(asin(2*quat.x*quat.y + 2*quat.w*quat.z));

答案 1 :(得分:0)

可能类似于:

roll = -atan(x / z);

虽然您需要根据您所处的方向改变符号,并且在z = 0的渐近线周围要小心。

我认为Core Motion实际上除了加速度计读数之外还使用陀螺仪测量来更准确地计算姿态(也可能用于处理gimbal lock)。

答案 2 :(得分:0)

pitch = atan2(motion.gravity.z, motion.gravity.y)
roll = atan2(motion.gravity.z, motion.gravity.x)

以这种方式,它的音高值将介于0 + pi和0-pi之间,如滚动