我在光线追踪中完全坚持使用相机。请看一下我的计算,并指出错误在哪里。我使用的是左手坐标系。
x,y//范围 [0..S)x [0..S)//像素坐标
现在,让我们将像素坐标转换为相机平面的参数坐标:
xp = x/S * 2 – 1;
yp = y/S * 2 – 1;
XP, yp//范围
[-1..1] x [-1..1]相机基础计算:
//eye - camera position
//up - camera up vector
//look_at - camera target point
vec3 w = normalize(look_at-eye);
vec3 u = cross(up,w);
vec3 v = cross(w,u);
所以射线方向应该有以下坐标:
vec3 dir = look_at – eye + xp*u + yp*v;
ray3 ray = {eye, normalize(dir)};
我认为错误就在这里:
vec3 dir = look_at – eye + xp*u + yp*v;
图像平面应该有一个法线矢量w
,并且要么在眼睛和观察点之间(光线追踪器中更常见的方式),要么在眼睛后面(更接近地模拟实际的针孔相机)。 因此,让我们创建一个标量zoom_factor
。 正数将平面放在眼睛前面,负数将其放在眼睛后面(并翻转图像)。
因此,图像平面的中心是:
eye + zoom_factor*w
因此,图像平面上的点(xp, yp)
为:
eye + zoom_factor*w + xp*u + yp*v
现在,您希望方向从眼睛到此图像平面上的此点:
vec3 dir = eye + zoom_factor*w + xp*u + yp*v - eye;
eye
取消,因此简化为:
vec3 dir = zoom_factor*w + xp*u + yp*v
这假设xp
一个yp
都在类似 (-0.5, 0.5) 的范围内。 请注意,(0, 0) 是具有此排列的图像平面的中间。