Movable camera
This commit is contained in:
parent
33f3c5fab1
commit
b73b1209e4
2 changed files with 17 additions and 10 deletions
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue