diff --git a/rtiww/src/camera.h b/rtiww/src/camera.h index e70212f..7c38438 100644 --- a/rtiww/src/camera.h +++ b/rtiww/src/camera.h @@ -5,24 +5,27 @@ class camera { public: - camera(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) { 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 focal_length = 1.0; - origin = point3(0, 0, 0); - horizontal = vec3(viewport_width, 0.0, 0.0); - vertical = vec3(0.0, viewport_height, 0.0); - lower_left_corner = - origin - horizontal / 2 - vertical / 2 - vec3(0, 0, focal_length); + auto w = unit_vector(lookfrom - lookat); + auto u = unit_vector(cross(vup, w)); + auto v = cross(w, u); + + origin = lookfrom; + horizontal = viewport_width * u; + vertical = viewport_height * v; + lower_left_corner = origin - horizontal/2 - vertical/2 - w; } - ray get_ray(double u, double v) const { + ray get_ray(double s, double t) const { return ray(origin, - lower_left_corner + u * horizontal + v * vertical - origin); + lower_left_corner + s*horizontal + t*vertical - origin); } private: diff --git a/rtiww/src/main.cpp b/rtiww/src/main.cpp index 303eb59..41cdc37 100644 --- a/rtiww/src/main.cpp +++ b/rtiww/src/main.cpp @@ -59,7 +59,7 @@ int main() { // Camera - camera cam(90, aspect_ratio); + camera cam(point3(-2,2,1), point3(0,0,-1), vec3(0,1,0), 90, aspect_ratio); // Render