summaryrefslogtreecommitdiff
path: root/racer-tracer
diff options
context:
space:
mode:
authorSakarias Johansson <sakarias.johansson@goodbyekansas.com>2023-03-08 20:47:02 +0100
committerSakarias Johansson <sakariasjohansson@hotmail.com>2023-03-08 20:54:28 +0100
commit3cabf77da8b9681ed9683fe92c23054d6f49d848 (patch)
treed4731a677faa5b74558b0a3015de29b3c89e9818 /racer-tracer
parent5e87f21e480dbe04fcf6cf95c52e5b98fa3b923c (diff)
downloadracer-tracer-3cabf77da8b9681ed9683fe92c23054d6f49d848.tar.gz
racer-tracer-3cabf77da8b9681ed9683fe92c23054d6f49d848.tar.xz
racer-tracer-3cabf77da8b9681ed9683fe92c23054d6f49d848.zip
🎥 Add support for camera looking at direction.
- Set position of camera. - Set look position of camera. - Set FOV
Diffstat (limited to 'racer-tracer')
-rw-r--r--racer-tracer/src/camera.rs51
-rw-r--r--racer-tracer/src/main.rs11
-rw-r--r--racer-tracer/src/util.rs6
3 files changed, 49 insertions, 19 deletions
diff --git a/racer-tracer/src/camera.rs b/racer-tracer/src/camera.rs
index 45d2919..31c2391 100644
--- a/racer-tracer/src/camera.rs
+++ b/racer-tracer/src/camera.rs
@@ -1,5 +1,6 @@
use crate::image::Image;
use crate::ray::Ray;
+use crate::util::degrees_to_radians;
use crate::vec3::Vec3;
#[derive(Clone)]
@@ -11,35 +12,49 @@ pub struct Camera {
pub horizontal: Vec3,
pub vertical: Vec3,
pub upper_left_corner: Vec3,
+ pub forward: Vec3,
+ pub right: Vec3,
+ pub up: Vec3,
}
impl Camera {
- pub fn new(image: &Image, viewport_height: f64, focal_length: f64) -> Camera {
+ pub fn new(
+ look_from: Vec3,
+ look_at: Vec3,
+ up: Vec3,
+ vfov: f64,
+ image: &Image,
+ focal_length: f64,
+ ) -> Camera {
+ let h = (degrees_to_radians(vfov) / 2.0).tan();
+ let viewport_height = 2.0 * h;
let viewport_width = image.aspect_ratio * viewport_height;
- let origin = Vec3::new(0.0, 0.0, 0.0);
- let horizontal = Vec3::new(viewport_width, 0.0, 0.0);
- let vertical = Vec3::new(0.0, viewport_height, 0.0);
+
+ let forward = (look_from - look_at).unit_vector();
+ let right = up.cross(&forward).unit_vector();
+ let up = forward.cross(&right);
+
+ let horizontal = viewport_width * right;
+ let vertical = viewport_height * up;
+
Camera {
viewport_height,
viewport_width,
focal_length,
- origin,
+ origin: look_from,
horizontal,
vertical,
- upper_left_corner: origin + vertical / 2.0
- - horizontal / 2.0
- - Vec3::new(0.0, 0.0, focal_length),
+ upper_left_corner: look_from + vertical / 2.0 - horizontal / 2.0 - forward,
+ forward,
+ right,
+ up,
}
}
pub fn get_ray(&self, u: f64, v: f64) -> Ray {
- let upper_left_corner = self.origin + self.vertical / 2.0
- - self.horizontal / 2.0
- - Vec3::new(0.0, 0.0, self.focal_length);
-
Ray::new(
self.origin,
- upper_left_corner + u * self.horizontal - v * self.vertical - self.origin,
+ self.upper_left_corner + u * self.horizontal - v * self.vertical - self.origin,
)
}
@@ -47,11 +62,17 @@ impl Camera {
// TODO: Use forward facing vector
pub fn go_forward(&mut self, go: f64) {
- self.origin += Vec3::new(0.0, 0.0, go);
+ self.origin += self.forward * go;
+
+ self.upper_left_corner =
+ self.origin + self.vertical / 2.0 - self.horizontal / 2.0 - self.forward;
}
// TODO: Use right facing vector
pub fn go_right(&mut self, go: f64) {
- self.origin += Vec3::new(go, 0.0, 0.0);
+ self.origin += self.right * go;
+
+ self.upper_left_corner =
+ self.origin + self.vertical / 2.0 - self.horizontal / 2.0 - self.forward;
}
}
diff --git a/racer-tracer/src/main.rs b/racer-tracer/src/main.rs
index aa1d974..5612649 100644
--- a/racer-tracer/src/main.rs
+++ b/racer-tracer/src/main.rs
@@ -25,6 +25,8 @@ use minifb::{Key, Window, WindowOptions};
use sha2::{Digest, Sha256};
use synchronoise::SignalEvent;
+use crate::vec3::Vec3;
+
use crate::{
camera::Camera,
config::{Args, Config},
@@ -36,7 +38,14 @@ use crate::{
fn run(config: Config) -> Result<(), TracerError> {
let image = image::Image::new(config.screen.width, config.screen.height);
let screen_buffer: RwLock<Vec<u32>> = RwLock::new(vec![0; image.width * image.height]);
- let camera = RwLock::new(Camera::new(&image, 2.0, 1.0));
+ let camera = RwLock::new(Camera::new(
+ Vec3::new(-2.0, 2.0, 1.0),
+ Vec3::new(0.0, 0.0, -1.0),
+ Vec3::new(0.0, 1.0, 0.0),
+ 90.0,
+ &image,
+ 1.0,
+ ));
let scene: Scene = config
.scene
.ok_or(TracerError::NoScene())
diff --git a/racer-tracer/src/util.rs b/racer-tracer/src/util.rs
index dc39e1c..2f04567 100644
--- a/racer-tracer/src/util.rs
+++ b/racer-tracer/src/util.rs
@@ -1,9 +1,9 @@
use rand::Rng;
-/*
+
// For later use
-fn degrees_to_radians(degrees: f64) -> f64 {
+pub fn degrees_to_radians(degrees: f64) -> f64 {
degrees * std::f64::consts::PI / 180.0
-}*/
+}
pub fn random_double() -> f64 {
let mut rng = rand::thread_rng();