光线追踪相机

时间:2012-06-17 12:26:34

标签: graphics camera raytracing

我完全坚持使用相机进行光线追踪。请看看我的计算并指出错误在哪里。我正在使用左手坐标系。

x,y // range [0..S)x [0..S)//像素坐标

现在,让我们将像素坐标转换为相机平面的参数坐标:

xp = x/S * 2 – 1; 
yp = y/S * 2 – 1;

xp,yp // range [-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)};

1 个答案:

答案 0 :(得分:2)

我认为错误就在这里:

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

这假设xpyp各自的范围类似于(-0.5,0.5)。注意,(0,0)是具有这种排列的图像平面的中间。