2011-01-21 4 views
1

Казалось бы, это должно быть что-то легкое, но мне просто не повезло.Использование Core Motion для определения высоты и азимута телефона

Что я хочу, чтобы иметь возможность делать, это использовать движок ядра, чтобы отслеживать, где находится камера телефона (для своего рода приложения с дополненной реальностью). Пользователь будет указывать телефон на контрольную точку (как бы снимая ее) и нажать кнопку, чтобы «выровнять» позицию телефона с объектом. Теперь, когда пользователь указывает камеру телефона на другие объекты, мне нужно определить высоту изменения телефона (от -90º до + 90º) и азимута (от 0º до 360º).

Углы Эйлера, данные CMAttitude, по-видимому, не являются тем, что мне нужно. Я попытался кэшировать CMAttitude, полученный, когда пользователь нажимает «align». Затем, когда пользователь перемещает телефон вокруг, я получаю новый CMAttitude и использовать multiplyByInverseOfAttitude для определения отличия от эталонного отношения.

- (void)checkForMotion { 
    CMMotionManager *motionMgr = appDelegate.motionMgr; 
    CMDeviceMotion *deviceMotion = motionMgr.deviceMotion; 
    CMAttitude *attitude = deviceMotion.attitude; 

    if (referenceAttitude != nil) 
    { 
     [attitude multiplyByInverseOfAttitude: referenceAttitude]; 

     double deltaAlt = attitude.pitch; 
     double deltaAzm = attitude.roll; 

     // Do something with deltaAlt and deltaAz 
    } 
    else 
    { 
     NSLog(@"Getting new referenceAttitude"); 
     self.referenceAttitude = attitude; 
    } 
} 

Но это просто не дает правильных результатов. Если телефон удерживается вертикально (длинная ось вверх), то deltaAlt отлично работает. Пока телефон заострен на горизонте (alt = 0), то и deltaAzm является правильным. Однако, если телефон, если он указал (скажем) на 45º в небо, тогда, когда я перемещаю телефон по азимуту, компонент высоты изменяется также. Эти два переплетены так, как я не могу понять.

Есть ли какая-то простая математика, которая мне нужна, чтобы дразнить их отдельно? Опять же, я бы подумал, что это будет необходимой потребностью в приложении с дополненной реальностью, но я не смог найти примеров, которые это делают.

+0

Вы уже обнаружили какие-либо решения проблемы? –

ответ

1

В общем, ваш подход звучит разумно для меня. Я думаю, что это то же самое, что и в демонстрационном приложении Teapot. Может быть, самый простой способ, чтобы проверить его и посмотреть на него:

CMMotionManager and the Gyroscope on iPhone 4

Если вы планируете обрабатывать более сложные движения в будущем, я рекомендую трудный путь т.е. кватернионов. Да, не так просто, но если вы когда-то это получили, это очень удобно.