光线追踪相机设置问题:相机在原点时球体偏离原点
光线追踪相机偏移问题排查
核心错误点
1. 弧度转换数值错误
你把圆周率写成了13.14,这是完全错误的,正确值应为3.1415926或标准库宏M_PI(需包含math.h)。这个错误会直接导致视口高度计算完全失真,引发物体显示位置偏移。
2. FOV计算遗漏除以2的步骤
视口高度的正确计算公式是 2 * focal_len * tan(FOV/2 * 弧度),你当前代码直接用tan(sc->cam.fov * 弧度),未将FOV除以2,会让视口高度远大于预期,导致场景元素显示位置偏离。
修正后的代码片段
t_camera camera(t_canvas *canvas, t_scene *sc) { t_camera cam; double focal_len; double viewport_height; const double pi = 3.1415926; // 或使用M_PI // 修正:FOV先除以2再转弧度 viewport_height = 2 * tan( (sc->cam.fov / 2.0) * pi / 180 ); focal_len = 1.0; cam.orig = sc->cam.cen; cam.viewport_h = viewport_height; cam.viewport_w = viewport_height * canvas->aspect_ratio; cam.focal_len = focal_len; cam.horizontal = make_vec(cam.viewport_w, 0, 0); cam.vertical = make_vec(0, cam.viewport_h, 0); cam.left_bottom = sub_vec(sub_vec(sub_vec(cam.orig, div_vect(cam.horizontal, 2)), div_vect(cam.vertical, 2)), make_vec(0, 0, focal_len)); return (cam); }
额外验证点
- 确认
sub_vec(a, b)逻辑确实是a - b,若为b - a需调整减法顺序。 - 检查球体定义是否确实在原点(0,0,0),排除球体自身位置参数错误导致的偏移。
内容的提问来源于stack exchange,提问作者xperaz
相关产品推荐
相关产品推荐

