From 8201c8e2a7ff85383ff7606513778253aae7e666 Mon Sep 17 00:00:00 2001 From: Sakarias Johansson Date: Fri, 14 Apr 2023 20:58:23 +0200 Subject: =?UTF-8?q?=E2=9C=A8=20Add=20support=20for=20camera=20rotation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- racer-tracer/src/camera.rs | 55 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 6 deletions(-) (limited to 'racer-tracer/src/camera.rs') 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(); + } } -- cgit v1.2.3