在我的应用中,我需要在屏幕上显示一条水平线,所以我决定转向CMMotionManager
。这是我的代码,它非常简单:
if ([_motionManager isDeviceMotionAvailable]) {
if ([_motionManager isDeviceMotionActive] == NO) {
[_motionManager setDeviceMotionUpdateInterval:0.1];
[_motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical toQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error){
CMQuaternion quat = _motionManager.deviceMotion.attitude.quaternion;
double yaw = asin(2*(quat.x*quat.z - quat.w*quat.y));
// drawing line stuff.
}];
}
} else {
NSLog(@"Motion not avaliable!");;
}
当我将手机置于向上纵向模式时,Eveything工作正常。但由于asin
方法只给我一个(-pi / 2,+ pi / 2)范围内的数字,如果我将手机保持在横向模式或上升状态,我就无法画出完美的水平线 - 在纵向模式下,线刚刚以-pi / 2或pi / 2的角度卡住,并且不会继续旋转。
那么,我该如何解决这个问题,还有更通用的方法来处理四元数吗?提前谢谢!