2013-01-06 114 views
2

我從頭開始創建光線追蹤器。我的問題是: 當我改變相機座標時,球體變成橢圓。我不明白爲什麼會發生。光線追蹤:由於相機移動造成的球體失真

下面是一些圖像顯示構件:

Sphere: 1 1 -1 1.0 (Center, radius) 
Camera: 0 0 5 0 0 0 0 1 0 45.0 1.0 (eyepos, lookat, up, foy, aspect) 

enter camera 0 0 5 0 0 0 0 1 0 45.0 1.0

但是,當我改變了攝像機座標,球看起來會有些失真,如下圖所示:

Camera: -2 -2 2 0 0 0 0 1 0 45.0 1.0 

enter image description here

我不清楚和什麼是錯的。如果有人能夠幫助,那會很棒!

設置我imagePlane如下:

//Computing u,v,w axes coordinates of Camera as follows: 

{  
     Vector a = Normalize(eye - lookat); //Camera_eye - Camera_lookAt 
     Vector b = up; //Camera Up Vector 
     m_w = a; 
     m_u = b.cross(m_w); 
     m_u.normalize(); 
     m_v = m_w.cross(m_u); 
} 

之後我計算用於從攝像機位置(眼睛)的每個像素的方向如下面提到:

//Then Computing direction as follows: 

int half_w = m_width * 0.5; 
    int half_h = m_height * 0.5; 

double half_fy = fovy() * 0.5; 
double angle = tan((M_PI * half_fy)/(double)180.0); 

for(int k=0; k<pixels.size(); k++){ 
    double j = pixels[k].x();  //width 
    double i = pixels[k].y();  //height 

    double XX = aspect() * angle * ((j - half_w)/(double)half_w); 
    double YY =   angle * ((half_h - i)/(double)half_h); 

    Vector dir = (m_u * XX + m_v * YY) - m_w ; 


directions.push_back(dir); 
} 

之後:

for each dir: 

    Ray ray(eye, dir); 
    int depth = 0; 
    t_color += Trace(g_primitive, ray, depth); 
+0

你見過[這個問題]的答案(http://stackoverflow.com/questions/14074643/why-does-raytracer-render-spheres-as-ovals)? –

+0

謝謝jon-hanson。我玩我的執行很多,發現如果我的'相機的所有三個xyz corrdinates是非零'然後它顯示失真,但如果任何人'xyz座標爲零',那麼它工作正常。 我認爲這可能是因爲視角的扭曲,但我想知道是否有其他可能導致此問題的原因。 – sinner

+0

感謝您的鏈接也。我檢查了FOV參數值,看起來很好。我將其更改爲30和15各自的值,但結果仍然相同。 – sinner

回答

2

打了很多東西后,在大家的意見幫助下,我成功地創建了我的rayTracer。對不起,回答遲了,但我想關閉這個線程,幾句話。

所以,上面提到的代碼是完全正確的。根據我自己的假設(如上述評論中提到的),我決定設置我的相機參數。

我上面提到的問題是相機的正常行爲(也在上面的評論中提到過)。

我有現在的好成績,但也有幾件事情來檢查,而編碼光線跟蹤:

  1. 始終確保照顧弧度爲度(反之亦然)的轉換而計算FOV和縱橫比。我做到了,如下所示:
 double angle = tan((M_PI * 0.5 * fovy)/180.0); 
    double y = angle; 
    double x = aspect * angle; 

2)在計算三角形交叉,確保正確實施跨產品。

3)使用不同物體的交叉點時,一定要找到與相機距離最小的交叉點。

這裏是我得到的結果是: enter image description here

上面是一個非常簡單的模型(禮貌UCBerkeley),我光線追蹤。

1

這是正確的行爲。用廣角鏡頭拍攝相機,將球體放在視野邊緣附近拍攝照片。然後在照片應用程序中,在球體照片的頂部繪製一個圓圈,您將看到它不是圓形投影。

這種效果會因爲您將aspect設置爲1.0而您的圖像不是方形而被放大。

有幾件事情來解決:

  • A方向矢量是(到 - 從)。你有(從 - 到),所以a向後。你會想在最後加上m_w,而不是減去它。此外,此修復將使您的m_u,m_v旋轉180度,這將使您將(j - half_w)更改爲(half_w - j)。

  • 此外,將所有像素和所有方向放在列表中並不像循環x,y值那樣高效。

+0

你好憤怒,感謝您的意見,但: 1)「Vecter」是我自己的數學類型的數據類型。 2)方向是故意設置的,以便與OpenGL相機的規格保持一致(如在OpenGL Z中,沿着軸向下),並防止圖像翻轉。 3)因爲我認爲我的圖像(最終生成的結果)起源位於UPPER_LEFT角落,這就是爲什麼它的'j-half_w'和'half_h-i' – sinner