我從頭開始創建光線追蹤器。我的問題是: 當我改變相機座標時,球體變成橢圓。我不明白爲什麼會發生。光線追蹤:由於相機移動造成的球體失真
下面是一些圖像顯示構件:
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)
但是,當我改變了攝像機座標,球看起來會有些失真,如下圖所示:
Camera: -2 -2 2 0 0 0 0 1 0 45.0 1.0
我不清楚和什麼是錯的。如果有人能夠幫助,那會很棒!
設置我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);
你見過[這個問題]的答案(http://stackoverflow.com/questions/14074643/why-does-raytracer-render-spheres-as-ovals)? –
謝謝jon-hanson。我玩我的執行很多,發現如果我的'相機的所有三個xyz corrdinates是非零'然後它顯示失真,但如果任何人'xyz座標爲零',那麼它工作正常。 我認爲這可能是因爲視角的扭曲,但我想知道是否有其他可能導致此問題的原因。 – sinner
感謝您的鏈接也。我檢查了FOV參數值,看起來很好。我將其更改爲30和15各自的值,但結果仍然相同。 – sinner