diff options
| author | Sakarias Johansson <sakarias.johansson@goodbyekansas.com> | 2023-04-14 20:58:23 +0200 |
|---|---|---|
| committer | Sakarias Johansson <sakariasjohansson@hotmail.com> | 2023-04-14 21:17:20 +0200 |
| commit | 8201c8e2a7ff85383ff7606513778253aae7e666 (patch) | |
| tree | ad0175360dc19554c6f11b1a66af210d60418f99 /racer-tracer/src/camera.rs | |
| parent | 0ae6ca062f5936ae6f595f45ca0a78ed049452bc (diff) | |
| download | racer-tracer-main.tar.gz racer-tracer-main.tar.xz racer-tracer-main.zip | |
Before you could only move the position of the camera.
- Add support for turning camera by holding down left mouse.
- Add support for turning camera with arrow keys.
- Add Mouse move callback for key_inputs.
Diffstat (limited to 'racer-tracer/src/camera.rs')
| -rw-r--r-- | racer-tracer/src/camera.rs | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/racer-tracer/src/camera.rs b/racer-tracer/src/camera.rs index e6396e8..1ac2396 100644 --- a/racer-tracer/src/camera.rs +++ b/racer-tracer/src/camera.rs @@ -1,3 +1,5 @@ +use glam::{f32::Vec3 as FVec3, Quat}; + use crate::image::Image; use crate::ray::Ray; use crate::util::{degrees_to_radians, random_in_unit_disk}; @@ -14,6 +16,7 @@ pub struct Camera { pub forward: Vec3, pub right: Vec3, pub up: Vec3, + pub scene_up: Vec3, pub lens_radius: f64, pub focus_distance: f64, } @@ -22,7 +25,7 @@ impl Camera { pub fn new( look_from: Vec3, look_at: Vec3, - up: Vec3, + scene_up: Vec3, vfov: f64, image: &Image, aperture: f64, @@ -33,7 +36,7 @@ impl Camera { let viewport_width = image.aspect_ratio * viewport_height; let forward = (look_from - look_at).unit_vector(); - let right = up.cross(&forward).unit_vector(); + let right = scene_up.cross(&forward).unit_vector(); let up = forward.cross(&right); let horizontal = focus_distance * viewport_width * right; @@ -50,6 +53,7 @@ impl Camera { forward, right, up, + scene_up, lens_radius: aperture * 0.5, focus_distance, } @@ -66,17 +70,56 @@ impl Camera { pub fn go_forward(&mut self, go: f64) { self.origin += self.forward * go; - - self.upper_left_corner = self.origin + self.vertical / 2.0 - - self.horizontal / 2.0 - - self.focus_distance * self.forward; + self.update_corner() } pub fn go_right(&mut self, go: f64) { self.origin += self.right * go; + self.update_corner() + } + fn update_corner(&mut self) { self.upper_left_corner = self.origin + self.vertical / 2.0 - self.horizontal / 2.0 - self.focus_distance * self.forward; } + + fn update_directions(&mut self) { + self.forward.unit_vector(); + self.right = self.scene_up.cross(&self.forward).unit_vector(); + self.up = self.forward.cross(&self.right); + self.horizontal = self.focus_distance * self.viewport_width * self.right; + self.vertical = self.focus_distance * self.viewport_height * self.up; + } + + pub fn rotate(&mut self, up: f64, right: f64) { + self.forward = (Quat::from_axis_angle(self.right.into(), right as f32) + * Quat::from_axis_angle(self.scene_up.into(), up as f32) + * FVec3::from(self.forward)) + .into(); + + self.forward.unit_vector(); + self.update_directions(); + self.update_corner(); + } + + pub fn rotate_up(&mut self, go: f64) { + self.forward = (Quat::from_axis_angle(self.right.into(), go as f32) + * FVec3::from(self.forward)) + .into(); + + self.forward.unit_vector(); + self.update_directions(); + self.update_corner(); + } + + pub fn rotate_right(&mut self, go: f64) { + self.forward = (Quat::from_axis_angle(self.scene_up.into(), -go as f32) + * FVec3::from(self.forward)) + .into(); + + self.forward.unit_vector(); + self.update_directions(); + self.update_corner(); + } } |
