#[derive(Debug, Clone)]
pub struct Camera3D {
pub cry: f32, pub sry: f32,
pub crx: f32, pub srx: f32,
pub cx: f32, pub cy: f32,
pub focal: f32,
pub zdist: f32,
}
impl Default for Camera3D {
fn default() -> Self {
Self {
cry: 1.0, sry: 0.0,
crx: 1.0, srx: 0.0,
cx: 960.0, cy: 540.0,
focal: 1080.0,
zdist: 5.0,
}
}
}
impl Camera3D {
#[inline]
pub fn depth(&self, wx: f32, wy: f32, wz: f32) -> f32 {
let rz1 = wx * self.sry + wz * self.cry;
let rz = wy * self.srx + rz1 * self.crx;
rz
}
#[inline]
pub fn project(&self, wx: f32, wy: f32, wz: f32) -> (f32, f32, f32) {
let rx = wx * self.cry - wz * self.sry;
let rz1 = wx * self.sry + wz * self.cry;
let ry = wy * self.crx - rz1 * self.srx;
let rz = wy * self.srx + rz1 * self.crx;
let d = rz + self.zdist;
let sx = self.cx + self.focal * rx / d;
let sy = self.cy + self.focal * ry / d;
(sx, sy, rz)
}
}