【发布时间】:2015-07-23 15:23:52
【问题描述】:
我有以下(相对简单的)问题。我正在开发一个光线追踪器,我正在按照此链接中解释的教程进行操作:
有一个我不明白的公式,它用于将像素 (i,j) 映射到世界坐标。公式如下:
float fov = 30, aspectratio = width / height;
float angle = tan(M_PI * 0.5 * fov / 180.);
float xx = (2 * ((x + 0.5) * invWidth) - 1) * angle * aspectratio;
float yy = (1 - 2 * ((y + 0.5) * invHeight)) * angle;
在本教程中,相机放置在 (0,0,0) 并且完全不使用 up/right/lookAt 向量。似乎在每个教程中都使用不同的公式来映射像素,而我无法理解原因。 此外,如果我的相机不是放置在 (0,0,0) 而是放置在我可以决定的另一个位置怎么办?公式将如何变化?你能帮帮我吗?谢谢!
【问题讨论】:
-
您可以通过两种不同的方式查看运动:1) 相机移动而世界静止,2) 世界移动而相机静止。如果您将相机固定在 (0, 0, 0) 并将上/右/注视方向固定在本地 y/x/z 方向,那么如果您想通过矢量
v移动相机,您可以改为移动-v的世界并使用相同的代码。与旋转相同,不是将相机旋转theta,而是将世界旋转-theta。 -
这节课都解释了:scratchapixel.com/lessons/3d-basic-rendering/… 我不敢相信有些人懒到不阅读人们付出了很多努力的工作,直接去SO问他们提到的参考文献中回答了一个问题。
标签: c++ graphics 3d rendering pixel