Fixed camera
This commit is contained in:
@@ -51,16 +51,12 @@ impl Camera {
|
||||
}
|
||||
|
||||
pub fn cast_rays(&self, width: u32, height: u32) -> Vec<Ray> {
|
||||
//All good
|
||||
let aspect = width as f64 / height as f64;
|
||||
let fovy_radians = (self.fovy as f64).to_radians();
|
||||
let fovh_radians = 2.0 * ((fovy_radians / 2.0).tan() * aspect).atan();
|
||||
// All good
|
||||
let view_direction = (self.target - self.eye).normalize();
|
||||
//All good
|
||||
let hor = view_direction.cross(&self.up).normalize(); // pointing right
|
||||
let vert = view_direction.cross(&hor).normalize(); // pointing up
|
||||
//All good
|
||||
let hor = (view_direction.cross(&self.up)).normalize();
|
||||
let vert = (view_direction.cross(&hor)).normalize();
|
||||
let h_width = 2.0 * (fovh_radians / 2.0).tan();
|
||||
let v_height = 2.0 * (fovy_radians / 2.0).tan();
|
||||
//All good
|
||||
@@ -69,10 +65,13 @@ impl Camera {
|
||||
|
||||
let mut rays = Vec::with_capacity(width as usize * height as usize);
|
||||
|
||||
for j in 0..height {
|
||||
for i in 0..width {
|
||||
let horizontal = (i as f32 - width as f32 / 2.0) * (d_hor_vec);
|
||||
let vertical = (j as f32 - height as f32 / 2.0) * (d_vert_vec);
|
||||
let half_w = width as i32 / 2;
|
||||
let half_h = height as i32 / 2;
|
||||
|
||||
for j in 0..height as i32 {
|
||||
for i in 0..width as i32 {
|
||||
let horizontal = (i - half_w) as f32 * (d_hor_vec);
|
||||
let vertical = (-j + half_h) as f32 * (d_vert_vec);
|
||||
|
||||
let direction = view_direction + horizontal + vertical;
|
||||
let ray = Ray::new(self.eye, Unit::new_normalize(direction));
|
||||
@@ -86,24 +85,25 @@ impl Camera {
|
||||
let aspect = width as f64 / height as f64;
|
||||
let fovy_radians = (self.fovy as f64).to_radians();
|
||||
let fovh_radians = 2.0 * ((fovy_radians / 2.0).tan() * aspect).atan();
|
||||
let view_direction = (self.target - self.eye).normalize(); // Normalize the view direction vector
|
||||
let hor = view_direction.cross(&self.up).normalize(); // pointing right
|
||||
let vert = view_direction.cross(&hor).normalize(); // pointing up
|
||||
let view_direction = (self.target - self.eye).normalize();
|
||||
let hor = (view_direction.cross(&self.up)).normalize();
|
||||
let vert = (view_direction.cross(&hor)).normalize();
|
||||
let h_width = 2.0 * (fovh_radians / 2.0).tan();
|
||||
let v_height = 2.0 * (fovy_radians / 2.0).tan();
|
||||
//All good
|
||||
let d_hor_vec = hor * (h_width / width as f64) as f32;
|
||||
let d_vert_vec = vert * (v_height / height as f64) as f32;
|
||||
|
||||
// Calculate the offsets for the pixel's position on the image plane
|
||||
let horizontal = ((x as f32 / width as f32) - 0.5) * h_width as f32;
|
||||
let vertical = ((y as f32 / height as f32) - 0.5) * v_height as f32;
|
||||
let half_w = width as i32 / 2;
|
||||
let half_h = height as i32 / 2;
|
||||
|
||||
// Calculate the ray direction by summing up the components
|
||||
let direction = Unit::new_normalize(
|
||||
view_direction + (horizontal * d_hor_vec) + (vertical * d_vert_vec),
|
||||
);
|
||||
let horizontal = (x as i32 - half_w) as f32 * (d_hor_vec);
|
||||
let vertical = (-(y as i32) + half_h) as f32 * (d_vert_vec);
|
||||
|
||||
Ray::new(self.eye, direction)
|
||||
let direction = view_direction + horizontal + vertical;
|
||||
let ray = Ray::new(self.eye, Unit::new_normalize(direction));
|
||||
|
||||
Ray::new(self.eye, Unit::new_normalize(direction))
|
||||
}
|
||||
|
||||
pub fn set_position(&mut self, eye: Point3<f32>) {
|
||||
|
||||
Reference in New Issue
Block a user