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观察平面和相机眼睛之间的距离, 是从观察平面中心在 xdxdyy 方向上的位移。

ConstructRayThroughPixel(...)函数非常适合眼睛位于 (0,0,0) 的相机。然而,当相机位于某个不同的位置时,并非为图像产生所有需要的光线。

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

谢谢您的帮助。

4

2 回答 2

0

这是一个可能与您的问题无关的小问题:

当你这样做时:

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

我假设rightup向量是标准化的,对吧?在那种情况下,你sin不想tan。当然,如果fov角度很小,它不会有太大的区别。

于 2010-03-27T16:13:33.567 回答
0

我的代码不起作用的原因是因为我分别处理 x,y,z 值。这是错误的,因为相机可以面向任何方向,因此如果它面向 x 轴,x 坐标将是相同的,产生increments0(这是不正确的)。相反,应该做的是角点的插值(其中点具有 x、y、z 坐标)。请参阅相关帖子中的答案:给定相机和视图平面的 2D 点的 3D 坐标

于 2010-04-01T01:27:37.573 回答