Specify camera FOV instead of viewport height

This commit is contained in:
2025-09-23 15:36:08 +01:00
parent 90240ee5ad
commit bb6c1683b2
3 changed files with 13 additions and 5 deletions

6
demo.c
View File

@@ -8,7 +8,7 @@
#define W 800 #define W 800
#define H 600 #define H 600
#define FOCAL_LEN 1.0 #define FOCAL_LEN 1.0
#define VIEWPORT_H 2.0 #define FOV 120
#define SAMPLES_PER_PIXEL 100 #define SAMPLES_PER_PIXEL 100
#define NELEMS(arr) (sizeof(arr) / sizeof(arr[0])) #define NELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
@@ -31,8 +31,8 @@ static pix_t pixbuf[W * H];
int main() int main()
{ {
img_t img = { .pix = pixbuf }; img_t img = { .pix = pixbuf };
camera_t camera = camera_init( camera_t camera
camera_pos, FOCAL_LEN, VIEWPORT_H, W, H, SAMPLES_PER_PIXEL); = camera_init(camera_pos, FOCAL_LEN, FOV, W, H, SAMPLES_PER_PIXEL);
camera_render(&camera, scene, NELEMS(scene), &img); camera_render(&camera, scene, NELEMS(scene), &img);
ff_write(STDOUT_FILENO, img); ff_write(STDOUT_FILENO, img);

View File

@@ -15,7 +15,7 @@ typedef struct {
} camera_t; } camera_t;
camera_t camera_init( camera_t camera_init(
vec3_t pos, double focal_len, double viewport_height, uint32_t img_width, vec3_t pos, double focal_len, double fov, uint32_t img_width,
uint32_t img_height, unsigned samples_per_pixel); uint32_t img_height, unsigned samples_per_pixel);
void camera_render( void camera_render(

View File

@@ -9,6 +9,10 @@
#include <stdio.h> #include <stdio.h>
#include <threads.h> #include <threads.h>
#ifndef M_PI
#define M_PI 3.14159265258979323846264
#endif
#define MAX_ITER 10 #define MAX_ITER 10
#define MIN_T 1e-6 #define MIN_T 1e-6
#define SAMPLE_STDDEV 0.333 #define SAMPLE_STDDEV 0.333
@@ -113,12 +117,16 @@ static int render_thread(void *arg)
} }
camera_t camera_init( camera_t camera_init(
vec3_t pos, double focal_len, double viewport_height, uint32_t img_width, vec3_t pos, double focal_len, double fov, uint32_t img_width,
uint32_t img_height, unsigned samples_per_pixel) uint32_t img_height, unsigned samples_per_pixel)
{ {
const double aspect = (double)img_width / (double)img_height; const double aspect = (double)img_width / (double)img_height;
const double fov_rad = M_PI * fov / 180.0;
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 viewport_disp = { 0, 0, focal_len }; const vec3_t viewport_disp = { 0, 0, focal_len };
const vec3_t u = { viewport_width, 0, 0 }; const vec3_t u = { viewport_width, 0, 0 };
const vec3_t v = { 0, -viewport_height, 0 }; const vec3_t v = { 0, -viewport_height, 0 };
const vec3_t topleft = vec3_sub( const vec3_t topleft = vec3_sub(