diff options
Diffstat (limited to 'engine/src/matrix.rs')
-rw-r--r-- | engine/src/matrix.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/engine/src/matrix.rs b/engine/src/matrix.rs index c060b59..85a3721 100644 --- a/engine/src/matrix.rs +++ b/engine/src/matrix.rs @@ -71,4 +71,39 @@ impl Matrix<f32, 4, 4> self.set_cell(2, 2, scaling.z); self.set_cell(3, 3, 1.0); } + + pub fn look_at(&mut self, eye: &Vec3<f32>, target: &Vec3<f32>, up: &Vec3<f32>) + { + let rev_target_direction = (eye - target).normalize(); + + let camera_right = up.cross(&rev_target_direction).normalize(); + + let camera_up = rev_target_direction.cross(&camera_right); + + self.set_cell(0, 0, camera_right.x); + self.set_cell(0, 1, camera_right.y); + self.set_cell(0, 2, camera_right.z); + + self.set_cell(1, 0, camera_up.x); + self.set_cell(1, 1, camera_up.y); + self.set_cell(1, 2, camera_up.z); + + self.set_cell(2, 0, rev_target_direction.x); + self.set_cell(2, 1, rev_target_direction.y); + self.set_cell(2, 2, rev_target_direction.z); + + // The vector is negated since we want the world to be translated in the opposite + // direction of where we want the camera to move. + let camera_pos = -Vec3 { + x: camera_right.dot(eye), + y: camera_up.dot(eye), + z: rev_target_direction.dot(eye), + }; + + self.set_cell(0, 3, camera_pos.x); + self.set_cell(1, 3, camera_pos.y); + self.set_cell(2, 3, camera_pos.z); + + self.set_cell(3, 3, 1.0); + } } |