|
|
|
@ -182,22 +182,33 @@ impl CameraController {
|
|
|
|
|
|
|
|
|
|
fn update_camera(&self, camera: &mut Camera) {
|
|
|
|
|
use cgmath::InnerSpace;
|
|
|
|
|
let forward = (camera.target - camera.eye).normalize();
|
|
|
|
|
|
|
|
|
|
if self.is_forward_pressed {
|
|
|
|
|
camera.eye += forward * self.speed;
|
|
|
|
|
let forward = camera.target - camera.eye;
|
|
|
|
|
let forward_norm = forward.normalize();
|
|
|
|
|
let forward_mag = forward.magnitude();
|
|
|
|
|
|
|
|
|
|
// Prevents glitching when camera gets too close to the
|
|
|
|
|
// center of the scene.
|
|
|
|
|
if self.is_forward_pressed && forward_mag > self.speed {
|
|
|
|
|
camera.eye += forward_norm * self.speed;
|
|
|
|
|
}
|
|
|
|
|
if self.is_backward_pressed {
|
|
|
|
|
camera.eye -= forward * self.speed;
|
|
|
|
|
camera.eye -= forward_norm * self.speed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let right = forward.cross(camera.up);
|
|
|
|
|
let right = forward_norm.cross(camera.up);
|
|
|
|
|
|
|
|
|
|
// Redo radius calc in case the up/ down is pressed.
|
|
|
|
|
let forward = camera.target - camera.eye;
|
|
|
|
|
let forward_mag = forward.magnitude();
|
|
|
|
|
|
|
|
|
|
if self.is_right_pressed {
|
|
|
|
|
camera.eye += right * self.speed;
|
|
|
|
|
// Rescale the distance between the target and eye so
|
|
|
|
|
// that it doesn't change. The eye therefore still
|
|
|
|
|
// lies on the circle made by the target and eye.
|
|
|
|
|
camera.eye = camera.target - (forward + right * self.speed).normalize() * forward_mag;
|
|
|
|
|
}
|
|
|
|
|
if self.is_left_pressed {
|
|
|
|
|
camera.eye -= right * self.speed;
|
|
|
|
|
camera.eye = camera.target - (forward - right * self.speed).normalize() * forward_mag;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|