Приложение дополненной реальности в ландшафтном режиме

Я пытаюсь создать приложение дополненной реальности, используя платформу CoreMotion. Я попытался выйти из проекта примера кода Apple pARk, но он работает только в портретном режиме. Мне нужно, чтобы он работал в ландшафте. При переключении в ландшафтный режим подвиды в оверлейном представлении перемещаются в противоположных направлениях и с неправильной скоростью (они перемещаются по экрану либо слишком быстро, либо слишком медленно)

Я прочитал другие публикации, которые предлагают два решения:

  • Создайте эталонное положение и примените его обратное положение к текущему положению, как это предлагается в примере с чайником CoreMotion.

  • Поверните кватернионное представление положения на 90 градусов.

Я не думаю, что первое сработает, потому что мое приложение дополненной реальности требует, чтобы оно было привязано к истинному северу.

Я также не понимаю математику, необходимую для выполнения второго.

Любые предложения о том, как решить эту сложную проблему, я приветствую.


person Kyle Redfearn    schedule 10.08.2012    source источник


Ответы (2)


Как далеко вы сейчас продвинулись в своем приложении дополненной реальности? Я думаю, что начать с изучения PARk от Apple — это жестоко. Вы должны иметь некоторое продвинутое математическое понимание. Но если да, то почему бы и нет!

вы можете взглянуть на этот репозиторий, это проект дополненной реальности, работающий над портретом и пейзажем режим. Вот как обрабатывается вращение:

- (void)deviceOrientationDidChange:(NSNotification *)notification {

prevHeading = HEADING_NOT_SET; 

[self currentDeviceOrientation];

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

// Later we may handle the Orientation of Faceup to show a Map.  For now let's ignore it.
if (orientation != UIDeviceOrientationUnknown && orientation != UIDeviceOrientationFaceUp && orientation != UIDeviceOrientationFaceDown) {

    CGAffineTransform transform = CGAffineTransformMakeRotation(degreesToRadian(0));
    CGRect bounds = [[UIScreen mainScreen] bounds];

    switch (orientation) {
        case UIDeviceOrientationLandscapeLeft:
            transform          = CGAffineTransformMakeRotation(degreesToRadian(90));
            bounds.size.width  = [[UIScreen mainScreen] bounds].size.height;
            bounds.size.height = [[UIScreen mainScreen] bounds].size.width;
            break;
        case UIDeviceOrientationLandscapeRight:
            transform          = CGAffineTransformMakeRotation(degreesToRadian(-90));
            bounds.size.width  = [[UIScreen mainScreen] bounds].size.height;
            bounds.size.height = [[UIScreen mainScreen] bounds].size.width;
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            transform = CGAffineTransformMakeRotation(degreesToRadian(180));
            break;
        default:
            break;
    }


    [displayView setTransform:CGAffineTransformIdentity];
    [displayView setTransform: transform];
    [displayView setBounds:bounds];  

    degreeRange = [self displayView].bounds.size.width / ADJUST_BY;

}
}

Вы должны повернуть все свои аннотации, а затем наложенный вид после поворота устройства!

person Tíbó    schedule 28.10.2012