2009-11-09 30 views
0

我正在写一个光线跟踪器(使用左手坐标,如果这有所作为)。这是为了教我自己的原则,所以我没有使用OpenGL或复杂的功能,如景深(还)。我的相机可以有任意的位置和方向;我通过三个载体location,look_atsky表示它们,其行为与equivalent POV-Ray vectors相似。其“电影”也有widthheight。 (focal长度隐含的距离从positionlook_at。)如何投射任意相机的光线?

我的问题是,不知道如何投射射线。我有两个数量,vxvy,指示射线应该在哪里结束。它们都从-1到1变化。如果它们都是-1,我会将光线从相机的位置投射到“电影”的左上角;如果他们都是1,则右下角;如果他们都是0,那么这个中心;其余显而易见。

我对使用矢量算法推导射线方程式不够熟悉。我希望能解释如何这样做。

回答

1

你已经描述了什么需要做得相当好。您的视野取决于您的相机与您要投射光线的“电影”之间的距离。相机距离电影越远,视野越窄。

想象一下电影是相机指向的位图图像。假设我们将相机放置在距离位图一个单位之外。然后,我们必须通过每个位图的像素投射光线。

这个矢量非常简单。如果我们将相机位置设置为(0,0,0),并且位于其前面的位图胶片的中心位于(0,0,1),则右下角的光线是 - tada - (1, 1,1),左下角的是(-1,1,1)。

这意味着右下角和左下角之间的差异是(2,0,0)。

假设你的水平位图的分辨率应该是1000,那么你可以通过底线像素迭代如下:

width = 1000; 
cameraToBottomLeft = (-1,1,1); 
bottomLeftToBottomRight = (2,0,0); 

for (x = 0; x < width; x++) { 
    ray = cameraToBottomLeft + (x/width) * bottomLeftToBottomRight; 
    ... 
} 

如果是十分明显的,那么你只需要添加一个相当于外环为你的线条,和你拥有了所有你需要的光线。

然后,您可以为相机到胶片的距离以及水平和垂直分辨率添加适当的变量。完成之后,您可以开始通过矩阵变换来改变外观矢量和向上矢量。

如果你想围绕计算机图形学打包头,introductory textbook可能会有很大的帮助。我在大学时使用了this one,我想我喜欢它。

+0

谢谢,我现在就开始工作。 – Remy 2009-11-15 22:58:50