Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OpenGL] Jak to jest z tymi macierzami?

Ostatnio zmodyfikowano 2011-04-06 01:56
Autor Wiadomość
albatross201
Temat założony przez niniejszego użytkownika
[OpenGL] Jak to jest z tymi macierzami?
» 2011-04-05 22:35:52
Witam. Wycztałem że aby pkazać kilka obiektów wkładamy wszystko na stos macierzy modelowania. Ale co zrobić gdy np. jeden obiekt mam obrocony względem jakiejś osi, lub o ileś stopni...wtedy wszystko mi się obraca co włoże do tej macierzy. Czy tutaj chodzi o to że jak tworze jakiś obiekt z kilu elementów to robie ten stos i tak sklejam te obiekty, a gdy chce nowy obiekt to ponownie pisze
void glPushMatrix( void )
//kolejny obiekt
void glPopMatrix( void )
??
P-30341
dmx81
» 2011-04-06 01:56:40
C/C++
glLoadIdentity(); // "wyzerowane" wszytskie zmiany
glPushMatrix(); //zapamietane ustawienia
rysujObiekt1(); //rysujesz swoj obiekt
glPopMatrix(); /*powrot do stanu poprzedniego - wyzerowanego. w tym przypadku nie bylo przeksztalcen, wiec nie bylo konieczne uzywanie stosu*/
glPushMatrix(); //zapamietane - patrzysz na wprost w jakis PUNKT1
glRotatef( kat1, 0, 1, 0 ); //obrot o kat (tak jakbys sie obrocil patrzac w innym kierunku, na jakis PUNKT2)
glTranslatef( 0, 0, - 2 ) // idziesz w glab ekranu przed siebie w kiedunku PUNKT2 (idziesz pod katem w stosunku do PUNKT1)
rysujObiekt1(); /*rysujesz obiekt - na wprost ciebie - nie obrocony o zaden kat teraz, stoi dokladnie przed toba w PUNKCIE2
twoja poczatkowa pozycje zapamietales przez wrzucenie jej na stos - aby wrocic do poczatkowej pozycji musialbys wykonac wszytsko w odwrotnej kolejnosci, a wiec*/
glTranslatef( 0, 0, 2 ); //2 "kroki" w tyl od odbiektu, wciaz patrzysz na PUNKT2
glRotatef( - kat, 0, 1, 0 ); //odwroc sie tak, aby patrzyc na wprost, jak na poczatku na PUNKT1
/*to byly proste przeksztalcenia, pamietanie ich w ilosci powyzej np 10 jest juz uciazliwe dla jednego obiektu, a majac ich kilkadziesiat...set...? dlatego teraz glPopMatrix() przywraca nam dokladnie stan sprzed przeksztalcen
teraz patrzysz na wprost PUNKTU1, a obiekt narysowany byl na wprost ciebie, kiedy byles obrocony pod katem, wiec jesli wrociles do stanu pierwotnego - obiekt ten jest pod katem - zgadza sie?*/

jakbys nie wrocil do stanu poprzedniego, ale rysowal dalej, to rysowalbys wciaz pod tym katem, ewentualnie bys dokladal kolejne przeksztalcenia.
wyobraz sobie, ze stoisz na srodku pokoju, patrzysz w okreslone miejsce - to bedzie twoj stan wyjsciowy.
idziesz 2 kroki, obracasz sie (translate, pozniej rotate), kladziesz pudlo kartonowe, odwracasz sie spowrotem, cofasz sie spowrotem - jestes w miejscu poczatkowym - jak widzisz karton? oddalony na wprost, odwrocony pod katem...

jestes w tym samym miejscu - robisz obrot, pozniej 2 kroki do przodu - kladziesz karton, cofasz sie, odracasz spowrotem do miejsca pocaatkowego - co widzisz ? karton, ale nie na wprost, lecz pod pewnym katem,

dowodzi to tego, ze trzeba takze uwazac na kolejnosc przeksztalcen, zwlaszcza rotacji i przemieszczenia

dodatkowo, bedac przy kartonie, w tym miejscu dajac
glPushMatrix()
 zapamietasz wlasnie to miejsce, wiec po tym wywolanie
glPopMatrix
 cofnie cie do miejsca przy kartonie, dopiero kolejne do punktu wyjscia
P-30345
« 1 »
  Strona 1 z 1