2012-10-21 56 views
2

我試圖繪製始終面臨着「向上」屏幕上的二維圖像。如果用戶正在旋轉他們的手機,我想確保我的2D對象不隨設備旋轉;它應該始終「豎立」。我想補償用戶向左或向右傾斜,但不能向左或向右傾斜。iPhone方向 - 如何找出哪個方向是向上?

我正在使用CoreMotion從設備獲取Pitch,Roll和Yaw,但我不明白如何將點轉換爲方向,特別是在用戶旋轉設備時。理想情況下,我可以把這些3個號碼爲一個值,將永遠告訴我,哪個方向是向上,而不必重新學習所有三角的。

我已經看過3D茶壺的例子,但它沒有幫助,因爲這個例子是2D的,我不需要傾斜向/傾斜。另外,我不想使用指南針/磁力計,因爲這需要在iPod Touch上運行。

回答

2

看圖像,以便更好地理解我在說什麼:

enter image description here

所以,你只關心在XY平面上。加速度計總是測量相對於自由落體的裝置的加速度。因此,當您將設備保持在圖像上時,加速度值爲(0,-1,0)。當您將設備順時針傾斜45度時,該值爲(0.707,-0.707,0)。您可以通過計算當前加速度值和某個參考軸的點積得出角度。如果我們使用向上的向量軸是(0,1,0)。因此,點積

0*0.707 - 1*0.707 + 0*0 = -0.707 

這正是ACOS(-0.707)= 45度。所以,如果你想你的形象仍然停留,你需要它在反面旋轉,即在XY平面-45度。如果你想忽略Z值,那麼你只需要X和Y軸:(X_ACCEL,Y_ACCEL,0)。你需要重新規範化這個向量(它必須給出1的大小)。然後按照我的解釋計算一個角度。

1

蘋果提供一個觀察者這一點。這是一個例子。

File.h

#import <UIKit/UIKit.h> 

@interface RotationAppDelegate : UIResponder <UIApplicationDelegate> 

@property (strong, nonatomic) UIWindow *window; 

-(void)orientationChanged; 
@end 

File.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 

    //Get the device object 
    UIDevice *device = [UIDevice currentDevice]; 

    //Tell it to start monitoring rthe accelermeter for orientation 
    [device beginGeneratingDeviceOrientationNotifications]; 

    //Get the notification center for the app 
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 

    //Add yourself an observer 
    [nc addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:device]; 

    HeavyViewController *hvc = [[HeavyViewController alloc] init]; 
    [[self window] setRootViewController:hvc]; 

    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 




- (void)orientationChanged:(NSNotification *)note 
{ 
    NSLog(@"OrientationChanged: %d", [[note object] orientation]); 
    //You can use this method to change your shape. 
}