opengl 2 obiekty względem siebie

0

Witam. Mam pewien problem. Z tego co wyczytałem glPushMatrix i glPopMatrix umożliwiają zebrać ileś tam obiektów do kupy i można nimi manipulować w tym samym czasie, co wpływa to na wszystkie obiektu z tego stosu i wykonują praktycznie to samo. No nie wiem, nie używając tego stosu również wszystkie zdefiniowane obieky robią to samo co jeden z nich. Jak mogę manipulować jednym obiektem niezależnym od reszty, a manipulować kilkoma ze stosu tak aby nie ingerowały w inny stos obiektów lub jeden pojedynczy obiekt?

glBegin(GL_QUADS);

          glPushMatrix();
	  glColor3f(0.8, 0.0, 0.0);
	  glTranslatef(pos[0], pos[1], pos[2]);
	  glutSolidCube(0.3);
	  glPopMatrix();


	glPushMatrix();
	glColor3f(1.0, 0.0, 0.0);
	glTranslatef(-0.5, 0.5, -1.0);
	glutSolidSphere(0.5,10,10);
	glRotatef(rot,0.1,0.1,0.1);
	glPopMatrix();

glEnd();
 
0
Norymberczyk napisał(a)

Z tego co wyczytałem glPushMatrix i glPopMatrix umożliwiają zebrać ileś tam obiektów do kupy i można nimi manipulować w tym samym czasie, co wpływa to na wszystkie obiektu z tego stosu i wykonują praktycznie to samo.
Nie manipulujesz obiektami tylko macierzą przekształceń a tak naprawdę przesuwasz sobie układ Kartezjański. Co to oznacza: że obrót + przesunięcie to nie to samo co przesunięcie obrót.
Dodam tylko tyle, że os z-tow idzie do monitora jak pamiętam.

glBegin(GL_QUADS);

          glPushMatrix(); //tutaj zrzucasz aktualne położenie układ kartezjańskiego wraz z jego obrotem - A
	  glColor3f(0.8, 0.0, 0.0);
	  glTranslatef(pos[0], pos[1], pos[2]);
	  glutSolidCube(0.3);
	  glPopMatrix();//tutaj wczytujesz - A. Wraca wszystko do ustawień sprzed glPushMatrix(); 
//co to ci dało:
//że nie musisz samemu wpisywać glTranslatef(-pos[0], -pos[1], -pos[2]);. Tylko samo się tak jakby cofa.


	glPushMatrix();
	glColor3f(1.0, 0.0, 0.0);
	glTranslatef(-0.5, 0.5, -1.0);
	glutSolidSphere(0.5,10,10);
	glRotatef(rot,0.1,0.1,0.1);//ta czesc nic ci nie daje. Robisz rotacje a linijkę później powracasz do ostawień sprzed glPushMatrix(); 
	glPopMatrix();

glEnd();
 

Nie znam wartości pos. Ale, gdybyś nie korzystał z Push i Pop, to żeby uzyskać ten sam efekt drugie glTranslatef(-0.5, 0.5, -1.0); musiało by wyglądać tak:

glTranslatef(-pos[0]-0.5, -pos[1]+0.5, pos[2]-1.0);

0

Mówisz, że po wypuszczeniu stosu (glPopMatrix) uklad wspolrzednych wraca do poprzedniej pozycji ustalonej publicznie (glTranslatef po za stosem), tak?
Jeżeli tak to zakładam, że stos to prywatna współrzędna, ktora po wypuszczeniu wraca do publicznej wspolrzednej. Kod, ktory na dole ukażę powinien zrobić tak, że
"Szescian 1" leci w prawo, a "Szescian 2" w lewo. W praktyce dzieje się zupelnie inaczej. "Szescian 1" i "Szescian 2" lecą w kierunku ustalonym przez "Szescian 1" (czyli w prawo). Dodam, że moja funkcja renderujaca jest ciagle "pętlująca" sie (glutPostRedisplay).

Kod:

glBegin(GL_QUADS);
		
		glPushMatrix();
			glColor3f(0.0,1.0,0.0);
			glutSolidCube(0.5); //Szescian 1
			glTranslatef(0.01,0.01,0.01);
		glPopMatrix();

		glPushMatrix();
			glColor3f(0.0,0.0,1.0);
			glutSolidCube(0.5); //Szescian 2
			glTranslatef(-0.01,-0.01,-0.01);
		glPopMatrix();
glEnd();
glFlush();
glutSwapBuffers();

glutPostRedisplay(); // Ponowne wykonanie funkcji renderujacej
 
0

OpenGL wykorzystuje 3 rodzaje macierzy: GL_MODELVIEW, GL_PROJECTION, and GL_TEXTURE. Tylko jedna każdego typu jest w danym momencie wykorzystywana. Dodatkowo operacje typu glRotate, glTranslate itd wykonują operacje na aktualnie wybranej macierzy - glRotate/ glTranslate po prostu mnożą aktualnie wybraną macierz przez odpowiednie współczynniki. Stos macierzy to tylko pomocnicza tablica, OpenGL zupełnie jej nie wykorzystuje, jest ona tylko dla wygody programisty. pushMatrix kopiuje obecnie wybraną macierz na stos, popMatrix zastępuje obecną macierz macierzą ze szczytu stosu. Polecam jakiś kurs o matematyce OpenGLowej, np: http://www.songho.ca/

0

Ten kod pomogl mi zrozumiec. Aktualnie jest macierz modelowania (czyli tworzenie brył, ich charakterystyka itp). A Pushmatrix przyczepia sie do xyz(0,0,0) i nastepuje przesuwanie funkcja glTranslatef po czym Popmatrix przywraca uklad wspolrzednych do xyz(0,0,0) uprzednio zaczepionej na stosie (pushmatrix). Ok rozumiem o co chodzi :)

glPushMatrix();
		glTranslatef(-0.7f,0.0f,0.0f);  
		glBegin(GL_TRIANGLES);
			glColor3f(1.0,0.0,0.0);
			glVertex3f( 0.0f, 0.5f, 0.0);
			glVertex3f(-0.5f,-0.5f, 0.0);
			glVertex3f( 0.5f,-0.5f, 0.0);
		glEnd();
	glPopMatrix();

	glPushMatrix();
		glTranslatef(0.3f,0.0f,0.0f);
		glBegin(GL_QUADS);
			glColor3f(1.0,1.0,0.0);
			glVertex3f(-0.2f, 0.2f, 0.0f);
			glVertex3f( 0.2f, 0.2f, 0.0f);
			glVertex3f( 0.2f,-0.2f, 0.0f);
			glVertex3f(-0.2f,-0.2f, 0.0f);
		glEnd();
	glPopMatrix();
 
0

Przyczepia, zaczepia, WTF? OpenGL operuje na współrzędnych jednorodnych i macierzach przekształceń. glRotate albo glTranslate mnoży obecną macierz przez macierz przesunięcia/ obrotu. PushMatrix służy do zrobienia kopii obecnej postaci macierzy. Załóżmy że np masz zamodelować robota z dwiema rękami i tułowiem. Robisz to tak: obracasz najpierw układ całego robota, rysujesz tułów, wrzucasz macierz na stos, ustawiasz układ lewej ręki (np lekki obrót przesunięcie), rysujesz lewą rękę, zdejmujesz kopię macierzy, ustawiasz układ prawej ręki i rysujesz prawą rękę. Sorry za głupi przykład i brak enterów, ale w Chromium 14 Nightly nie da się stawiać enterów na tym forum. Poczytaj to songho.ca od deski do deski to ci się dużo rozjaśni. Ja przed przeczytaniem tej strony też miałem sporo dziwnych wyobrażeń nt OpenGLa.

0

Rozumiem o co chodzi, nie wyjaśniłem profesjonalnie po prostu...

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