gpt4 book ai didi

c++ - 光线追踪 : Sphere distortion due to Camera Movement

转载 作者:搜寻专家 更新时间:2023-10-31 01:51:07 26 4
gpt4 key购买 nike

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

这里有一些图像来显示工件:

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

最佳答案

在玩了很多之后,在你们所有人的评论的帮助下,我能够正确地成功创建我的 rayTracer。很抱歉回答晚了,但我想用几句话结束这个话题。

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

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

我现在得到了很好的结果,但是在编写 rayTracer 代码时几乎没有什么要检查的:

  1. 在计算 FOV 和 ASPECT RATIO 时,始终确保处理好弧度到度数(反之亦然)的转换。我是这样做的:
     double angle = tan((M_PI * 0.5 * fovy) / 180.0);
double y = angle;
double x = aspect * angle;

2) 在计算三角形交集时,确保正确实现叉积。

3) 在使用不同对象的交点时,确保找到与相机距离最短的交点。

这是我得到的结果: enter image description here

上面是一个非常简单的模型(由 UCBerkeley 提供),我对其进行了光线追踪。

关于c++ - 光线追踪 : Sphere distortion due to Camera Movement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14186663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com