我做了它一段時間了,因爲我看不到答案,我決定其計算把這裏我的解決方案爲那些誰就會尋找答案同樣的問題...
_motionManager = [[CMMotionManager alloc]init];
if (_motionManager.gyroAvailable) {
_motionManager.deviceMotionUpdateInterval = 1.0/20.0;
[_motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler:^(CMDeviceMotion *motion, NSError *error)
{
CMAcceleration gravity = motion.gravity;
CGPoint tiltVector = CGPointMake(-gravity.x, -gravity.y);
_tiltAngle = [self angleYAxisToVector:tiltVector];
CLLocationDirection heaqding = [[SVSession sharedSession] heading].trueHeading;
double newHeading = fmod(heaqding + _tiltAngle, 360.0);
self.azimuth = degreesToRadian(newHeading);
[self updateLocations]; //this function updates my ui for the new heading
}];
} else {
NSLog(@"No gyroscope on device.");
[_motionManager release],_motionManager = nil;
}
這裏有一些額外的片段,可能有助於理解這個例子:
-(double)angleYAxisToVector:(CGPoint)vector{
double dX = vector.x;
double dY = vector.y;
if(dY == 0){
if(dX > 0){
return 0.0;
}else{
if(dX < 0){
return 180.0;
}else{
return -1;
}
}
}
double beta = radiansToDegrees(atan(dX/dY));
double angle;
if(dX > 0){
if (dY < 0){
angle = 180 + beta;
}else{
angle = beta;
}
}else{
if (dY < 0){
angle = 180 + beta;
}else{
angle = 360 + beta;
}
}
// NSLog(@"angle = %f, normalized = %f",beta,angle);
return angle;
}
#define degreesToRadian(x) (M_PI * (x)/180.0)
#define radiansToDegrees(x) ((x) * 180.0/M_PI)
#define degreesToRadians(x) degreesToRadian(x)
#define radiansToDegree(x) radiansToDegrees(x)
編碼愉快。 ..
什麼是代碼中的SVSession?我找不到它 – 2013-01-30 11:14:33
哦...你不會找到它。這是我的一些課程。我曾經在那裏存儲過最後的標題。 – Ariel 2013-01-30 12:08:55
這非常有用。對於那些發現這種情況的人來說,它可能不會完全清楚這些代碼會做什麼,但是如果您希望找出設備面對的方式,而不考慮橫向或縱向方向,則可以這樣做。 – ratana 2015-05-05 00:37:44