Fixing aspect ratio and fov

This commit is contained in:
STP
2023-11-18 13:14:56 -05:00
parent 9866679dc7
commit ddb4603d07
4 changed files with 39 additions and 17 deletions

View File

@@ -92,6 +92,9 @@ impl Camera {
let direction = view_direction + horizontal + vertical; let direction = view_direction + horizontal + vertical;
let ray = Ray::new(self.eye, Unit::new_normalize(direction)); let ray = Ray::new(self.eye, Unit::new_normalize(direction));
if i == j {
println!("{}", ray.b.into_inner());
}
rays.push(ray); rays.push(ray);
} }
} }

View File

@@ -204,36 +204,56 @@ fn main() -> Result<(), Error> {
let event_loop = EventLoop::new(); let event_loop = EventLoop::new();
//SCENE //SCENE
//Camera //Camera
let eye = Point3::new(10.0, 10.0, 10.0); let eye = Point3::new(100.0, 100.0, 100.0);
let target = Point3::new(0.0, 0.0, 0.0); let target = Point3::new(0.0, 0.0, 0.0);
let up = Vector3::new(0.0, 1.0, 0.0); let up = Vector3::new(0.0, 1.0, 0.0);
let camera = Camera::new( let camera = Camera::new(
eye, eye,
target, target,
up, up,
120.0, 70.0,
(START_WIDTH as f32 / START_HEIGHT as f32) as f32, (START_WIDTH as f32 / START_HEIGHT as f32) as f32,
); );
// SETUP PRIMITIVES // SETUP PRIMITIVES
let magenta = Arc::new(Material::magenta()); let magenta = Arc::new(Material::magenta());
let blue = Arc::new(Material::blue()); let blue = Arc::new(Material::blue());
let turquoise = Arc::new(Material::turquoise()); let turquoise = Arc::new(Material::turquoise());
let red = Arc::new(Material::red());
// let sphere = Arc::new(Sphere::unit(magenta.clone())); // let sphere = Arc::new(Sphere::unit(magenta.clone()));
// primitives.push(sphere.clone()); // primitives.push(sphere.clone());
// let cone = Arc::new(Cone::new(0.25, 1.0, -0.5, turquoise.clone())); // let cone = Arc::new(Cone::new(0.25, 1.0, -0.5, turquoise.clone()));
// primitives.push(cone.clone()); // primitives.push(cone.clone());
let mut primitives: Vec<Box<dyn Primitive>> = Vec::new(); let mut primitives: Vec<Box<dyn Primitive>> = Vec::new();
let cube = Box::new(Sphere::unit(blue.clone())); let cube = Box::new(Cube::unit(turquoise.clone()));
let sphere = Box::new(Sphere::new(Point3::new(0.0, 4.0, 0.0), 1.0, red.clone()));
let cone = Box::new(Circle::new(
Point3::new(0.0, -3.0, 0.0),
2.0,
Vector3::new(0.0, 1.0, 0.0),
magenta.clone(),
));
primitives.push(cube); primitives.push(cube);
primitives.push(sphere);
primitives.push(cone);
//Lights //Lights
let light_pos = Point3::new(10.0, 12.0, 10.0); let light_pos = Point3::new(0.0, 12.0, 4.0);
let light_colour = Vector3::new(1.0, 0.0, 1.0); let light_colour = Vector3::new(0.4, 0.4, 0.6);
let light_falloff = [1.0, 0.00, 0.00]; let light_falloff = [1.0, 0.00, 0.00];
let light = Light::new(light_colour, light_pos, light_falloff); let light = Light::new(light_colour, light_pos, light_falloff);
let light_pos2 = Point3::new(10.0, 12.0, -4.0);
let light_colour2 = Vector3::new(0.4, 0.0, 0.6);
let light_falloff2 = [1.0, 0.00, 0.00];
let light2 = Light::new(light_colour2, light_pos2, light_falloff2);
let ambient_light = Vector3::new(0.0, 0.0, 0.2); let ambient_light = Vector3::new(0.0, 0.0, 0.2);
let scene = Scene::new(primitives, vec![light], vec![camera.clone()], ambient_light); let scene = Scene::new(
primitives,
vec![light, light2],
vec![camera.clone()],
ambient_light,
);
//State //State
let window = { let window = {
let size = LogicalSize::new(START_WIDTH, START_HEIGHT); let size = LogicalSize::new(START_WIDTH, START_HEIGHT);
@@ -253,7 +273,6 @@ fn main() -> Result<(), Error> {
Event::WindowEvent { event, .. } => match event { Event::WindowEvent { event, .. } => match event {
WindowEvent::CloseRequested => { WindowEvent::CloseRequested => {
*control_flow = ControlFlow::Exit; *control_flow = ControlFlow::Exit;
return;
} }
WindowEvent::Resized(size) => { WindowEvent::Resized(size) => {
state.resize(&size); state.resize(&size);

View File

@@ -24,20 +24,20 @@ impl Material {
Material { kd, ks, shininess } Material { kd, ks, shininess }
} }
pub fn turquoise() -> Self { pub fn turquoise() -> Self {
let kd = Vector3::new(0.25, 1.0, 0.7); let kd = Vector3::new(0.25, 0.3, 0.7);
let ks = Vector3::new(0.25, 1.0, 0.7); let ks = Vector3::new(0.25, 0.3, 0.7);
let shininess = 0.5; let shininess = 0.5;
Material { kd, ks, shininess } Material { kd, ks, shininess }
} }
pub fn red() -> Self { pub fn red() -> Self {
let kd = Vector3::new(1.0, 0.0, 0.0); let kd = Vector3::new(0.8, 0.0, 0.3);
let ks = Vector3::new(1.0, 0.0, 0.0); let ks = Vector3::new(0.8, 0.3, 0.0);
let shininess = 0.5; let shininess = 0.5;
Material { kd, ks, shininess } Material { kd, ks, shininess }
} }
pub fn blue() -> Self { pub fn blue() -> Self {
let kd = Vector3::new(0.0, 0.0, 1.0); let kd = Vector3::new(0.0, 0.3, 0.6);
let ks = Vector3::new(0.0, 0.0, 1.0); let ks = Vector3::new(0.3, 0.0, 0.6);
let shininess = 0.5; let shininess = 0.5;
Material { kd, ks, shininess } Material { kd, ks, shininess }
} }
@@ -119,7 +119,7 @@ pub struct Sphere {
} }
impl Sphere { impl Sphere {
fn new(position: Point3<f32>, radius: f32, material: Arc<Material>) -> Self { pub fn new(position: Point3<f32>, radius: f32, material: Arc<Material>) -> Self {
let radius_vec = Vector3::new(radius, radius, radius); let radius_vec = Vector3::new(radius, radius, radius);
let bln = position - radius_vec; let bln = position - radius_vec;
let trf = position + radius_vec; let trf = position + radius_vec;
@@ -186,7 +186,7 @@ impl Primitive for Sphere {
} }
// CIRCLE ----------------------------------------------------------------- // CIRCLE -----------------------------------------------------------------
struct Circle { pub struct Circle {
position: Point3<f32>, position: Point3<f32>,
radius: f32, radius: f32,
normal: Vector3<f32>, normal: Vector3<f32>,
@@ -195,7 +195,7 @@ struct Circle {
} }
impl Circle { impl Circle {
fn new( pub fn new(
position: Point3<f32>, position: Point3<f32>,
radius: f32, radius: f32,
normal: Vector3<f32>, normal: Vector3<f32>,

View File

@@ -12,6 +12,6 @@ impl Ray {
Ray { a, b } Ray { a, b }
} }
pub fn at_t(&self, t: f32) -> Point3<f32> { pub fn at_t(&self, t: f32) -> Point3<f32> {
self.a + self.b.as_ref() * (t + EPSILON) self.a + self.b.into_inner() * (t + EPSILON)
} }
} }