【问题标题】:Ray Generation Inconsistency光线生成不一致
【发布时间】:2011-02-01 13:28:28
【问题描述】:

我编写的代码可以生成从相机“眼睛”到距离相机眼睛一定距离的观察平面的光线:

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) 的相机。但是,当相机位于某个不同的位置时,并非为图像产生所有需要的光线。

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

感谢您的帮助。

【问题讨论】:

  • 我认为您不需要矢量图形标签。矢量图形通常是指一种文件格式,它以一种形式存储数据,意思是“从 (x1,y1) 到 (x2,y2) 画一条线,厚度为 t,颜色为 c”。而您将逐像素存储数据,不是吗?
  • 好吧,我正在使用场景文件格式来显示我的图形,该图形以您描述的类似形式存储数据,但我的问题与此无关。我误解了“矢量图形的含义”-.-

标签: graphics camera raytracing


【解决方案1】:

这里有一个小问题,可能与你的问题无关:

当你这样做时:

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

我假设 rightup 向量是标准化的,对吧?在这种情况下,您需要sin 而不是tan。当然,如果fov 角度很小,也不会产生太大影响。

【讨论】:

  • 我进行了更改,但并没有太大的不同。发生的情况是光线被投射,但不是整个光线范围。所以,我假设映射没有以正确的方式完成,因为多条光线被投射到同一个像素,或者“投射”像素的结果值非常接近它旁边的那个,所以整个范围像素没有被完全重建(即在观察平面位置 (i,j) 处没有确切的一条像素射线)
  • 听起来就像你在从整数到浮点数学来回弹出时遇到的那种问题,但我在你的代码中看不到任何迹象'已经发布。您是否尝试过单步执行代码以获得错误的简单情况(在调试器中或手动)。有时这是最简单的方法,不管是否乏味。
  • 我希望这是我最后的选择。从它适用于相机位于 (0,0,0) 的场景但不适用于相机位于其他位置的场景这一事实,我认为在计算 X 和 Y 时我的逻辑存在一些错误生成点在查看平面上的坐标。
  • 有没有办法在给定像素 (i,j) 坐标的情况下直接在视平面的左上角和视平面的左下角之间进行插值,而无需单独计算 X 分量和 Y组件?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多