我正在写一个光线追踪器(使用左手坐标,如果这有所不同)。这是为了教自己原理,所以我没有使用OpenGL或像景深这样的复杂功能。我的相机可以有任意位置和方向;我通过三个向量location
,look_at
和sky
来表示它们,它们的行为类似于equivalent POV-Ray vectors。它的“电影”也有width
和height
。 (从focal
到position
的距离暗示look_at
长度。)
我的问题是不知道如何投射光线。我有两个数量vx
和vy
,用于指示光线应该在哪里结束。它们都从-1到1不等。如果它们都是-1,我将光线从相机的位置投射到“电影”的左上角;如果它们都是1,则右下角;如果他们都是0,那么中心;其余的很明显。
我对矢量算法不太熟悉,无法推导出射线方程。我很感激如何解释。
答案 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,我觉得我喜欢它。