„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)
614. sor: 614. sor:


Megjegyzések az algoritmussal kapcsolatban:
Megjegyzések az algoritmussal kapcsolatban:
* Az ernyő (a téglalap) az, amin a kép keletkezik, az viselkedik úgy mint a szemünk. Ha az ernyő helyére állnánk, akkor látnánk ugyan azt a képet, mint amit meg fogunk jeleníteni. Ezért célszerű kezdetben a kamera pozíciója helyett az ernyő pozícióját megadni. A kamera pozíciója amúgy irreleváns, az tetszőlegesen távol lehet a téglalaptól. Ha a távolsággal arányosan növeljük a téglalap méretét, akkor ugyan azt a képet fogjuk kapni.
* 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. A kamera-ernyő távolságot célszerűbb változtatni, mint az ernyő méretét, mert így nem kell eltárolni a FoV-ot. Az arány amit akarunk az ctg(fov/2)
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 - (target-eye).normalize() / tan((fov*M_PI/180)/2)), plane_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 + 0.5f - Screen::width/2) / (Screen::width/2),
       (x - Screen::width/2) / (Screen::width/2),
       (y + 0.5f - Screen::height/2) / (Screen::height/2),  
       (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.