2010-05-06 13 views
9

Ho un vettore di direzione che applicato a una posizione mi dà il punto in cui la fotocamera dovrebbe apparire. Come posso ottenere da quella imbardata, beccheggio e rollio per usare correttamente glRotatef?Come ottenere Yaw, Pitch and Roll da un vettore 3D

Grazie in anticipo

risposta

7

Probabilmente in realtà non vogliono che l'imbardata, rollio e beccheggio. Hai solo bisogno della trasformazione corretta. Prova a utilizzare gluLookAt per costruirlo. Documentation.

+0

Grazie per il suggerimento. Ho appena iniziato a utilizzare OpenGL e non conoscevo questa funzione. Ho risolto usando questo. – Jack

+0

Questa è una bella risposta, ma solo pratica per un sottoinsieme delle piattaforme comuni che forniscono GLU (ad esempio non necessariamente le piattaforme OpenGL ES) – jheriko

14

Non è possibile ottenere imbardata, rollio e beccheggio da un vettore di direzione come il vettore di direzione dirà soltanto quale direzione guardare a (imbardata e beccheggio)

Per ottenere l'imbardata e beccheggio si utilizza la trigonometria - si Presumo avere alcune conoscenze di lavoro. Controlla this wiki page per alcuni diagrammi utili per visualizzare gli angoli.

Lasciando Y = imbardata, P = passo.

primo a ottenere Imbardando desideri:

tan(Y) = x/(-y) 

Ora per ottenere passo:

tan(P) = sqrt(x^2 + y^2)/z 

Per ottenere i valori effettivi per Y e P è necessario utilizzare inversa abbronzatura, I' Ho scritto sopra usando l'abbronzatura per rendere più chiara la derivazione.

Si noti che i segni meno dipendono da come si definiscono gli angoli e gli assi, ma si dovrebbe ottenere l'idea.

È quindi possibile impostare il rotolo su 0 o su qualsiasi altra cosa.

+1

Ma in pratica di solito c'è una direzione 'su' in qualsiasi applicazione e si può quasi sempre scegliere un orientamento che mantiene "alto" il più vicino possibile verso l'alto. – sigfpe

+0

Grazie mille per la risposta. Sì, hai ragione, il rotolo non può essere determinato solo da un vettore. Ho bisogno di un vettore su (come suggerisce l'utente207442) o di uno scalare che determina l'angolo. Ho risolto il mio problema usando gluLookAt ma sono ancora curioso di sapere come ottenere questi angoli. – Jack

+0

L'espressione per tan (Y) è più o meno intuitiva. Per l'abbronzatura (P) non così tanto. Potresti spiegare perché questa espressione dà abbronzatura (P) o link a una fonte che la spiega? – dinosaur

2

Le equazioni di pheelicks sono sbagliate. Gentili futuri googler, ecco cosa funziona:

Assunto passo: rotazione per asse X, imbardata: rotazione per asse Y, rotolo: rotazione per asse Z. Vettore direzione V (x, y, z)

pitch = asin(V.y/length(V)); 
yaw = asin(V.x/(cos(pitch)*length(V))); //Beware cos(pitch)==0, catch this exception! 
roll = 0; 
+0

Mi sembra che sia più o meno la stessa cosa, forse dovresti controllare la tua trigonometria. – meneldal

6

Nessuna di queste equazioni sono 'sbagliato' ma tutti sono un po 'goffa. Ryder052, l'esempio non considera alcuni casi come hai commentato. Perché non usare atan2?

unità Given (normalizzato) vettore di direzione d

pitch = asin(-d.Y); 
yaw = atan2(d.X, d.Z) 
Problemi correlati