2012-05-30 16 views
5

Ricordo dal WWDC che c'era un discorso che mostrava una teiera in OpenGL ES, che ruotava con il movimento del dispositivo. Sembrava che la teiera si fermasse nello spazio.Come ottenere una rotazione attorno all'asse Y rispetto a come l'utente tiene il dispositivo?

All'avvio dell'app, la teiera è stata avviata in una posizione specifica. Quindi, quando il dispositivo è stato ruotato, anche la teiera è ruotata per rimanere ferma nello spazio.

In questa conversazione, hanno menzionato che dobbiamo ottenere il "frame di riferimento", ad es. all'avvio dell'app, che ci dice in che modo l'utente aveva inizialmente il dispositivo.

Per esempio ecco l'asse accelerometro:

accelerometer

Voglio sapere rotazione attorno all'asse Y, ma rispetto a come l'utente tiene il dispositivo. Quindi, quando l'utente lo tiene in posizione verticale e ruota attorno a Y, ho bisogno di sapere che valore di rotazione.

Penso che la chiave stia rimuovendo la gravità dalle letture? Ho anche scelto come target iPhone 4/4S con giroscopi, ma credo che CoreMotion si fonderebbe automaticamente con i sensori.

Come ho potuto capire di quanto l'utente ha ruotato il dispositivo attorno all'asse Y?

+0

può essere questo può darvi l'idea http://stackoverflow.com/questions/6464569/changing-uiviews-during-uiinterfaceorientation-on-ipad –

+0

@ Praveen-K no, non si tratta di eventi di orientamento del dispositivo. Voglio conoscere l'angolo di rotazione preciso attorno a Y rispetto a come l'utente ha iniziato a impugnare il dispositivo. –

+0

Bene, puoi sempre sapere all'avvio dell'app, in quale orientamento l'utente sta tenendo il dispositivo e in base a tale condizione puoi calcolare l'asse y (non sono sicuro, se lo stai chiedendo, dove l'utente è in possesso del dispositivo in angolo strano: P_) –

risposta

2

Dall'altra domanda Why is this CMDeviceMotionHandler never called by CoreMotion? So che lavori su iOS 4: le cose sono leggermente cambiate in iOS5. In generale, i dati del giroscopio o anche la migliore fusione dei dati dell'accelerometro e del giroscopio come fatto in DeviceMotion è l'approccio migliore per ottenere risultati corretti.

Quindi, se questo è installato e funzionante, sarà necessario lavorare con il metodo CMAttitude's multiplyByInverseOfAttitude per ottenere tutti i risultati di CMDeviceMotion relativi al frame di riferimento. Basta memorizzare un riferimento del primissimo CMAttitude in un membro della classe e chiamare multiplyByInverseOfAttitude con esso su tutte le chiamate successive. Quindi tutti i membri di CMDeviceMotion.attitude faranno riferimento a questo frame di riferimento.

Per ottenere la rotazione attorno all'asse Y, un primo approccio consiste nel prendere gli angoli di Eulero, ad esempio CMAttitude.roll. Se devi solo seguire piccoli movimenti, questo potrebbe andar bene. Se i movimenti sono più ampi, si verificherà un problema relativo a Gimbal Lock. Quindi hai bisogno di tecniche avanzate come l'operazione di quaternion per ottenere risultati stabili, ma sembra una domanda.

Problemi correlati