0

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

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

谢谢你的帮助

4

3 回答 3

3
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));
于 2014-11-04T22:29:27.287 回答
0

可能是这样的:

roll = -atan(x / z);

尽管您需要根据您所处的方向更改符号,并在 z=0 的渐近线周围小心。

我相信 Core Motion 实际上除了加速度计读数外还使用陀螺仪测量来更准确地计算姿态(也许还可以处理万向节锁定)。

于 2011-12-10T19:48:47.110 回答
0
pitch = atan2(motion.gravity.z, motion.gravity.y)
roll = atan2(motion.gravity.z, motion.gravity.x)

这样,pitch 的值将在 0 +pi 和 0 -pi 之间,就像滚动一样

于 2011-12-11T14:58:01.190 回答