2012-05-30 1 views
5

Я помню из WWDC, что был разговор с чайником в OpenGL ES, который вращался с движением устройства. Казалось, что чайник стоит в космосе.Как получить поворот вокруг оси Y относительно того, как пользователь держит устройство?

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

В этом разговоре они упомянули, что мы должны получить «систему отсчета», например. при запуске приложения, в котором рассказывается, как пользователь изначально держал устройство.

Например вот акселерометр:

accelerometer

Я хочу знать, вращение вокруг оси Y, а относительно того, как пользователь держит устройство. Итак, когда пользователь держит его вертикально и вращается вокруг Y, мне нужно знать это значение вращения.

Я думаю, что ключ удаляет гравитацию из показаний? Также я нацелен на iPhone 4/4S с гироскопами, но я думаю, что CoreMotion будет автоматически сжимать их.

Как я могу выяснить, насколько пользователь повернул устройство вокруг оси Y?

+0

Возможно, это может дать вам идею http://stackoverflow.com/questions/6464569/changing-uiviews-during-uiinterfaceorientation-on-ipad –

+0

@ Praveen-K нет, речь идет не о событиях ориентации устройства. Я хочу знать точный угол поворота вокруг Y относительно того, как пользователь начал удерживать устройство. –

+0

Ну, вы всегда можете узнать о запуске приложения. В какой ориентации пользователь держит устройство, и на основе этого условия вы можете рассчитать ось y (я не уверен, если вы спрашиваете, где пользователь держит устройство в странном угле: P_) –

ответ

2

С вашего другого вопроса Why is this CMDeviceMotionHandler never called by CoreMotion? Я знаю, что вы работаете на iOS 4 - в iOS5 ситуация немного изменилась. В общем, данные гироскопа или даже лучшее слияние датчиков акселерометра и гироскопических данных, как это сделано в DeviceMotion, - лучший подход для получения правильных результатов.

Итак, если вы его запустили, вам нужно будет работать с методом CMAttitude's multiplyByInverseOfAttitude, чтобы получить все результаты CMDeviceMotion относительно вашей системы отсчета. Просто сохраните ссылку на первое CMAttitude в члене класса и вызовите multiplyByInverseOfAttitude с ним во всех последующих вызовах. Тогда все члены CMDeviceMotion.attitude будут ссылаться на эту систему отсчета.

Для получения поворота вокруг оси Y первым подходом является угол Эйлера, то есть CMAttitude.roll. Если вам просто нужно отслеживать небольшие движения, это может быть хорошо. Если движения более обширны, у вас возникнут проблемы с Gimbal Lock. Затем вам нужны передовые методы, такие как операция кватерниона, чтобы получить стабильные результаты, но это звучит как собственный вопрос.

Смежные вопросы