Move camera more!

This commit is contained in:
numzero 2024-12-30 03:27:27 +03:00
parent db48a786ac
commit 676fb20ad4
2 changed files with 32 additions and 8 deletions

View File

@ -45,6 +45,10 @@ impl SphereParams {
glossiness, glossiness,
} }
} }
pub fn deriv(&self, time: f32) -> Vec3 {
self.frequencies * self.amplitudes * (self.frequencies * time + self.phases).map(|x| x.cos())
}
} }
trait VecDistribution { trait VecDistribution {

View File

@ -16,22 +16,29 @@ mod trace;
pub use trace::Sphere; pub use trace::Sphere;
fn make_viewport(eye: Vec3, w: u32, h: u32) -> [Vertex; 4] { struct CamLoc {
eye: Vec3,
forward: Vec3,
right: Vec3,
}
fn make_viewport(cam: CamLoc, w: u32, h: u32) -> [Vertex; 4] {
let size = uvec2(w, h).as_vec2(); let size = uvec2(w, h).as_vec2();
let size = size.normalize(); let size = size.normalize();
let (w, h, d) = (size.x, size.y, 1.); let (w, h, d) = (size.x, size.y, 1.);
let screen_coord = [vec2(-1., -1.), vec2(1., -1.), vec2(-1., 1.), vec2(1., 1.)]; let screen_coord = [vec2(-1., -1.), vec2(1., -1.), vec2(-1., 1.), vec2(1., 1.)];
let up = Vec3::Z; let eye = cam.eye;
let fwd = -eye.normalize(); let fwd = cam.forward.normalize();
let right = eye.cross(up).normalize(); let up = cam.right.cross(fwd).normalize();
let up = eye.cross(right).normalize(); let right = up.cross(fwd);
let m = mat3(fwd, right, up); let m = mat3(fwd, right, up);
let world_coord = [vec3(d, -w, -h), vec3(d, w, -h), vec3(d, -w, h), vec3(d, w, h)]; let world_coord = [vec3(d, -w, -h), vec3(d, w, -h), vec3(d, -w, h), vec3(d, w, h)];
[0, 1, 2, 3].map(|k| Vertex { [0, 1, 2, 3].map(|k| Vertex {
eye, eye,
world: eye + m * (world_coord[k]), world: eye + m * world_coord[k],
screen: screen_coord[k], screen: screen_coord[k],
}) })
} }
@ -61,6 +68,14 @@ fn main() {
}; };
let camera_params = { let camera_params = {
let mut p = anim::distr()(&mut rng); let mut p = anim::distr()(&mut rng);
p.amplitudes *= 2.0;
p.frequencies *= 0.1;
p
};
let target_params = {
let mut p = anim::distr()(&mut rng);
p.origin = Vec3::splat(0.0);
p.amplitudes *= 0.5;
p.frequencies *= 0.1; p.frequencies *= 0.1;
p p
}; };
@ -131,8 +146,13 @@ fn main() {
for _ in 0..RAYS_PER_PIXEL { for _ in 0..RAYS_PER_PIXEL {
frame += 1; frame += 1;
let time = frame as f32 / (60. * RAYS_PER_PIXEL as f32); let time = frame as f32 / (60. * RAYS_PER_PIXEL as f32);
let camera_pos = camera_params.to_sphere(time).center; let eye = camera_params.to_sphere(time).center;
tracer.set_view(&queue, &make_viewport(camera_pos, size.width, size.height)); let right = camera_params.deriv(time);
let forward = target_params.to_sphere(time).center - eye;
tracer.set_view(
&queue,
&make_viewport(CamLoc { eye, forward, right }, size.width, size.height),
);
let spheres: Vec<_> = sphere_params.iter().map(|p| p.to_sphere(time)).collect(); let spheres: Vec<_> = sphere_params.iter().map(|p| p.to_sphere(time)).collect();
let data = TracerData::new(&device, &tracer, &spheres); let data = TracerData::new(&device, &tracer, &spheres);
tracer.render( tracer.render(