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

Rohamcsiga (vitalap | szerkesztései)
Elkezdtem megírni a 3D-s kocka részt.
Rohamcsiga (vitalap | szerkesztései)
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. Itt kézenfekvő lenne quadokat használni, de én a háromszögeket jobban szeretem (meg amúgy az OpenGL is) :)
* 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 glTriangle(const Vector& a, const Vector& b, const Vector& c) {
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(GL_TRIANGLES); {
   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);


     glTriangle(A, D, B);  glTriangle(C, B, D); glTriangle(A, B, E); glTriangle(F, E, B);
     glQuad(A, B, C, D); glQuad(E, H, G, F); glQuad(A, E, F, B);
     glTriangle(B, C, F);  glTriangle(G, F, C); glTriangle(F, G, E); glTriangle(H, E, G);
     glQuad(D, C, G, H); glQuad(B, F, G, C); glQuad(A, D, H, E);
    glTriangle(H, G, D);  glTriangle(C, D, G);  glTriangle(E, H, A);  glTriangle(D, A, H);


   } glEnd();
   } glEnd();
1 337. sor: 1 336. sor:
</syntaxhighlight> <br/>
</syntaxhighlight> <br/>


* Az eredménye: [http://pastebin.com/BJTRSTgm Egy négyzet]
* 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/KVP1YQQs Egy teljesen fehér kép]
* 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 ==