横向CMDeviceMotion

时间:2016-08-03 14:47:32

标签: ios core-motion

我一直在开发一款使用左右倾斜动作手势的应用。我让它通过CMQuaternion值使用CMDeviceMotion数据来通过Using quaternion instead of roll, pitch and yaw to track device motion进行“滚动”但我有一个奇怪的行为,其中输出有时会完美地工作而其他的不是。

该应用程序被锁定为横向(两种方式),但我注意到如果我启动纵向方向的应用程序,我的滚动代码与pi / 2修改器完美配合。如果我打开应用程序并将设备保持在横向状态,它将在没有修改器的音高上工作。

问题是我无法知道使用哪个!有没有办法检测或重新设置参照系?

更新:

我说谎,如果我从横向开始,它似乎只是选择一个随机轴:(我认为这又是一个万向节锁定的东西,但原始问题仍然适用 - 我如何得到这一点,当我以横向方向启动设备?

更新2:

某些令牌代码(来自NSNotification)适用于那些无法阅读并感觉需要在没有下载的情况下进行下载的人。

CMDeviceMotion *data = [[note userInfo] valueForKey:@"data"];
CMQuaternion quat = data.attitude.quaternion;
CGFloat roll  = atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z);

CGFloat pitch = atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 - 2*quat.x*quat.x - 2*quat.z*quat.z);
CGFloat yaw   = 2*(quat.x*quat.y + quat.w*quat.z);


NSLog(@" - - ");
NSLog(@"raw roll: %f",roll);
NSLog(@"raw pitch: %f",pitch);
NSLog(@"raw yaw: %f",yaw);

NSLog(@"q.x: %f",quat.x);
NSLog(@"q.y: %f",quat.y);
NSLog(@"q.z: %f",quat.z);
NSLog(@"q.w: %f",quat.w);

从AppDelegate中的startDeviceMotionUpdatesToQueue发起。

这是无关紧要的,因为问题是当设备在启动时处于纵向方向但没有横向方向时,四元数据是稳定的。我选择使用设备数据是一个完全独立的问题。

这是一个类似的问题,没有令人满意的答案(或问题中的任何代码:|)CMDeviceMotion yaw values unstable when iPhone is vertical

1 个答案:

答案 0 :(得分:0)

  

我的滚动代码完美无缺

您的“滚动代码”无法正常运行。你不应该有任何“滚动代码”。在你可以获得万向节锁的情况下,根本不要使用欧拉角。你无法“缩小”到欧拉角,例如roll。相反,在该世界中使用四元数或(更简单)rotationMatrix保留。通过从四元数开始,转换为欧拉角,无法“计算”您解决问题的方法。而这正是你想要做的。如果你认为这是可能的,你可能还不知道万向节锁是什么(或者atan如何运作)。