diff --git a/rtiww/src/camera.h b/rtiww/src/camera.h index 7c38438..ceb0b7d 100644 --- a/rtiww/src/camera.h +++ b/rtiww/src/camera.h @@ -5,34 +5,42 @@ class camera { public: - camera(point3 lookfrom, point3 lookat, vec3 vup, double vfov /*vertical field-of-view in degrees*/, - double aspect_ratio) { + camera(point3 lookfrom, point3 lookat, vec3 vup, + double vfov, // vertical field-of-view in degrees + double aspect_ratio, double aperture, double focus_dist) { - auto theta = degrees_to_radians(vfov); - auto h = tan(theta / 2); - auto viewport_height = 2.0 * h; - auto viewport_width = aspect_ratio * viewport_height; + auto theta = degrees_to_radians(vfov); + auto h = tan(theta / 2); + auto viewport_height = 2.0 * h; + auto viewport_width = aspect_ratio * viewport_height; - auto w = unit_vector(lookfrom - lookat); - auto u = unit_vector(cross(vup, w)); - auto v = cross(w, u); + w = unit_vector(lookfrom - lookat); + u = unit_vector(cross(vup, w)); + v = cross(w, u); - origin = lookfrom; - horizontal = viewport_width * u; - vertical = viewport_height * v; - lower_left_corner = origin - horizontal/2 - vertical/2 - w; - } + origin = lookfrom; + horizontal = focus_dist * viewport_width * u; + vertical = focus_dist * viewport_height * v; + lower_left_corner = origin - horizontal / 2 - vertical / 2 - focus_dist * w; - ray get_ray(double s, double t) const { - return ray(origin, - lower_left_corner + s*horizontal + t*vertical - origin); - } + lens_radius = aperture / 2; + } + + ray get_ray(double s, double t) const { + vec3 rd = lens_radius * random_in_unit_disk(); + vec3 offset = u * rd.x() + v * rd.y(); + + return ray(origin + offset, lower_left_corner + s * horizontal + + t * vertical - origin - offset); + } private: - point3 origin; - point3 lower_left_corner; - vec3 horizontal; - vec3 vertical; + point3 origin; + point3 lower_left_corner; + vec3 horizontal; + vec3 vertical; + vec3 u, v, w; + double lens_radius; }; #endif // CAMERA_H_ diff --git a/rtiww/src/main.cpp b/rtiww/src/main.cpp index 41cdc37..25394c0 100644 --- a/rtiww/src/main.cpp +++ b/rtiww/src/main.cpp @@ -59,7 +59,12 @@ int main() { // Camera - camera cam(point3(-2,2,1), point3(0,0,-1), vec3(0,1,0), 90, aspect_ratio); + point3 lookfrom(3, 3, 2); + point3 lookat(0, 0, -1); + vec3 vup(0, 1, 0); + auto dist_to_focus = (lookfrom - lookat).length(); + auto aperture = 2.0; + camera cam(lookfrom, lookat, vup, 20, aspect_ratio, aperture, dist_to_focus); // Render diff --git a/rtiww/src/vec3.h b/rtiww/src/vec3.h index 869cc68..2091bac 100644 --- a/rtiww/src/vec3.h +++ b/rtiww/src/vec3.h @@ -131,4 +131,13 @@ vec3 refract(const vec3 &v, const vec3 &n, double etai_over_etat) { return r_out_perp + r_out_parallel; } +vec3 random_in_unit_disk() { + while (true) { + auto p = vec3(random_double(-1, 1), random_double(-1, 1), 0); + if (p.length_squared() >= 1) + continue; + return p; + } +} + #endif // RTIWW_VEC3_H