Domanda

Il lancio e il rotolo che otteniamo dal sensormanager.Groiderientamento di Android () sono tutti per l'asse Y del telefono.Con questo voglio dire, lo yaw e il tono dicono dove i punti dell'asse y, e il rotolo riguarda l'asse Y.(E il mio orientamento dello schermo è fissato a Landsape, quindi l'asse Y non cambia).Ma quello che voglio è il lancio di imbardata e rotolare l'asse z negativo (punti in il telefono), più come se il mio schermo del telefono è una finestra del paesaggio in un cockpit di un aereo, quale sarebbe lo sbagliorePitch and Roll Be?

È stato utile?

Soluzione

Se capisco cosa stai dicendo, stai vedendo l'attuale lancio di imbardata e rotolare il ritorno come se l'asse + y fosse il "fronte anteriore" predefinito e l'asse + z è stato il 'up' default vector. Ti piacerebbe fare una trasformata di coordinate in modo tale che il tuo imbardata, pitch e rotole siano calcolati con l'asse -Z come il vettore "anteriore" predefinito e il vettore + x come il default "su".

Innanzitutto, è necessario calcolare il fronte corrente e su vettori dal tuo imbardata, tono e rotolare nella configurazione corrente. Questo può essere fatto usando matrici di rotazione 3D: http://en.wikipedia.org/wiki/rotation_matrix#rotations_in_three_dimensons

Utilizzare l'angolo di imbardata per ruotare circa z, pitch come rotazione su x, e rotolare come una rotazione su y. Moltiplicare queste matrici insieme, quindi moltiplicare il vettore anteriore (0, 1, 0) e su Vector (0, 0, 1) con il risultato per ottenere i tuoi nuovi vettori anteriori e successivi.

Avanti Dovrai calcolare i nuovi yaw, pitch e roll angoli. Yaw è l'angolo tra il vettore anteriore proiettato nel piano YZ (set Valore X su 0) e il vettore -Z Vector (0, 0, -1), il pitch è l'angolo tra il vettore anteriore proiettato sul piano XZ e il - z Vector, e rotolo è l'angolo tra il vettore in alto proiettato sul piano XY e il vettore + x (1, 0, 0). Se lasciamo FX= il componente X del vettore anteriore, FY sia il componente Y, e così via, otteniamo:

yaw   = acos ( -z dot (0,  Fy, Fz) ) / sqrt(Fy*Fy + Fz*Fz)
pitch = acos ( -z dot (Fx, 0,  Fz) ) / sqrt(Fx*Fx + Fz*Fz)
roll  = acos ( +x dot (Ux, Uy, 0 ) ) / sqrt(Ux*Ux + Uy*Uy)
.

Dovresti essere in grado di farlo per altri vettori se ho scelto quelli sbagliati.

Altri suggerimenti

Le convenzioni dei assi del corpo utilizzate in Android non sono le stesse utilizzate in aerospaziali (per buone ragioni).L'asse X di un "piano" è equivalente all'asse "Y" di e dispositivo Android (e allo stesso modo X Axis è correlato all'asse Y, positivo o negativo a seconda delle convenzioni enu ro ned).Un buon articolo sulle convenzioni del rotolo di ANS Pitch ANS possono essere trovate qui, e potrebbe essere un inizio per rispondere alla tua domanda: http://www.sensorplatforms.com/understanding-orientation-convention-mobile-platforms/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top