Autor Wątek: kąt na podstawie wektora...  (Przeczytany 1891 razy)

Offline ŁukaszB

  • Użytkownik

# Styczeń 24, 2009, 13:17:53
Mam wektor kierunku i na jego podstawie musze wyliczyć kąt o jaki go obrucić wyświetlając ten obiekt przy pomocy glRotatef.
znalazłem temat
http://forum.warsztat.gd/index.php/topic,9080.0.html
http://pl.wikipedia.org/wiki/Układ_współrzędnych_sferycznych

Czyli mój problem jak mniemam polega na obliczeniu teta i omega, potem przeliczeniu ich na stopnie(wynik trzeba jeszcze pomnożyć 180/PI?), i użyciu gRotate, ale obroty nadal nie są dobre.

jak to jest ?
glRotate(teta, x)?
glRotate(omega, y)?

bo już nie moge siedze nad tym i siedze i nie działa ciągle
oczywiście wektor jest znormalizowany...

[Edit]
raczej w stopniach http://www.cs.rutgers.edu/~decarlo/428/gl_man/rotate.html
« Ostatnia zmiana: Styczeń 24, 2009, 13:34:01 wysłana przez ŁukaszB »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline rm-f

  • Użytkownik
    • Tu trolluje

# Styczeń 24, 2009, 13:27:40
« Ostatnia zmiana: Styczeń 24, 2009, 13:45:25 wysłana przez rm-f »

Offline Avaj

  • Użytkownik

# Styczeń 24, 2009, 13:36:44
glRotatef przyjmuje kąt w stopniach.

Offline ŁukaszB

  • Użytkownik

# Styczeń 24, 2009, 14:17:47
Tak, tak w stopniach.

Mi chodzi o to że robie tak: który kąt od czego jest bo już próbowałem wszystkie kombinacje i nadal nic.
Może źle to rozumiem, bo zakładam sobie że mój obiekt jest "wzdłuż" osi "OZ" i wzgledem tej osi ustala sie obrót na podstawie tych kątów(a raczej wzgledem tego sie nie obraca?)...

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 24, 2009, 15:47:56
Proponuję poczytać o funkcji "atan2" z biblioteki standardowej.

Offline Esidar

  • Użytkownik

# Styczeń 24, 2009, 15:53:23
Sam wektor nie da jednoznacznego wyniku. Wektor jest prostą która nie ma swojego obrotu "roll" to oznacza że z jednego wektora może wyjść bardzo dużo różnych kombinacji obrotów X, Y, Z i wszystkie będą prawidłowe. Od sposobu liczenia zależy która z kombinacji obrotów ci wyjdzie. Jedną z metod jest wyliczenie macierzy z takiego wektora.

Możesz przyjąć że twój wektor wskazuje oś lokalną Z obiektu. Teraz pozostaje "jedynie" obliczyć oś X oraz oś Y układu lokalnego obiektu. Można to zrobić tak: Przyjmujesz jakiś punkt odniesienia, np. drugi wektor który jest zawsze skierowany do góry Vt = {0,1,0}. Ten wektor to sztuczna, tymczasowa oś Y. Oś X wyznaczasz licząc iloczyn wektorowy, czyli Vx = Vz x Vt. Mając już oś X wyznaczasz prawdziwą oś Y też używając iloczynu czyli Vy = Vz x Vx. I w ten sposób masz 3 osie. Możesz je "włożyć" do macierzy:

mat[0] = Vx;
mat[1] = Vy;
mat[2] = Vz;

Jeżeli wystarczy ci macierz to ją poprostu ładujesz do OpenGL: LoadMatrix(). Jeżeli bardzo chcesz mieć stopnie to musisz wykonać dekompozycję macierzy. Problem w tym, że to też nie jest jednoznaczne i też daje kilka prawidłowych wyników. Wszystko zależy od kolejności obrotów (RotX->RotY->RotZ to co innego niż RotZ->RotY->RotX).

maxest

  • Gość
# Styczeń 24, 2009, 16:05:40
Cytuj
Przyjmujesz jakiś punkt odniesienia, np. drugi wektor który jest zawsze skierowany do góry Vt = {0,1,0}. Ten wektor to sztuczna, tymczasowa oś Y
Przy czym nalezy pamietac, ze nasz pierwszy wektor nie moze miec takich samych wspolrzednych. Ujdzie nawet cos w stylu (0, 1, 0.001), ale (0, 1, 0) juz nie. Tak wiec tutaj trzeba zrobic jakiegos if'ka i jesli wejsciowy wektor to (0, 1, 0) to wowczas "sztuczny" up ustawic na cos w stylu (0, 1, 0.5) czy nawet (0, 1, 0.001)

Offline ŁukaszB

  • Użytkownik

# Styczeń 24, 2009, 18:34:45
no znaczy ja wiem że wektory są niejednoznaczne:)

ale myslalem że mogę to zrobić tak, wyliczać obrót zawsze dla powiedzmy dodatniej ćwiartki układu, a potem mając rzeczywiste współrzędne wektora kierunku będe mógł w odpowiednie miejsce dodać minusa i włala... no ale może nie widze tego tak dobrze jak inni:)

Chodzi mi o to żeby obiekt był zwrócony w kierunku wektora kierunku, nie ważne jaki to  będzie kąt byle to się pokrywało, czyli żeby w oknie nie było widać, że obiekt porusza do przodu a ciągle jest odwrócony plecami.

Jeżeli te macierze mi wystarczą, a twoja metoda wydaje się dawać to co chcę to kk.
« Ostatnia zmiana: Styczeń 24, 2009, 18:40:59 wysłana przez ŁukaszB »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 24, 2009, 18:44:24
Cytuj
ale myslalem że mogę to zrobić tak, wyliczać obrót zawsze dla powiedzmy dodatniej ćwiartki układu, a potem mając rzeczywiste współrzędne wektora kierunku będe mógł w odpowiednie miejsce dodać minusa i włala...
Poczytaj o tej funkcji, o której wspomniałem wcześniej - ćwiartki załatwi za Ciebie.

Offline Esidar

  • Użytkownik

# Styczeń 24, 2009, 18:46:31
odpowiednie miejsce dodać minusa i włala...
Czasami trzeba więcej niż 1 minus :)

Cytuj
obiekt porusza do przodu a ciągle jest odwrócony plecami.
Jak to ma wyglądać dokładnie ? :) Jeżeli chcesz mieć po środku ekranu obiekt który będzie na sztywno przyczepiony do kamery to nie będzie to zbyt naturalnie wyglądać :)
Ale generalnie ten efekt możesz uzyskać biorąc poprostu aktualna macierz wyświetlania i zerując jej obroty (czyli 3 pierwsze wiersze są jednostkowe a 4 wiersz z pozycją pozostaje bez zmian).

Offline ŁukaszB

  • Użytkownik

# Styczeń 24, 2009, 19:22:04
obiektem jest pojazd latajacy który się porusza od co ;]
no obiekt nie bedzie posrodku erkanu
ale kamera zawsze będzie za nim albo w nim(a moze tylko w nim)

Offline Esidar

  • Użytkownik

# Styczeń 24, 2009, 19:33:24
To wyzeruj obroty w macierzy wyświetlania, przed narysowaniem pojazdu i zobacz co ci wyjdzie (powinien być na sztywno przypięty do kamery). Ale podejrzewam że to nie będzie to o co ci chodzi :)

Jeżeli chcesz mieć coś takiego http://www.gry-online.pl/.%5CGaleria%5CHtml%5CDokumenty%5C945774656.jpg to nie wyjdzie zwykłe użycie wektora poruszania, bo musi być odpowiednie zachowanie kamery i pojazd nie zawsze będzie z tyłu (czasami też z boku).

Dużo prościej będzie mieć obrót obiektu i z tego obrotu wyliczać kierunek poruszania obiektu. Z tego obrotu można też obliczyć kierunek patrzenia kamery.

Offline ŁukaszB

  • Użytkownik

# Styczeń 24, 2009, 19:36:12
znaczy kamere mam już zrobioną i ona działa.
Ale problem jest z tym wyliczeniem o ile orócić obiekt (lub świat dokoła niego) żeby to było zgodne z kierunkiem ruchu bo kiedyś jak robiłem obroty to przez jakieś dodatkowe zmienne, zmienne globalne i to działało tylko tutaj jest wektor i jest problem,

no mnie więcej tak jak jest na rysunku...