光线跟踪:由于相机移动导致的球体失真

时间:2013-01-06 20:58:37

标签: c++ raytracing

我正在从头开始构建光线追踪器。我的问题是: 当我更改相机坐标时,球体变为椭圆。我不明白为什么会这样。

以下是一些显示工件的图片:

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);

2 个答案:

答案 0 :(得分:2)

在经历了很多游戏之后,在你们所有人的评论的帮助下,我能够成功地创造出我的rayTracer。很抱歉回答迟到,但我想以几句话结束这个帖子。

所以,上面提到的代码是完全正确的。基于我自己的假设(如上面评论中所述),我决定像这样设置我的相机参数。

我上面提到的问题是相机的正常行为(如上文评论中所述)。

我现在已经取得了不错的成绩,但在编写光线跟踪器时几乎没有什么可检查的事情:

  1. 在计算FOV和ASPECT RATIO时,务必确保处理Radians to Degrees(反之亦然)转换。我这样做了:
  2.      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 :(得分:1)

这是正确的行为。拿到带有广角镜头的相机,将球体放在视野边缘附近并拍照。然后在照片应用程序中,在球体照片的顶部绘制一个圆圈,您将看到它不是圆形投影。

将效果设置为1.0但您的图像不是方形的事实会放大此效果。

要解决的一些问题:

  • 方向向量是(从 - 到)。你有(从 - 到),所以a指向后方。你最后要添加m_w,而不是减去它。此外,此修复程序会将您的m_u,m_v旋转180度,这将使您即将更改(j - half_w)为(half_w - j)。

  • 此外,将所有像素和所有方向放在列表中的效率不如仅仅循环x,y值。