From a79b414b3748aab1b6a3921a4ff73e2bc477bca0 Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Mon, 22 Sep 2025 23:12:37 +0100 Subject: [PATCH] Adjust camera to focus at target --- src/camera.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/camera.c b/src/camera.c index dfc50a0..3d618dd 100644 --- a/src/camera.c +++ b/src/camera.c @@ -12,9 +12,12 @@ camera_t camera_init( vec3_t pos, vec3_t target, double fov, uint32_t img_width, uint32_t img_height) { + const vec3_t target_disp = vec3_sub(target, pos); + const double focal_len = vec3_len(target_disp); + const double fov_rad = M_PI * fov / 180.0; const double aspect = (double)img_width / (double)img_height; - const double viewport_height = tan(fov_rad / 2); + const double viewport_height = focal_len * tan(fov_rad / 2); const double viewport_width = viewport_height * aspect; const vec3_t w_hat = vec3_unit(vec3_sub(target, pos)); @@ -24,8 +27,7 @@ camera_t camera_init( const vec3_t u = vec3_scale(u_hat, viewport_width); const vec3_t v = vec3_scale(v_hat, -viewport_height); - const vec3_t topleft - = vec3_sub(vec3_add(pos, w_hat), vec3_scale(vec3_add(u, v), 0.5)); + const vec3_t topleft = vec3_sub(target, vec3_scale(vec3_add(u, v), 0.5)); const vec3_t x_step = vec3_scale(u, 1.0 / (double)img_width); const vec3_t y_step = vec3_scale(v, 1.0 / (double)img_height);