„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
Elkezdtem megírni a 3D-s kocka részt. |
|||
| 1 302. sor: | 1 302. sor: | ||
=== A 3D-s kocka === | === A 3D-s kocka === | ||
* A második házinál mutattam egy glut függvényt, ami egy kockát rajzol ki. Ezt a házikhoz nem lehet használni, inkább írjunk egyet magunknak. | * A második házinál mutattam egy glut függvényt, ami egy kockát rajzol ki. Ezt a házikhoz nem lehet használni, inkább írjunk egyet magunknak. | ||
<br/> <syntaxhighlight lang="c"> | <br/> <syntaxhighlight lang="c"> | ||
| 1 309. sor: | 1 309. sor: | ||
} | } | ||
void | void glQuad(const Vector& a, const Vector& b, const Vector& c, const Vector& d) { | ||
glVertex3f(a); glVertex3f(b); glVertex3f(c); | glVertex3f(a); glVertex3f(b); glVertex3f(c); glVertex3f(d); | ||
} | } | ||
void drawCube(const Vector& size) { | void drawCube(const Vector& size) { | ||
glBegin( | glBegin(GL_QUADS); { | ||
/* (E)-----(A) | /* (E)-----(A) | ||
/| /| | /| /| | ||
| 1 329. sor: | 1 329. sor: | ||
E(-s.x, +s.y, -s.z), F(-s.x, +s.y, +s.z), G(-s.x, -s.y, +s.z), H(-s.x, -s.y, -s.z); | E(-s.x, +s.y, -s.z), F(-s.x, +s.y, +s.z), G(-s.x, -s.y, +s.z), H(-s.x, -s.y, -s.z); | ||
glQuad(A, B, C, D); glQuad(E, H, G, F); glQuad(A, E, F, B); | |||
glQuad(D, C, G, H); glQuad(B, F, G, C); glQuad(A, D, H, E); | |||
} glEnd(); | } glEnd(); | ||
| 1 337. sor: | 1 336. sor: | ||
</syntaxhighlight> <br/> | </syntaxhighlight> <br/> | ||
* Az eredménye: [http://pastebin.com/ | * Az eredménye: [http://pastebin.com/EzY6erh1 Egy négyzet] | ||
http://i.imgur.com/iWkEuQj.png | http://i.imgur.com/iWkEuQj.png | ||
* Na várjunk csak, mi egy kockát rajzoltattunk ki a kamerával, akkor miért egy négyzetet látunk? Azért mert kameránál a "fényképezést", mint transzformációt leíró mátrix (a GL_PROJECTION) egy egységmátrix, így a fényképezés egyszerűen a z koordináta eldobására korlátozódik. A kockának mindössze két oldala van, aminek az XY síkra vett vetülete nem nulla területű, de mindkét vetület egy-egy négyzet. Mi a kettő közül a később kirajzolt oldalnak a vetületét látjuk. | * Na várjunk csak, mi egy kockát rajzoltattunk ki a kamerával, akkor miért egy négyzetet látunk? Azért mert kameránál a "fényképezést", mint transzformációt leíró mátrix (a GL_PROJECTION) egy egységmátrix, így a fényképezés egyszerűen a z koordináta eldobására korlátozódik. A kockának mindössze két oldala van, aminek az XY síkra vett vetülete nem nulla területű, de mindkét vetület egy-egy négyzet. Mi a kettő közül a később kirajzolt oldalnak a vetületét látjuk. | ||
| 1 358. sor: | 1 357. sor: | ||
</syntaxhighlight> <br/> | </syntaxhighlight> <br/> | ||
* Az eredménye: [http://pastebin.com/ | * Az eredménye: [http://pastebin.com/CGsSTUEY Egy teljesen fehér kép] | ||
http://i.imgur.com/2B4efRi.png | http://i.imgur.com/2B4efRi.png | ||
| 1 364. sor: | 1 363. sor: | ||
** Én mondtam, hogy sugárkövetéssel látványosabb eredményeket lehet elérni :D | ** Én mondtam, hogy sugárkövetéssel látványosabb eredményeket lehet elérni :D | ||
* Igazándiból annyira nem meglepő, hogy egy kocka belsejében lévő kamera nem lát mást, mint a kockát, ami jelenleg teljesen fehér. | * Igazándiból annyira nem meglepő, hogy egy kocka belsejében lévő kamera nem lát mást, mint a kockát, ami jelenleg teljesen fehér. | ||
* A megoldás: "Rakjuk át a kamerát a kockán kívülre". Vagyis a világot transzformáljuk. | |||
** A legkényelmesebb módja: <code> gluLookAt(GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ) </code> | |||
*** Hol legyen a kamera, mit nézzen, és melyik legyen a felfele vektor. | |||
* Pl az onInitbe <code> gluLookAt(-3, 2, -2, 0, 0, 0, 0, 1, 0); </code> | |||
http://i.imgur.com/ChgkBk4.png | |||
* Erről már könnyebb elhinni, hogy ez egy kocka. De színezzük át az oldalait különböző színűre. Pl. a felületi normál absz. értéke legyen a normál. | |||
<br/> <syntaxhighlight lang="c"> | |||
void glQuad(const Vector& a, const Vector& b, const Vector& c, const Vector& d) { | |||
Vector normal = cross(b-a, c-a).normalize(); | |||
glColor3f(fabs(normal.x), fabs(normal.y), fabs(normal.z)); | |||
glVertex3f(a); glVertex3f(b); glVertex3f(c); glVertex3f(d); | |||
} | |||
</syntaxhighlight> <br/> | |||
Az eredménye: [http://pastebin.com/YV7RpeRk kocka?] | |||
http://i.imgur.com/o8dUcNz.png | |||
* Ez nem túl meggyőző... Azért nem hasonlít egy kockára, mert oldalak láthatóságát a rajzolás sorrendje döntötte el. De nem azért szenvedtünk a projekciós transzformáció mélység értékével, mert abból az OpenGL meg tudja oldani a láthatóság problémáját? De, csak ezt be kell kapcsolni... | |||
** Az ezt bekapcsoló függvényhívás: <code> glEnable(GL_DEPTH_TEST); </code> | |||
*** Fontos, hogy ha ez be van kapcsolva akkora a képernyőt a <code> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); </code> függvénnyel töröld le. Ha a GL_DEPTH_BUFFER_BIT enumot lehagyod, akkor nem fogsz látni semmit. | |||
* Az eredmény: [http://pastebin.com/wWLR3qt6 Végre egy kocka!] | |||
http://i.imgur.com/z0QQfCD.png | |||
== Utóhang == | == Utóhang == | ||