summaryrefslogtreecommitdiff
path: root/racer-tracer/src/camera.rs
diff options
context:
space:
mode:
authorSakarias Johansson <sakarias.johansson@goodbyekansas.com>2023-04-14 20:58:23 +0200
committerSakarias Johansson <sakariasjohansson@hotmail.com>2023-04-14 21:17:20 +0200
commit8201c8e2a7ff85383ff7606513778253aae7e666 (patch)
treead0175360dc19554c6f11b1a66af210d60418f99 /racer-tracer/src/camera.rs
parent0ae6ca062f5936ae6f595f45ca0a78ed049452bc (diff)
downloadracer-tracer-main.tar.gz
racer-tracer-main.tar.xz
racer-tracer-main.zip
✨ Add support for camera rotationHEADmain
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.rs55
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();
+ }
}