add Camerax2

This commit is contained in:
dengqn 2025-08-03 15:28:24 +08:00
parent 59b169507c
commit 8c58296849
2 changed files with 29 additions and 19 deletions

View File

@ -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

View File

@ -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,
}
/*