„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
| (7 közbenső módosítás, amit 2 másik szerkesztő végzett, nincs mutatva) | |||
| 100. sor: | 100. sor: | ||
glVertex2f(center_x, center_y); | glVertex2f(center_x, center_y); | ||
for(int i = 0; i < | for(int i = 0; i < CIRCLE_RESOLUTION; i++) { | ||
float angle = float(i) / CIRCLE_RESOLUTION * 2.0f * M_PI; | float angle = float(i) / CIRCLE_RESOLUTION * 2.0f * M_PI; | ||
// Itt a kor paramtetrikus alakjat hasznaljuk: x = x0 + r*cos(t), y = y0 + r * sin(t) | // Itt a kor paramtetrikus alakjat hasznaljuk: x = x0 + r*cos(t), y = y0 + r * sin(t) | ||
| 114. sor: | 114. sor: | ||
glVertex2f(center_x, center_y); | glVertex2f(center_x, center_y); | ||
for(int i = 0; i < | for(int i = 0; i < CIRCLE_RESOLUTION; i++) { | ||
float angle = float(i) / CIRCLE_RESOLUTION * 2.0f * M_PI; | float angle = float(i) / CIRCLE_RESOLUTION * 2.0f * M_PI; | ||
glColor3f(0.0f, 0.5f + 0.5f*cos(angle), 0.5f + 0.5f*sin(angle)); | glColor3f(0.0f, 0.5f + 0.5f*cos(angle), 0.5f + 0.5f*sin(angle)); | ||
| 137. sor: | 137. sor: | ||
http://i.imgur.com/6yfh7q2.png | http://i.imgur.com/6yfh7q2.png | ||
=== Eseménykezelés === | === Eseménykezelés === | ||
| 590. sor: | 589. sor: | ||
* Azt is tudnunk kell, hogy melyik iránynak felel meg a felfele ("What's up?"). Kódban pl nevezzük <code>up</code>-nak. | * Azt is tudnunk kell, hogy melyik iránynak felel meg a felfele ("What's up?"). Kódban pl nevezzük <code>up</code>-nak. | ||
* Tegyük fel, hogy téglalap (vagy sík) egységnyi távolságra van a kamerától. Ekkora annak a középpontja: <code>pos + fwd</code>. | * Tegyük fel, hogy téglalap (vagy sík) egységnyi távolságra van a kamerától. Ekkora annak a középpontja: <code>pos + fwd</code>. | ||
* Tudnunk kell még, hogy melyik irány van jobbra. Ezt az előre és a felfele pozícióból ki tudjuk számolni: <code>right = cross(fwd, up)</code> | * Tudnunk kell még, hogy melyik irány van jobbra. Ezt az előre és a felfele pozícióból ki tudjuk számolni: <code>right = cross(fwd, up) // a cross-product a vektor szorzat angolul, a dot-product pedig a skalár szorzat. </code> | ||
* A felfele vektor amit megadtunk nem biztos, hogy merőleges az előre vektorra, pedig nekünk olyanra van szükségünk. Pl: ha rézsútosan előre és lefele nézünk, de az 'up' vektor az ég fele mutat. Ez valójában nem baj, mert a jobbra és előre vektor ismeretében már ki tudjuk számolni a pontos felfele vektort: <code>up = cross(right, fwd)</code>. | * A felfele vektor amit megadtunk nem biztos, hogy merőleges az előre vektorra, pedig nekünk olyanra van szükségünk. Pl: ha rézsútosan előre és lefele nézünk, de az 'up' vektor az ég fele mutat. Ez valójában nem baj, mert a jobbra és előre vektor ismeretében már ki tudjuk számolni a pontos felfele vektort: <code>up = cross(right, fwd)</code>. | ||
* Ha ezek megvannak, akkor ki kell tudnunk számolni, hogy egy (x, y) koordinátájú pixelnek a téglalap (ami most egy 2 egység oldalhosszúságú négyzet) melyik része felel meg. Ezt így tehetjük meg: | * Ha ezek megvannak, akkor ki kell tudnunk számolni, hogy egy (x, y) koordinátájú pixelnek a téglalap (ami most egy 2 egység oldalhosszúságú négyzet) melyik része felel meg. Ezt így tehetjük meg: | ||
| 596. sor: | 595. sor: | ||
<br/> <syntaxhighlight lang="c"> | <br/> <syntaxhighlight lang="c"> | ||
Vector pos_on_plane = Vector( | Vector pos_on_plane = Vector( | ||
(x | (x - Screen::width/2) / (Screen::width/2), | ||
(y | (y - Screen::height/2) / (Screen::height/2), | ||
0 | 0 | ||
); | ); | ||
| 651. sor: | 650. sor: | ||
void capturePixel(float x, float y) { | void capturePixel(float x, float y) { | ||
Vector pos_on_plane = Vector( | Vector pos_on_plane = Vector( | ||
(x - Screen::width/2) / (Screen::width/2), | (x + 0.5f - Screen::width/2) / (Screen::width/2), | ||
(y - Screen::height/2) / (Screen::height/2), | (y + 0.5f - Screen::height/2) / (Screen::height/2), | ||
0 | 0 | ||
); | ); | ||
| 1 095. sor: | 1 094. sor: | ||
<br/> <syntaxhighlight lang="c"> | <br/> <syntaxhighlight lang="c"> | ||
x = max(0, | x = max(0, InputLuminance-0.004); | ||
OutputLuminance = (x*(6.2*x+0.5))/(x*(6.2*x+1.7)+0.06); | |||
</syntaxhighlight> <br/> | </syntaxhighlight> <br/> | ||
| 1 497. sor: | 1 496. sor: | ||
Példaprogram: ''<Törölve, túl sokan másolták>'' | Példaprogram: ''<Törölve, túl sokan másolták>'' | ||
A korábbi jelenet | A korábbi jelenet kétirányú (bal oldalt) és csak globális (jobb oldalt) megvilágítással, mindkét esetben 500 000 fotonnal | ||
{| | {| | ||
|- | |- | ||
| 1 815. sor: | 1 814. sor: | ||
http://i.imgur.com/iZJlFr9.gif | http://i.imgur.com/iZJlFr9.gif | ||
* A megvilágítást közvetlenül a setCamera() függvény után állítjuk be. Ekkora a glLightfv-ben megadott pozíció a világ koordináta-rendszerben lesz értelmezve, és a statikus objektumoknak "mindig ugyanaz oldala lesz fényes". Ezt általában akkor szoktuk használni, ha a fényforrás a jelentben egy helyben marad. | * A megvilágítást közvetlenül a setCamera() függvény után állítjuk be. Ekkora a glLightfv-ben megadott pozíció a világ koordináta-rendszerben lesz értelmezve, és a statikus objektumoknak "mindig ugyanaz az oldala lesz fényes". Ezt általában akkor szoktuk használni, ha a fényforrás a jelentben egy helyben marad. | ||
http://i.imgur.com/cUPVzeT.gif | http://i.imgur.com/cUPVzeT.gif | ||
| 2 190. sor: | 2 189. sor: | ||
Kétféle input érdekel minket, a billentyűlenyomások (W,A,S,D), és az egér mozgatása (úgy, hogy közbe az egyik egérgomb le van nyomva). | Kétféle input érdekel minket, a billentyűlenyomások (W,A,S,D), és az egér mozgatása (úgy, hogy közbe az egyik egérgomb le van nyomva). | ||
A billentyűlenyomásokat nem kezelhetjük egyszerűen az onKeyboard-ban, ez akkor generál eseményeket, amikor egy karaktert begépelnénk, ami pl megtörténik először a billentyű lenyomásakor, aztán jelentős ideig (kb. 0.3 - 0.5 sec) nem generálódik újabb esemény, majd után másodpercenként kb. 10-20 karakterbeütés-t generál. | A billentyűlenyomásokat nem kezelhetjük egyszerűen az onKeyboard-ban, ez akkor generál eseményeket, amikor egy karaktert begépelnénk, ami pl megtörténik először a billentyű lenyomásakor, aztán jelentős ideig (kb. 0.3 - 0.5 sec) nem generálódik újabb esemény, majd után másodpercenként kb. 10-20 karakterbeütés-t generál. Ez pl egy karakter irányításához teljesen használhatatlan, helyette inkább tároljuk el, hogy az egyes billentyűk lenyomott állapotban vannak-e. | ||
<br/> <syntaxhighlight lang="c"> | <br/> <syntaxhighlight lang="c"> | ||
| 2 319. sor: | 2 318. sor: | ||
Az én implementációim: [[Média:Grafpp4_kamera.cpp|Kamera]] | Az én implementációim: [[Média:Grafpp4_kamera.cpp|Kamera]] | ||
[[ | [[File:Graftutorial_kamera_anim.gif]] | ||
== Utóhang == | == Utóhang == | ||