从像素到世界坐标公式解释

From pixel to world coordinate formula explanation

我有以下(相对简单的)问题。我正在开发一个光线追踪器,我正在按照 link:

中解释的教程进行操作

http://www.scratchapixel.com/code.php?id=3&origin=/lessons/3d-basic-rendering/introduction-to-ray-tracing

有一个公式我没有得到,它用于将像素 (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) 而是放在我可以决定的另一个位置怎么办?公式将如何变化?你能帮帮我吗?谢谢!

我建议您遵循此 link: https://www.opengl.org/wiki/Compute_eye_space_from_window_space

您的 x 范围在屏幕坐标 [0, WindowWidth] 中。 在第一行中,您在 [-1,1] 范围内的标准化设备坐标 (NDC) 中计算它。

x_NDC = ( x_Screen *2 / WindowWidth ) - 1;

您可以通过将 x_Screen 设置为最大值 (WindowWidth) 和最小值 (0) 来检查它。你得到 1 和 -1。 y坐标也一样:

y_NDC = ( y_Screen *2 / WindowHeight ) - 1;

您的 z 范围是 [Near,Far]。

z_NDC = ( z_Screen - Near ) / ( Far - Near);  // Here you have it scaled to [0,1]
z_NDC = 2*NDC -1 //Scaled to [-1,1];

获得 NDC 坐标后,只需将其与投影矩阵的逆矩阵和模型视图矩阵的逆矩阵相乘即可​​获得世界坐标。

http://scratchapixel.com/lessons/3d-basic-rendering/3d-viewing-pinhole-camera

如果您对该网站进行了更多研究,您就会找到答案。这个网站的重点是解释那种技术。在期望 SO 上的任何人为您回答之前,请先努力。您的问题应该被严重否决。这是纯粹的懒惰。