• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Opengl - poruszanie pojazdem, transformacje

Object Storage Arubacloud
0 głosów
521 wizyt
pytanie zadane 27 grudnia 2016 w OpenGL, Unity przez Rivi Początkujący (320 p.)

Próbuje wykonać przy pomocy Opengl program, który będzie poruszał pojazdem na pomocą strzałek. Chcę to zrobić używając transformacji. Program, który napisałem działa prawie dobrze. Oto część kodu:

	glPushMatrix();
	glRotatef(katKoparki, 0.0, 1.0, 0.0);
	glTranslatef(0.0, 0.0, zKoparka);
	rysujKoparke();
	glPopMatrix();

Zmienne katKoparki i zKoparka zmieniają się podczas naciskania klawiszy. Pojazd porusza się prawidłowo w przód i tył. Jedynym problemem jest obracanie się. Pojazd obraca się wokół własnej osi tylko na początku w punkcie (0, 0, 0) po poruszeniu się np. do przodu pojazd przy obrocie zatacza okręgi, bo nadal obraca się wokół (0, 0, 0). Chciałbym, aby pojazd obracał się wokół swojego środka.  W internecie znalazłem rozwiązanie, aby dodać jeszcze jedną transformację glTranslatef(0.0, 0.0, -zKoparka), ale pojazd po dodaniu takiej linii przestaje się poruszać. Kolejnym rozwiązaniem było dodanie sin(kąta) i cos(kąta) przy transformacji do x i z, niestety najpewniej robiłem tutaj jakiś błąd, bo to także nie działało.

Będę wdzięczny za pomoc w rozwiązaniu tego problemu.

 

 

 

1 odpowiedź

+2 głosów
odpowiedź 27 grudnia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Prostym sposobem rozwiązania tego problemu może być przeniesienie pojazdu do początku układu współrzędnych (wtedy oś obrotu z początku układu współrzędnych będzie się pokrywać z osią przesuniętą), obrócenie i powrót na wcześniejszą pozycję. Przedstawia to ten rysunek:

Tak w ogóle funkcja glRotatef, jak i cała maść innych funkcji transformacji, są zdeprecjonowane. Dzisiaj zalecanym sposobem transformacji jest używanie shaderów wierzchołków oraz macierzy.

komentarz 28 grudnia 2016 przez Rivi Początkujący (320 p.)
edycja 28 grudnia 2016 przez Rivi

Dziękuję za odpowiedź. Przedstawiony sposób wydaje się być prosty. Problem pojawia się jednak podczas implementacji. Napisałem kod:

glPushMatrix();
glTranslatef(0.0, 0.0, -zPoprzednie);
glRotatef(katKoparki, 0.0, 1.0, 0.0);
glTranslatef(0.0, 0.0, zKoparka + zPoprzednie);
rysujKoparke();
zPoprzednie = zKoparka;
glPopMatrix();

Chciałem, aby pierwsze glTranslate cofało obiekt na środek układu (0,0,0), następnie przeprowadzić rotację i w końcu glTranslate, które przenosi obiekt na odpowiednią pozycję. Niestety nie działa to tak jak powinno. Obiekt nadal nie obraca się wokół własnego środka. Będę wdzięczny za pomoc.

komentarz 31 grudnia 2016 przez Patrycjerz Mędrzec (192,320 p.)
Wydaję mi się, że robienie wszystkiego na jednej macierzy uniemożliwia poprawny obrót, gdyż oba przesunięcia się wzajemnie wykluczają. Spróbuj aktualizować pozycję pojazdu po każdej transformacji.

Podobne pytania

0 głosów
4 odpowiedzi 1,295 wizyt
0 głosów
0 odpowiedzi 76 wizyt
0 głosów
1 odpowiedź 156 wizyt

92,555 zapytań

141,403 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...