Adjust camera to focus at target

This commit is contained in:
2025-09-23 15:36:08 +01:00
parent fc9980b838
commit fa60617d9e

View File

@@ -12,9 +12,12 @@ camera_t camera_init(
vec3_t pos, vec3_t target, double fov, uint32_t img_width, vec3_t pos, vec3_t target, double fov, uint32_t img_width,
uint32_t img_height) 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 fov_rad = M_PI * fov / 180.0;
const double aspect = (double)img_width / (double)img_height; 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 double viewport_width = viewport_height * aspect;
const vec3_t w_hat = vec3_unit(vec3_sub(target, pos)); 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 u = vec3_scale(u_hat, viewport_width);
const vec3_t v = vec3_scale(v_hat, -viewport_height); const vec3_t v = vec3_scale(v_hat, -viewport_height);
const vec3_t topleft const vec3_t topleft = vec3_sub(target, vec3_scale(vec3_add(u, v), 0.5));
= vec3_sub(vec3_add(pos, w_hat), vec3_scale(vec3_add(u, v), 0.5));
const vec3_t x_step = vec3_scale(u, 1.0 / (double)img_width); 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); const vec3_t y_step = vec3_scale(v, 1.0 / (double)img_height);