我正在编写射线示踪剂(如果有所不同,请使用左手坐标)。这是为了自学原则,因此我不使用OpenGL或复杂功能(例如景深)。我的相机可以任意位置和方向;我通过三个向量指示它们, location, look_at, , 和 sky, ,表现得像 等效的POV射线向量. 。它的“电影”也有 widthheight. 。 (这 focal 长度暗示着距离 positionlook_at.)

我的问题是不知道如何铸造光线。我有两个数量, vxvy, ,这表明射线应该在哪里最终。它们都从-1到1不等。如果它们均为-1,我将射线从相机的位置投射到“电影”的左上角。如果他们俩都是1,则是最右边的;如果它们都是0,则中心;其余的很明显。

我对矢量算术不太熟悉,无法为射线提供方程式。我很高兴解释如何这样做。

有帮助吗?

解决方案

您已经描述了需要做得很好的事情。您的视野取决于相机和您将要播放光线的“胶卷”之间的距离。相机距离电影越远,您的视野越窄。

想象一下这部电影是相机指向的位图图像。假设我们将相机放置在一个远离位图的单元。然后,我们必须通过每个位图的像素施放射线。

向量非常简单。如果我们将摄像机位置放在(0,0,0),然后将其位于(0,0,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;
    ...
}

如果这很清楚,那么您只需为线路添加等效的外循环,就可以拥有所有需要的光线。

然后,您可以为相机的距离添加适当的变量到膜以及水平和垂直分辨率。完成此操作后,您可以通过矩阵转换开始更改外观向量和UP向量。

如果您想将头缠绕在计算机图形周围 入门教科书 可能有很大的帮助。我用了 这个 在大学里,我想我喜欢它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top