【发布时间】: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 是观察平面和相机眼睛之间的距离,dx 和 dy 是从中心在 x 和 y 方向上的位移视平面。
ConstructRayThroughPixel(...) 函数非常适合眼睛位于 (0,0,0) 的相机。但是,当相机位于某个不同的位置时,并非为图像产生所有需要的光线。
有什么建议可能会出错吗?也许我的方程式有问题?
感谢您的帮助。
【问题讨论】:
-
我认为您不需要矢量图形标签。矢量图形通常是指一种文件格式,它以一种形式存储数据,意思是“从 (x1,y1) 到 (x2,y2) 画一条线,厚度为 t,颜色为 c”。而您将逐像素存储数据,不是吗?
-
好吧,我正在使用场景文件格式来显示我的图形,该图形以您描述的类似形式存储数据,但我的问题与此无关。我误解了“矢量图形的含义”-.-
标签: graphics camera raytracing