diff --git a/src/camera.rs b/src/camera.rs index 6231c32..f54d38e 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -12,6 +12,22 @@ impl Camera { 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); + // image x--> right + // | + // y + // space: y up , x right , z back, -z front + let viewport_v = Vec3::new(0.0, -viewport_height, 0.0); + // 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 + focal_length - 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; + Camera { image_width, image_height, @@ -20,26 +36,15 @@ impl Camera { viewport_height, camera_center, focal_length, + viewport_u, + viewport_v, + viewport_u_delta, + viewport_v_delta, + viewport_top_left_pixel_center, } } pub fn render(&self, world: &HittableList) -> String { - let viewport_u = Vec3::new(self.viewport_width, 0.0, 0.0); - // image x--> right - // | - // y - // space: y up , x right , z back, -z front - let viewport_v = Vec3::new(0.0, -self.viewport_height, 0.0); - // width per pix - let viewport_u_delta = viewport_u / (self.image_width as f32); - // height per pix - let viewport_v_delta = viewport_v / (self.image_height as f32); - let viewport_top_left_pixel = - self.camera_center + self.focal_length - 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; - let mut img_content = format!("P3\n{} {}\n255\n", self.image_width, self.image_height); for j in 0..self.image_height { @@ -49,9 +54,9 @@ impl Camera { for i in 0..self.image_width { // every pixcel's position - let pixel_center = viewport_top_left_pixel_center - + (i as f32 * viewport_u_delta) - + (j as f32 * viewport_v_delta); + let pixel_center = self.viewport_top_left_pixel_center + + (i as f32 * self.viewport_u_delta) + + (j as f32 * self.viewport_v_delta); // Vector(camera, pixcel) let ray_direction = pixel_center - self.camera_center; // ray diff --git a/src/types_defined.rs b/src/types_defined.rs index 0235af5..a4ee75b 100644 --- a/src/types_defined.rs +++ b/src/types_defined.rs @@ -36,6 +36,11 @@ pub struct Camera { pub viewport_height: f32, pub camera_center: Point, pub focal_length: Vec3, + pub viewport_u: Vec3, + pub viewport_v: Vec3, + pub viewport_u_delta: Vec3, + pub viewport_v_delta: Vec3, + pub viewport_top_left_pixel_center: Vec3, } /*