1

我正在写一个光线追踪器(使用左手坐标,如果有区别的话)。这是为了自学原理,所以我还没有使用 OpenGL 或像景深这样的复杂功能。我的相机可以有任意的位置和方向;我通过三个向量 、 和 来表示它们locationlook_at它们的sky行为类似于等效的 POV-Ray 向量。它的“电影”也有一个widthheight。(长度隐含从到focal的距离。)positionlook_at

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

我对矢量算术不够熟悉,无法推导出射线的方程。我将不胜感激如何做到这一点的解释。

4

1 回答 1

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;
    ...
}

如果这很清楚,那么你只需为你的线条添加一个等效的外环,你就拥有了你需要的所有光线。

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

如果您想深入了解计算机图形学,一本介绍性教科书可能会有很大帮助。我在大学用过这个,我想我喜欢它。

于 2009-11-09T21:51:36.197 回答