2012-05-30 15 views
5

Recuerdo de WWDC que hubo una charla que mostraba una tetera en OpenGL ES, que giraba con el movimiento del dispositivo. Parecía que la tetera estaba quieta en el espacio.¿Cómo obtener la rotación alrededor del eje Y en relación con la forma en que el usuario sostiene el dispositivo?

Cuando se lanzó la aplicación, la tetera comenzó en una posición específica. Luego, cuando se rotó el dispositivo, la tetera también giró para permanecer inmóvil en el espacio.

En esta charla, mencionaron que debemos obtener el "marco de referencia", p. tras el lanzamiento de la aplicación, que nos dice cómo el usuario celebró inicialmente el dispositivo.

Por ejemplo aquí está el eje acelerómetro:

accelerometer

Quiero saber rotación alrededor del eje Y, pero en relación con la forma en que el usuario mantiene el dispositivo. Entonces, cuando el usuario lo mantiene en posición vertical y gira alrededor de Y, necesito saber ese valor de rotación.

Creo que la clave es eliminar la gravedad de las lecturas? También me dirijo a iPhone 4/4S con giroscopios, pero creo que CoreMotion los fusionará automáticamente.

¿Cómo puedo saber cuánto giró el dispositivo por el eje Y?

+0

puede ser esto puede darle la idea http://stackoverflow.com/questions/6464569/changing-uiviews-during-uiinterfaceorientation-on-ipad –

+0

@ Praveen-K no, no se trata de eventos de orientación del dispositivo. Quiero saber el ángulo de rotación preciso alrededor de Y con respecto a cómo el usuario comenzó a sostener el dispositivo. –

+0

Bueno, siempre se puede saber al iniciar la aplicación, en qué orientación el usuario sostiene el dispositivo, y en base a esa condición se puede calcular el eje y (no estoy seguro, si se lo preguntan, dónde está el usuario sujetando el dispositivo). en ángulo raro: P_) –

Respuesta

2

De tu otra pregunta Why is this CMDeviceMotionHandler never called by CoreMotion? Sé que estás trabajando en iOS 4: las cosas han cambiado ligeramente en iOS5. En general, los datos del giróscopo o incluso una mejor fusión del sensor de los datos del acelerómetro y del giróscopo como se hace en DeviceMotion es el mejor enfoque para obtener los resultados adecuados.

Por lo tanto, si lo tiene en funcionamiento, necesitará trabajar con el método CMAttitude's multiplyByInverseOfAttitude para obtener todos los resultados de CMDeviceMotion relativos a su marco de referencia. Simplemente almacene una referencia de la primera CMAttitude en un miembro de la clase y llame a multiplyByInverseOfAttitude con ella en todas las llamadas posteriores. Entonces todos los miembros de CMDeviceMotion.attitude se referirán a este marco de referencia.

Para obtener la rotación alrededor del eje Y, una primera aproximación es tomar ángulos de Euler, es decir, CMAttitude.roll. Si solo necesita hacer pequeños movimientos, esto podría estar bien. Si los movimientos son más extensos, se encontrará con problemas con respecto al Gimbal Lock. Entonces necesitas técnicas avanzadas como la operación de cuaternión para obtener resultados estables, pero esto suena como una pregunta propia.

Cuestiones relacionadas