2010-05-06 10 views
9

Mam wektor kierunku, który zastosowany do pozycji daje mi punkt, w którym kamera powinna wyglądać. Jak mogę uzyskać z tej odchylenia, nachylenia i przechylenia, aby prawidłowo używać glRotatef?Jak uzyskać Yaw, Pitch and Roll z wektora 3D

góry dzięki

Odpowiedz

7

Prawdopodobnie w rzeczywistości nie chcą zboczenia, skoku i obrotu. Potrzebujesz tylko właściwej transformacji. Spróbuj użyć gluLookAt, aby go zbudować. Documentation.

+0

Dziękuję za podpowiedź. Właśnie zacząłem używać OpenGL i nie wiedziałem o tej funkcji. Rozwiązałem to przy użyciu. – Jack

+0

To jest dobra odpowiedź, ale tylko praktyczna dla podzbioru wspólnych platform, które zapewniają GLU (np. Niekoniecznie platformy OpenGL ES). – jheriko

14

Nie można dostać zboczenia, skoku i obrotu z wektorem kierunku co wektor kierunek powie tylko w jakim kierunku szukać w (odchylenia i pochylenia)

Aby uzyskać odchylenia i pochylenia użyć trygonometrii - Zakładam, że mieć trochę praktycznej wiedzy. Zapoznaj się z this wiki page, aby uzyskać przydatne diagramy do wizualizacji kątów.

Pozwolenie Y = odchylenie, P = skok.

Pierwszy dostać yaw chcesz:

tan(Y) = x/(-y) 

Teraz aby uzyskać pitch:

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

Aby uzyskać rzeczywiste wartości dla Y i P trzeba użyć odwrotny Tan, I” ve napisałem to powyżej używając opalenizny, aby wyprowadzenie było jaśniejsze.

Zauważ, że znaki minusowe zależą od tego, jak definiujesz swoje kąty i osie, ale powinieneś uzyskać pomysł.

Następnie można ustawić rolkę na 0 lub cokolwiek chcesz.

+1

Jednak w praktyce w każdej aplikacji zazwyczaj występuje kierunek "do góry" i prawie zawsze można wybrać orientacja, która zachowuje "górę" jak najbliżej do góry. – sigfpe

+0

Wielkie dzięki za odpowiedź. Tak, masz rację, rolki nie można określić tylko przez wektor Potrzebuję wektora do góry (jak sugeruje user207442) lub skalaru, który określa kąt. Rozwiązałem mój problem za pomocą gluLookAt, ale nadal jestem ciekawy jak uzyskać te kąty. – Jack

+0

Twoje wyrażenie dla tan (Y) jest mniej lub bardziej intuicyjne. Dla tan (P) nie tak bardzo. Czy możesz wyjaśnić, dlaczego to wyrażenie daje tan (P), lub link do źródła, które to wyjaśnia? – dinosaur

2

Równania pheelicksa są błędne. Drodzy przyszli pracownicy Googlers, oto masz to, co działa:

Przyjmując skok: obrót o oś X, zbaczanie: obrót o oś Y, walec: obrót o oś Z. Kierunek wektora 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

Wygląda na to, że to prawie to samo, może powinieneś sprawdzić trygonometrię. – meneldal

6

Żaden z tych równań są 'źle', ale wszystkie są trochę niezgrabny. Ryder052, Ty przykład nie uwzględniasz niektórych przypadków, które skomentowałeś. Dlaczego nie skorzystać z atan2?

danej jednostki (znormalizowane) kierunek wektora d

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