2012-06-17 105 views
2

我完全卡在照相機光線跟蹤中。請看看我的計算結果並指出錯誤在哪裏。我正在使用左手座標系。照相機在光線跟蹤

的x,y //範圍[0..S)×[0..S)//像素座標

現在,讓我們變換像素座標到相機平面的參數座標:

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

XP,YP //範圍[-1..1]×[-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); 

所以RA Y方向應該具有以下座標:

vec3 dir = look_at – eye + xp*u + yp*v; 
ray3 ray = {eye, normalize(dir)}; 
+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 s取消,所以它簡化爲:

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

這假定xp一個yp各自在像(-0.5,0.5)的範圍內。請注意,(0,0)是具有此排列的圖像平面的中間部分。

+0

謝謝。固定。 – innochenti