Movable camera
All checks were successful
CI / test (push) Successful in 29s
Render Image / render (push) Successful in 26s

This commit is contained in:
k 2026-04-13 14:51:19 -04:00
parent 33f3c5fab1
commit b73b1209e4
2 changed files with 17 additions and 10 deletions

View file

@ -33,7 +33,7 @@ fn main() {
let m = Metal::new(Vec3::new(0.8, 0.6, 0.2), 0.5); let m = Metal::new(Vec3::new(0.8, 0.6, 0.2), 0.5);
let right_m: Arc <dyn Material> = Arc::new(m); let right_m: Arc <dyn Material> = Arc::new(m);
let mut camera = Camera::new(aspect_ratio,image_width,focal_length,viewport_height,camera_center); let mut camera = Camera::new(aspect_ratio,image_width,focal_length,Point3::new(-2.0,2.0,1.0),Point3::new(0.0,0.0,-1.0),90.0);
let mut world = World::new(); let mut world = World::new();
world.add(Sphere::new(0.5, Point3::new(0.0, 0.0, -1.0),center_m)); world.add(Sphere::new(0.5, Point3::new(0.0, 0.0, -1.0),center_m));
world.add(Sphere::new(0.5, Point3::new(-1.0, 0.0, -1.0),left_m)); world.add(Sphere::new(0.5, Point3::new(-1.0, 0.0, -1.0),left_m));

View file

@ -46,27 +46,34 @@ pub struct Camera {
} }
impl Camera { impl Camera {
pub fn new(aspect_ratio:f64,image_width: i32, focal_length:f64, viewport_height:f64, camera_center: Point3) -> Self{ pub fn new(aspect_ratio:f64,image_width: i32, focal_length:f64, look_from: Point3, look_at: Point3,fov:f64) -> Self{
let image_height = (image_width as f64 / aspect_ratio) as i32; let image_height = (image_width as f64 / aspect_ratio) as i32;
let theta = (fov as f64).to_radians();
let h = (theta/2.0).tan();
let viewport_height = 2.0 * h * focal_length;
let viewport_width = viewport_height * (image_width as f64 / image_height as f64); let viewport_width = viewport_height * (image_width as f64 / image_height as f64);
let viewport_u = Vec3::new(viewport_width as f64, 0.0, 0.0); let w = (look_from - look_at).to_vec().unit();
let viewport_v = Vec3::new(0.0, -viewport_height as f64, 0.0); let u = Vec3::new(0.0,1.0,0.0).cross(w).unit();
let v = w.cross(u);
let viewport_u = u * viewport_width;
let viewport_v = (v*-1.0)*viewport_height;
let pixel_delta_u = viewport_u / image_width as f64; let pixel_delta_u = viewport_u / image_width as f64;
let pixel_delta_v = viewport_v / image_height as f64; let pixel_delta_v = viewport_v / image_height as f64;
let viewport_upper_left = (camera_center.to_vec() let viewport_upper_left = look_from.to_vec() - (w * focal_length) - viewport_u/2.0 - viewport_v/2.0;
- Vec3::new(0.0, 0.0, focal_length)
- viewport_u / 2.0
- viewport_v / 2.0).to_point();
let pixel00_loc = viewport_upper_left + ((pixel_delta_u + pixel_delta_v) * 0.5).to_point(); let pixel00_loc = (viewport_upper_left + ((pixel_delta_u + pixel_delta_v) * 0.5)).to_point();
let img = Image::new(image_width, image_height); let img = Image::new(image_width, image_height);
Self{img,pixel00_loc,camera_center,pixel_delta_u,pixel_delta_v} Self{img,pixel00_loc,camera_center:look_from,pixel_delta_u,pixel_delta_v}
} }