Extract projections into functions
This commit is contained in:
parent
3a357553e4
commit
45e446ae3e
|
|
@ -88,6 +88,27 @@ fn render(mesh: &Mesh, camera: impl Fn(Vec2) -> (Vec3, Vec3)) -> Image {
|
||||||
img
|
img
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn persp(dist: f32, off: Vec2) -> (Vec3, Vec3) {
|
||||||
|
(vec3(0., 0., -dist), vec3(off.x, off.y, dist))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ortho(dist: f32, off: Vec2) -> (Vec3, Vec3) {
|
||||||
|
(vec3(off.x, off.y, -dist), vec3(0., 0., 1.))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_projs() {
|
||||||
|
fn check(f: fn(dist: f32, off: Vec2) -> (Vec3, Vec3), x: f32, y: f32, z: f32) {
|
||||||
|
let (base, ray) = f(z, vec2(x, y));
|
||||||
|
let at_dist = base + ray * (z / ray.z);
|
||||||
|
assert_eq!(at_dist, vec3(x, y, 0.));
|
||||||
|
}
|
||||||
|
check(persp, 1., 2., 3.);
|
||||||
|
check(ortho, 1., 2., 3.);
|
||||||
|
check(persp, 5., 3., 7.);
|
||||||
|
check(ortho, 9., 1., 8.);
|
||||||
|
}
|
||||||
|
|
||||||
#[show_image::main]
|
#[show_image::main]
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
let args: Vec<String> = env::args().collect();
|
let args: Vec<String> = env::args().collect();
|
||||||
|
|
@ -100,6 +121,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
let mut f = BufReader::new(f);
|
let mut f = BufReader::new(f);
|
||||||
load_mesh(&mut f)?
|
load_mesh(&mut f)?
|
||||||
};
|
};
|
||||||
|
let proj = persp;
|
||||||
let window = show_image::create_window("Raytracing", WindowOptions::default())?;
|
let window = show_image::create_window("Raytracing", WindowOptions::default())?;
|
||||||
loop {
|
loop {
|
||||||
for phi in 0..360 {
|
for phi in 0..360 {
|
||||||
|
|
@ -110,14 +132,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
));
|
));
|
||||||
let m_camera = m_view.transpose();
|
let m_camera = m_view.transpose();
|
||||||
let img = render(mesh.as_slice(), |off| {
|
let img = render(mesh.as_slice(), |off| {
|
||||||
// perspective projection
|
let (base, ray) = proj(40., 20. * off);
|
||||||
let base = vec3(0.0, 0.0, -40.0);
|
|
||||||
let ray = vec3(off.x, off.y, 2.0);
|
|
||||||
|
|
||||||
// orthographic projection
|
|
||||||
// let base = vec3(off.x, off.y, -10.0);
|
|
||||||
// let ray = vec3(0.0, 0.0, 1.0);
|
|
||||||
|
|
||||||
(m_camera * base, m_camera * ray)
|
(m_camera * base, m_camera * ray)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user