[opengl] obrót żółwia

0

Piszę sobie interpreter na kształt logo. I napotkałem na pewien problem:

Kiedy obrócę obiekt o 45 stopni i dam komendę naprzód 200.0f, to wszystko jest w porządku. Ale jeżeli dam jeszcze jedną komendę obrót o 45 stopni, to żółw jest obrócony o 90 st. w stosunku do pierwotnego położenia, lecz znajduje się na osi pierwotnej osi OX oddalone o 200.0f od pierwotnego początku układu współrzędnych.

Moje pytanie jest takie: jak sprawić by glTranslatef i glRotatef obliczały kolejne przesunięcie/obrót względem obecnego stanu, a nie stanu pierwotnego?

0

ktos mi kiedys powiedział:
gltranslate(300,0,0);
glrotate(45,0,1,0);
i to obraca wokół punktu 0,0,0 o 45 stopni
i pozniej przesuwa o 300 jednostek w strone osi X+

pokombinuj z zapisywaniem stanu, macierzy dla obiektu:
glpushmatrix();
glpopmatrix();

bedzie potrzebne glloadidentiy jak masz zolwia (srodek) w punkcie 0,0,0 i wtedy sobie orbocisz znowu i przesuniesz o co chcesz

0

Fragment odpowiadający za rysowanie.

	
glPushMatrix();
   glLoadIdentity();
   glColor3f(r, g, b);
   glRotatef(angle, 0.0f, 0.0f, 1.0f);
   glTranslatef(t_x, t_y, 0.0f);
	glBegin(GL_TRIANGLES);
		glVertex3f(- SIZE/2, 0.0f, 0.0f);
		glVertex3f(  SIZE/2, 0.0f, 0.0f);
		glVertex3f(0.0f, SIZE, 0.0f);
	glEnd();
glPopMatrix();

Gdzie t_x, t_y to współrzędne zółwia.

Funkcja rotate

	if (CCW)
		angle += _angle;
	else
		angle -= _angle;

Gdzie CCW to bool odpowiadający za kierunek obrotu.

Funkcja forward

t_y += step;

Gdzie step to długość przesunięcie.

I teraz jak wywołam coś takiego
rotate(45.0f);
forward(200.0f);
rotate(45.0f);

to żółw jest przesunięty o 200.0f na prawo od pierwotnego początku układu współrzędnych, leży na osi oX,
a powinien nie zmieniać miejsca, tylko się obrócić.

0

to ja nie wiem:

rotate(90.0f);
forward(200.0f);

bo nie wiadomo co ty chcesz obracac i gdzie (wzgledem czego)

0

Po prostu chce zrobić tak jak w logo.

Skręć w prawo 45 stopni
Na przód 200
Skręć w prawo 45 stopni

Coś podobnego do tego.

http://www.mim.pr.radom.pl/logo/image/linia.gif

0

pamietam logo i zolwika...

musisz znac punkt (pozycje) zolwia przed zmiana kata (obroceniem zółwia)
najpierw obracamy zółwia glrotate(kąt,x,y,z);
później przenosimy go do punktu ktory zapisałeś sobie w pamieci czyli, jak p to pozycja zolwia
to
gltranslate(p.x,p.y,p.z);/czy jakos tak
glrotate(kąt);

uzywasz tylko jednego glrotate (czemu jedego? bo dodajesz kąty a masz ich 360 czyli pełen obrót), pewnie chcialbys jescze zeby on sie poruszal po tej linii, a nie skakal, to musisz sobie juz trase wytyczyc z wektora, którym bedzie (nowa_pozycja-P) pozniej definiujesz jak szybko w czasie ma sie przemieszczac zółwik, pamietajac od przemnożeniu przesuięcia przez różnice czasu z poprzedniej klatki (czyli aktualnyczas - czas_z_poprzedniej_klatki).

Dane są tylko trzeba je jakoś umiejętnie wykorzystać i połączyć to jest właśnie to FE czego nie lubie, ale bez tego sie nie obejdzie :P

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