Ориентация iPhone, как мне понять, какой путь вверх?

Я пытаюсь нарисовать 2D-изображение на экране, которое всегда обращено вверх. Если пользователь вращает свой телефон, я хочу убедиться, что мой 2D-объект не вращается вместе с устройством; он всегда должен «стоять вертикально». Я хочу компенсировать наклон пользователя влево или вправо, но не наклон в сторону или к себе.

Я использую CoreMotion для получения Pitch, Roll и Yaw от устройства, но я не понимаю, как перевести точки в направление вверх, особенно когда пользователь вращает устройство. В идеале я могу преобразовать эти 3 числа в одно значение, которое всегда будет говорить мне, какой путь вверх, без необходимости заново изучать всю тригонометрию.

Я просмотрел пример 3D-чайника, но это не помогает, потому что этот пример 2D, и мне не нужно наклоняться в сторону/наклоняться вперед. Кроме того, я не хочу использовать компас/магнитометр, потому что он должен работать на iPod Touch.


person Kabir Hemrajani    schedule 21.10.2012    source источник


Ответы (2)


Посмотрите на картинку, чтобы лучше понять, о чем я говорю:

введите здесь описание изображения

Итак, вас интересует только плоскость 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 градусов. Поэтому, если вы хотите, чтобы ваше изображение оставалось неподвижным, вам нужно повернуть его в обратную сторону, то есть на -45 градусов в плоскости XY. Если вы хотите игнорировать значение Z, вы берете только оси X и Y: (X_ACCEL, Y_ACCEL, 0). Вам нужно перенормировать этот вектор (он должен иметь величину 1). Затем рассчитайте угол, как я объяснил.

person Max    schedule 21.10.2012

Apple поставляет для этого наблюдателя. Вот пример.

Файл.h

#import <UIKit/UIKit.h>

@interface RotationAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

-(void)orientationChanged;
@end

Файл.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.
}
person Josiah    schedule 21.10.2012