Przemieszczanie obiektu w OpenGL za pomocą translacji o obrotu.

0

Muszę wykonać zdanie na OpenGL w którym patrząc z oczu obserwatora będę poruszał robotem (nie musi mieć animacji, w zasadzie może być to bryła). Musi chodzić do przodu i tyłu oraz skręcać na boki. Na dodatek ma mieć możliwość poruszania głową na boki.

Zasadniczo chce skorzystać z funkcji glTranslatef oraz glRotatef żeby przesuwać obiekt.
Pod klawiszami W i S mam zwiększanie i zmniejszanie zmiennej ruch a pod A i D to samo dla zmiennej kąt.
Te zmienne są przekazywane do glTranslatef i glRotatef jako parametry.
Wygląda to mniej więcej tak:

 	
glPushMatrix();
   glRotatef(kat, 0, 1, 0);
   glTranslatef(0, 0, ruch);
   DrawRobot();	
glPopMatrix();

Problem jest w tym że taka kolejność operacji sprawia że pomimo przemieszczenia robota o jakiś wektor, wektor wokół którego obracam robota pozostaje zaczepiony w punkcie (0, 0, 0). W ten sposób tylko w pkt (0, 0, 0) robót obraca się wokół własnej osi, gdy opuści ten obszar porusza się po okręgu.

Gdy zmienię kolejność translacji i obrotu to robot obraca się wokół własnej osi jednak obrót ten nie wpływa na kierunek przemieszczania, tzn. robot zawsze chodzi w wzdłuż tej samej prostej.

0

Zasadniczo chce skorzystać z funkcji glTranslatef oraz glRotatef żeby przesuwać obiekt.
Kiedyś zrobiłem tak, że wyliczałem pozycję ze wzorów trygonometrycznych bez udziału OpenGL, a potem jedno Translate i jedno Rotate.
Nie wiem czy to najlepsze rozwiązanie, ale działało.

0

Zmień kolejność, najpierw zrób rotacje dopiero potem przesuń.
glPushMatrix();
glTranslatef(ruchx, 0, ruchz);
glRotatef(kat, 0, 1, 0);
DrawRobot();
glPopMatrix();

ruchx i ruchy wyznaczasz z
ruchx += sin(kat)*v
ruchz += cos(kat)*v
Musisz dobrać odpowiednie znaki przy funkcji sin/cos i ewentualnie zmienić wyliczenie ruchx na podstawie cos, ruchz na podstawie sin. Wszystko zależy od orientacji robota jaka przyjmiesz.

Z tego co wiem to w przypadku gdy 0 stopni oznacza robota idącego w przód (w kierunku ujemnym osi Z) to wzór powinien wygladać tak:
ruchx -= sin(kat)*v
ruchz -= cos(kat)*v

v to prędkość z jaką bedzie sie robot poruszać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1