library: core: add Camera implementation
This commit is contained in:
parent
a4caa456ce
commit
2dd5c675af
69
src/core/camera.rs
Normal file
69
src/core/camera.rs
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
use super::super::{Point, Vector};
|
||||||
|
use super::film::Film;
|
||||||
|
|
||||||
|
/// Represent an abstract camera to observe the scene.
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct Camera {
|
||||||
|
/// Where the camera is set in the scene (i.e: its focal point).
|
||||||
|
origin: Point,
|
||||||
|
/// The film to represent each pixel in the scene.
|
||||||
|
film: Film,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Camera {
|
||||||
|
pub fn new(
|
||||||
|
origin: Point,
|
||||||
|
forward: Vector,
|
||||||
|
up: Vector,
|
||||||
|
fov: f32,
|
||||||
|
dist_to_image: f32,
|
||||||
|
x: u32,
|
||||||
|
y: u32,
|
||||||
|
) -> Camera {
|
||||||
|
let right = forward.cross(&up);
|
||||||
|
let center = origin + forward.normalize() * dist_to_image;
|
||||||
|
let screen_size = 2. * f32::tan(fov / 2.) * dist_to_image;
|
||||||
|
let film = Film::new(x, y, screen_size, center, up, right);
|
||||||
|
Camera { origin, film }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn film(&self) -> &Film {
|
||||||
|
&self.film
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn origin(&self) -> &Point {
|
||||||
|
&self.origin
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn new_works() {
|
||||||
|
let cam = Camera::new(
|
||||||
|
Point::new(-1., 0., 0.),
|
||||||
|
Vector::new(1., 0., 0.),
|
||||||
|
Vector::new(0., 1., 0.),
|
||||||
|
2. * f32::atan(1.), /* 90° in radian */
|
||||||
|
1.,
|
||||||
|
1080,
|
||||||
|
1080,
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
cam,
|
||||||
|
Camera {
|
||||||
|
origin: Point::new(-1., 0., 0.),
|
||||||
|
film: Film::new(
|
||||||
|
1080,
|
||||||
|
1080,
|
||||||
|
2.,
|
||||||
|
Point::origin(),
|
||||||
|
Vector::new(0., 1., 0.),
|
||||||
|
Vector::new(0., 0., 1.),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,6 @@
|
||||||
|
pub mod camera;
|
||||||
|
pub use camera::*;
|
||||||
|
|
||||||
pub mod color;
|
pub mod color;
|
||||||
pub use color::*;
|
pub use color::*;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue