Я создаю трассировщик лучей с нуля. Мой вопрос: когда я меняю координаты камеры, сфера меняется на эллипс. Я не понимаю, почему это происходит.
Вот несколько изображений, чтобы показать артефакты:
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);
camera's all three xyz corrdinates are non-zero
, то он показывает искажение, но если любой изxyz coordinate is zero
, то он работает нормально. Я думаю, что это может быть из-за искажения перспективы, но я хотел бы знать, есть ли что-то еще, что может быть причиной этой проблемы. - person sinner   schedule 08.01.2013