我正在从头开始构建光线追踪器。我的问题是:当我更改相机坐标时,球体更改为椭圆形。我不明白为什么会这样。
以下是一些显示文物的图像:
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)
Run Code Online (Sandbox Code Playgroud)

但是当我更改相机坐标时,球体看起来扭曲,如下所示:
Camera: -2 -2 2 0 0 0 0 1 0 45.0 1.0
Run Code Online (Sandbox Code Playgroud)

我不明白出了什么问题。如果有人可以提供帮助那就太好了!
我将 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);
}
Run Code Online (Sandbox Code Playgroud)
之后,我从相机位置(眼睛)计算每个像素的方向,如下所述:
//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);
}
Run Code Online (Sandbox Code Playgroud)
在那之后:
for each dir:
Ray ray(eye, dir);
int depth = 0;
t_color += Trace(g_primitive, ray, depth);
Run Code Online (Sandbox Code Playgroud)
在玩了很多之后,在大家评论的帮助下,我能够正确地成功创建我的 rayTracer。抱歉回复晚了,但我想用几句话来结束这个话题。
所以,上面提到的代码是完全正确的。根据我自己的假设(如上面的评论中所述),我决定这样设置我的相机参数。
我上面提到的问题是相机的正常行为(正如上面的评论中提到的)。
我现在已经得到了很好的结果,但是在编码 rayTracer 时需要检查一些事情:
Run Code Online (Sandbox Code Playgroud)double angle = tan((M_PI * 0.5 * fovy) / 180.0); double y = angle; double x = aspect * angle;
2)计算三角形交点时,确保正确实现叉积。
3)在使用不同物体的交点时,确保找到距相机最近距离的交点。
这是我得到的结果:

上面是一个非常简单的模型(由加州大学伯克利分校提供),我对其进行了 rayTraced。