我一直在开发一款使用左右倾斜动作手势的应用。我让它通过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
答案 0 :(得分:0)
我的滚动代码完美无缺
您的“滚动代码”无法正常运行。你不应该有任何“滚动代码”。在你可以获得万向节锁的情况下,根本不要使用欧拉角。你无法“缩小”到欧拉角,例如roll
。相反,在该世界中使用四元数或(更简单)rotationMatrix
和保留。通过从四元数开始,将转换为欧拉角,无法“计算”您解决问题的方法。而这正是你想要做的。如果你认为这是可能的,你可能还不知道万向节锁是什么(或者atan
如何运作)。