2010-03-27 41 views
1

我已经写代码,从摄像机的“眼睛”的观看平面产生一个射线一定距离远离照相机的眼睛:射线产生不一致

R3Ray ConstructRayThroughPixel(...) 
{ 
    R3Point p; 

    double increments_x = (lr.X() - ul.X())/(double)width; 
    double increments_y = (ul.Y() - lr.Y())/(double)height; 
    p.SetX(ul.X() + ((double)i_pos+0.5)*increments_x); 
    p.SetY(lr.Y() + ((double)j_pos+0.5)*increments_y); 
    p.SetZ(lr.Z()); 

    R3Vector v = p-camera_pos; 

    R3Ray new_ray(camera_pos,v); 
    return new_ray; 
} 

ul是观看的左上角飞机和lr是观看飞机的左下角。它们被定义如下:

R3Point org = scene->camera.eye + scene->camera.towards * radius; 
    R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov); 
    R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov); 
    R3Point lr = org + dx - dy; 
    R3Point ul = org - dx + dy; 

这里,org是观看平面与radius被观看平面和照相机眼睛,dxdy之间的距离的中心在x的位移和从y方向观看飞机的中心。

ConstructRayThroughPixel(...)函数适用于眼睛在(0,0,0)处的相机。但是,当相机处于某个不同的位置时,不会为图像生成所有需要的光线。

有什么建议可能会出错?也许我的方程有问题吗?

感谢您的帮助。

+0

我不认为你想要的矢量图形标记。矢量图形通常指的是以“从(x1,y1)到(x2,y2)绘制厚度为t,颜色为c的线条形式存储数据的文件格式”。而您将逐个像素地存储数据,不是吗? – dmckee 2010-03-27 16:01:15

+0

好吧,我上午使用场景文件格式来显示我的图形,它以类似的形式存储数据,但是我的问题与此无关。我误解了“矢量图形意味着什么” - 。 - – Myx 2010-03-27 16:04:21

回答

0

我的代码不工作的原因是因为我正在分别处理x,y,z值。这是错误的,因为相机可以面向任何方向,因此如果它面向x轴,则x坐标将是相同的,产生0(这是不正确的)increments。相反,应该做的是角点插值(其中点具有x,y,z坐标)。请参阅相关帖子中的答案:3D coordinate of 2D point given camera and view plane

0

这里的狡辩,可能什么都没有做与你的问题:

当你这样做:

R3Vector dx = scene->camera.right * radius * tan(scene->camera.xfov); 
R3Vector dy = scene->camera.up * radius * tan(scene->camera.yfov); 

我假设rightup矢量归,对不对?在这种情况下,您需要sin而不是tan。当然,如果角度较小,则不会有太大的区别。

+0

我做了改变,它没有太大区别。会发生什么是光线正在投射,但不是射线的整个范围。所以,我假设映射不是以正确的方式完成的,因为多个光线投射到同一个像素,或者“投射”像素的结果值非常接近旁边的像素,所以整个范围像素没有被完全重建(即,在观察平面位置(i,j)处没有像素的光线) – Myx 2010-03-27 16:28:04

+0

这听起来就像从整数到浮点数学之间出现的那种问题,但我在你发布的代码中没有看到任何迹象。您是否试过单步执行代码,以获取发生错误的简单情况(在调试器中或手动执行)。有时候这是最简单的方法,乏味或不麻烦。 – dmckee 2010-03-27 16:49:43

+0

我希望那将是我的最后一招。从它在摄像机处于(0,0,0)但对摄像机位于其他位置的场景不起作用的场景中起作用的事实,我认为在计算X和Y时我的逻辑中存在一些错误在观看平面上生成的点的坐标。 – Myx 2010-03-27 16:57:38