„Számítógépes grafika házi feladat tutorial” változatai közötti eltérés
| 614. sor: | 614. sor: | ||
Megjegyzések az algoritmussal kapcsolatban: | Megjegyzések az algoritmussal kapcsolatban: | ||
* Azzal, hogy kijelentettük, hogy téglalap egy 2 egység élhosszúságú négyzet, és egységnyi távolságra van a kamerától, implicit kimondtuk, hogy a kamera látószöge 2*arctg(1) = 90 fok. Egy nem túl arányos rajz arról, hogy ez hogy jött ki: | * Azzal, hogy kijelentettük, hogy téglalap egy 2 egység élhosszúságú négyzet, és egységnyi távolságra van a kamerától, implicit kimondtuk, hogy a kamera látószöge 2*arctg(1) = 90 fok. Egy nem túl arányos rajz arról, hogy ez hogy jött ki: | ||
http://i.imgur.com/gC7f6l1.png | http://i.imgur.com/gC7f6l1.png | ||
De nem biztos, hogy ennyit szeretnénk, úgyhogy a látószög (Field of View - Fov) is legyen inkább paraméter. | De nem biztos, hogy ennyit szeretnénk, úgyhogy a látószög (Field of View - Fov) is legyen inkább paraméter. Én az ernyő méretét fogom a változtatni, de az ernyő-kamera távolság is változtathatnám. Az arány amit akarunk az a tan(fov/2). | ||
* Ha teljesen korrektek akarnánk lenni, akkor fél pixellel el kéne tolni az ernyőt metsző pontokat, hogy azok ne a pixelek bal alsó sarkán keresztül haladjanak át, hanem a közepükön. Bár én szabad szemmel nem látok különbséget ez a változtatás után. | * Ha teljesen korrektek akarnánk lenni, akkor fél pixellel el kéne tolni az ernyőt metsző pontokat, hogy azok ne a pixelek bal alsó sarkán keresztül haladjanak át, hanem a közepükön. Bár én szabad szemmel nem látok különbséget ez a változtatás után. | ||
| 629. sor: | 628. sor: | ||
Camera(float fov, const Vector& eye, const Vector& target, const Vector& plane_up) | Camera(float fov, const Vector& eye, const Vector& target, const Vector& plane_up) | ||
: pos(eye | : pos(eye), plane_pos(eye + (target-eye).normalize()) | ||
{ | { | ||
Vector fwd = (plane_pos - pos).normalize(); | Vector fwd = (plane_pos - pos).normalize(); | ||
right = cross(fwd, plane_up).normalize(); | float plane_half_size = tan((fov*M_PI/180)/2); | ||
up = cross(right, fwd).normalize(); | |||
// A jobbra és felfele vektorokban is lehet tárolni a sík méretét, bár nem szép... | |||
right = plane_half_size * cross(fwd, plane_up).normalize(); | |||
up = plane_half_size * cross(right, fwd).normalize(); | |||
} | } | ||
| 644. sor: | 646. sor: | ||
void capturePixel(float x, float y) { | void capturePixel(float x, float y) { | ||
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 | ||
); | ); | ||
| 656. sor: | 658. sor: | ||
} | } | ||
</syntaxhighlight> <br/> | </syntaxhighlight> <br/> | ||
Megjegyzés: én általában nem ilyen kamerát szoktam használni, de ez ugyan azt az eredményt adja, mint amit a 4. meg 5. háziban fogunk kapni, a gluLookAt() függvény segítségével. | |||
Most már mindent tudunk a sugárkövetésről, azt leszámítva, hogy hogyan kell egy sugarat követni. | Most már mindent tudunk a sugárkövetésről, azt leszámítva, hogy hogyan kell egy sugarat követni. | ||