use glam::{Mat4, Vec3};
#[derive(Debug, Clone, Copy)]
pub struct Camera3D {
pub eye: Vec3,
pub target: Vec3,
pub up: Vec3,
pub fov_y_radians: f32,
pub znear: f32,
pub zfar: f32,
}
impl Default for Camera3D {
fn default() -> Self {
Self {
eye: Vec3::new(0.0, -5.0, 3.0),
target: Vec3::ZERO,
up: Vec3::Y,
fov_y_radians: std::f32::consts::FRAC_PI_4,
znear: 0.1,
zfar: 100.0,
}
}
}
impl Camera3D {
pub fn view_matrix(&self) -> Mat4 {
Mat4::look_at_rh(self.eye, self.target, self.up)
}
pub fn projection_matrix(&self, aspect: f32) -> Mat4 {
Mat4::perspective_rh_gl(self.fov_y_radians, aspect, self.znear, self.zfar)
}
pub fn view_proj(&self, aspect: f32) -> Mat4 {
self.projection_matrix(aspect) * self.view_matrix()
}
}