Graphics 光线跟踪中的摄像机

Graphics 光线跟踪中的摄像机,graphics,camera,raytracing,Graphics,Camera,Raytracing,在光线追踪中,我完全坚持使用相机。请看一下我的计算,并指出错误在哪里。我用的是左手坐标系 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 poin

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

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
,或者位于眼睛和注视点之间(光线跟踪器中更常见的方式),或者位于眼睛后面(更接近实际针孔相机的模型).因此,让我们创建一个标量
缩放因子
。正数将平面置于眼睛前面,负数将平面置于眼睛后面(并翻转图像)

因此,图像平面的中心是:

eye + zoom_factor*w
eye + zoom_factor*w + xp*u + yp*v
因此,图像平面上的点
(xp,yp)

eye + zoom_factor*w
eye + zoom_factor*w + xp*u + yp*v
现在,您希望方向是从眼睛到该图像平面上的该点:

vec3 dir = eye + zoom_factor*w + xp*u + yp*v - eye;
eye
s取消,因此它简化为:

vec3 dir = zoom_factor*w + xp*u + yp*v

这假设
xp
一个
yp
都在一个类似(-0.5,0.5)的范围内。请注意,(0,0)是这种排列的图像平面的中间。

我不明白。为什么要进行这么多计算?光线不应该位于相机和相机可见的关注点之间吗?只是两点之间的向量吗?