diff --git a/src/camera.rs b/src/camera.rs index 61d17d3..c9dcf20 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -14,13 +14,15 @@ impl<'a> Camera<'a> { fov: f32, image_width: i32, aspect_ratio: f32, - camera_center: Point, - focal_length: f32, + center: Point, + look_at: Point, + v_up: Vec3, sample_times: i8, reflect_depth: i8, ppm_file_writer: &'a mut PPMWriter> ) -> Self { + let focal_length = (look_at - center).length(); let theta = degrees_to_radians(fov); let h = f32::tan(theta / 2.); @@ -29,18 +31,24 @@ impl<'a> Camera<'a> { let image_height = ((image_width as f32 / aspect_ratio) as i32).max(1); let viewport_width = viewport_height * (image_width as f32 / image_height as f32); - let viewport_u = Vec3::new(viewport_width, 0.0, 0.0); + + let w = (center - look_at).normalize(); + let u = v_up.cross(w).normalize(); + let v = w.cross(u); + + + let viewport_u = viewport_width * u; // image x--> right // | // y // space: y up , x right , z back, -z front - let viewport_v = Vec3::new(0.0, -viewport_height, 0.0); + let viewport_v = viewport_height * (-1. * v); // width per pix let viewport_u_delta = viewport_u / (image_width as f32); // height per pix let viewport_v_delta = viewport_v / (image_height as f32); let viewport_top_left_pixel = - camera_center - Vec3::new(0., 0., focal_length) - viewport_u / 2.0 - viewport_v / 2.0; + center - focal_length * w - viewport_u / 2.0 - viewport_v / 2.0; // padding 0.5* delta u/v let viewport_top_left_pixel_center = viewport_top_left_pixel - viewport_u_delta / 2.0 - viewport_v_delta / 2.0; @@ -51,7 +59,9 @@ impl<'a> Camera<'a> { // aspect_ratio, // viewport_width, // viewport_height, - camera_center, + center, + look_at, + v_up, // focal_length, // viewport_u, // viewport_v, @@ -81,7 +91,7 @@ impl<'a> Camera<'a> { let pix_sample = self.viewport_top_left_pixel_center + (i as f32 + bias.x) * self.viewport_u_delta + (j as f32 + bias.y) * self.viewport_v_delta; - let r = Ray::new(self.camera_center, pix_sample - self.camera_center); + let r = Ray::new(self.center, pix_sample - self.center); let sample_color = self.ray_color(&r, self.reflect_depth, world); color = color + sample_color; } diff --git a/src/main.rs b/src/main.rs index 48bf2f1..d751b23 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,11 +22,11 @@ fn main() { fn camera_render() { - let fov: f32 = 90.; + let fov: f32 = 60.; let scale = 1; let width: i32 = 800/scale; let height: i32 = 600/scale; - let sample_times = 20; + let sample_times = 50; let reflect_depth = 20; @@ -44,8 +44,9 @@ fn camera_render() { fov, width, width as f32 / height as f32, - Point::new(0.0, -0.0, 0.0), - 1.0, + Point::new(-2.0, 0.0, -1.0), + Point::new(0.0, 0.0, -1.0), + Vec3::new(0., 1., 0.), sample_times, reflect_depth, pw diff --git a/src/types_defined.rs b/src/types_defined.rs index ec28bb9..d8c75c9 100644 --- a/src/types_defined.rs +++ b/src/types_defined.rs @@ -1,5 +1,5 @@ use std::{fs::File, io::{BufWriter}}; -use crate::material::{MaterialKind}; +use crate::{material::MaterialKind, vec3}; use crate::ppm_writer::PPMWriter; /* @@ -37,7 +37,9 @@ pub struct Camera<'a> { // pub aspect_ratio: f32, // pub viewport_width: f32, // pub viewport_height: f32, - pub camera_center: Point, + pub center: Point, + pub look_at: Point, + pub v_up: Vec3, // pub focal_length: Vec3, // pub viewport_u: Vec3, // pub viewport_v: Vec3,