„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés

Rohamcsiga (vitalap | szerkesztései)
Rohamcsiga (vitalap | szerkesztései)
Hozzáadtam a transzformációk részt. A második házihoz szükséges elmélet
267. sor: 267. sor:
== A második házihoz szükséges elmélet ==
== A második házihoz szükséges elmélet ==


=== Koordináta rendszerek, transzformációk ===
=== Koordináta rendszerek ===
* Az első háziba valószínűleg feltűnt, hogy a pontok NDC (normalizált eszköz koordináta) megadása nem túl kényelmes, még akkor se ha, a világnak mindig ugyan azt a részét nézzük. De mit tegyük akkor, ha a képzeletbeli kamera amivel "lefényképezzük" a jelenetet mozoghat, sőt akár még forghat is.
* Az első háziba valószínűleg feltűnt, hogy a pontok NDC (normalizált eszköz koordináta) megadása nem túl kényelmes, még akkor se ha, a világnak mindig ugyan azt a részét nézzük. De mit tegyük akkor, ha a képzeletbeli kamera amivel "lefényképezzük" a jelenetet mozoghat, sőt akár még forghat is.
* Az OpenGL kitalálónak az ötlete az volt erre, hogy a kamera mindig maradjon egyhelyben, de ha pl. balra akarnánk forgatni, akkor helyette inkább a világ forogjon jobbra, a kamera maradj ugyanott, és ezzel ugyan azt a hatást érjük el. Persze nem kell minden egyes pontot nekünk elforgatni, ezt rábízhatjuk az OpenGL-re is, hogy mindig mielőtt rajzolna, azelőtt végezzen el valamilyen transzformációt a pontokat amiket kapott.
* Az OpenGL kitalálónak az ötlete az volt erre, hogy a kamera mindig maradjon egyhelyben, de ha pl. balra akarnánk forgatni, akkor helyette inkább a világ forogjon jobbra, a kamera maradj ugyanott, és ezzel ugyan azt a hatást érjük el. Persze nem kell minden egyes pontot nekünk elforgatni, ezt rábízhatjuk az OpenGL-re is, hogy mindig mielőtt rajzolna, azelőtt végezzen el valamilyen transzformációt a pontokat amiket kapott.
281. sor: 281. sor:
// akarjuk módosítani a transzformációs mátrix műveletekkel.
// akarjuk módosítani a transzformációs mátrix műveletekkel.
glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_PROJECTION);
// Egység mátrixot töltük be a jelenlegi vetítési mátrix helyére.  
// Egység mátrixot töltük be a jelenleg módosítható
// mátrix helyére (ez a projekciós mátrix).  
glLoadIdentity();  
glLoadIdentity();  
// Ez egy olyan merőleges (Orthogonális) vetítés, aminek eredménye képpen a karakter  
// Ez egy olyan merőleges (Orthogonális) vetítés mátrixát "írja be" a GL_PROJECTION-be,  
// az x tengely mentén középen lesz, és 10 egység (méter) széles részt látunk a világból
// aminek eredménye képpen a karakter az x tengely mentén középen lesz, és 10 egység  
// míg az y tengely mentén a képernyő alsó egy ötödében lesz, és itt is 10 egység magas  
// (méter) széles részt látunk a világból míg az y tengely mentén a képernyő alsó egy  
// részt látunk.
// ötödében lesz, és itt is 10 egység magas részt látunk. Fontos megjegyezni, hogy ez
// csak akkor működik, ha a GL_PROJECTION előtte egység mátrix volt!
gluOrtho2D(  
gluOrtho2D(  
   stickman.pos.x - 5, stickman.pos.x + 5,
   stickman.pos.x - 5, stickman.pos.x + 5,
297. sor: 299. sor:
http://i.imgur.com/S3m5Lmv.gif
http://i.imgur.com/S3m5Lmv.gif
</div>
</div>
=== Transzformációk ===
* GL_MODELVIEW egyik legfontosabb használata, hogy segítségével könyebben tudjuk elhelyezni az objektumokat a világban. Például ha van egy összetett, mondjuk 10 000 háromszögből álló alakzatunk, akkor annak elforgatását manuálisan úgy tudnánk megoldani, hogy az alakzat összes pontján elvégzünk valami undorító trigunometrikus képletet. Egy másik lehetőség, hogy a GL_MODELVIEW segítségével az egész világot elforgatjuk az ellenkező irányba, kirajzoljuk az alakzatot normál állapotában, majd visszaforgatjuk a világot. Ez első ránézésre bonyolultabbnak tűnik, de mindössze 2 sor kód.
* A világ transzformálásához használható függvények:
** <code> glTranslatef(GLfloat x, GLfloat y, GLfloat z); </code>
** <code> glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); </code>
** <code> glScalef(GLfloat x, GLfloat y, GLfloat z); </code>
* A projekciós mátrixot állító függvényekkel ellentétben, ezeket akkor szoktuk használni, ha a modellezési mátrix nem egységmátrix.
* Ezen függvényeknek tetszőleges kombinációját lehet használni, de a sorrend nem mindegy.
* Egy transzformáció meghívásakor a transzf mátrix hozzászorzódik a GL_MODELVIEW mátrixhoz (jobbról). Emlékeztető: a mátrix szorzás nem asszociatív.
* A transzformációk fordított sorrendben fejtik ki hatásukat, mint ahogy meghívjuk őket, de ez így intuitív, így haladhatunk a hierarhiában föntről lefele, ha nem így lenne, akkor pl. egy autó kirajzolásánál, azzal kéne kezdenünk, hogy megmondjuk, hogy a dísztárcsa a kerékhez képest hogy helyezkedik el, és csak a legvégén mondhatnánk meg, hogy az autó egyáltalán hol van.
* [http://pastebin.com/0UiK3fVa Példa a transzformációk sorrendjére:]
** glTranslatef(2.7f, -3.1f, 0.0f);
** glRotatef(67, 0, 0, 1);
** glScalef(2, 2.5, 1);
Ami a koordinátarendszerrel történik:
<div style="text-align:left;margin:0px auto;">
http://i.imgur.com/gUqk4pi.gif
</div>
- Intuitív, pontosan az történik, mint amit a kódról első ránézésre hinnénk, hogy csinál, az origó a transzformáció után a (2.7, -3.1) pontba kerül, a nagyítás az x tengely mentén 2, az y tengely mentén 2.5. <br/> <br/>
* [http://pastebin.com/Hn9nfGwb Egy másik lehetséges sorrend:]
** glScalef(2, 2.5, 1)
** glRotatef(67, 0, 0, 1);
** glTranslatef(2.7f, -3.1f, 0.0f);
Ami a koordinátarendszerrel történik:
<div style="text-align:left;margin:0px auto;">
http://i.imgur.com/XQcsrHs.gif
</div>
- Egyáltalán nem intuitív, az origó a (7.817, 3.185) pontba kerül, és a két tengely nagyítása 2.084 és 2.43. Ezeknek az értékeknek semmi köze a kódban szereplő konstansokhoz!! <br/> <br/>


== Régi wikiről áthozott rész, frissitésre szorul ==
== Régi wikiről áthozott rész, frissitésre szorul ==