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

From pixel to world coordinate formula explanation

本文关键字:解释 世界坐标 像素      更新时间:2023-10-16

我有以下(相对简单的)问题。我正在开发一个光线追踪器,我正在遵循这个链接中解释的教程:

http://www.scratchapixel.com/code.php?id=3&起源=/经验/3 d-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)和向上/右/lookAt矢量根本没有使用。似乎在每个教程中都使用不同的公式来映射像素,我不知道原因。此外,如果我的相机不在(0,0,0)位置,而是在另一个我可以决定的位置呢?公式会如何变化?你能帮助我吗?谢谢!

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

如果你在这个网站上多做一些研究,你就会找到答案了。这个网站的重点就是解释这种技术。只是请在期待SO上的任何人回答你之前做出努力。你的问题应该会被严重否决。这纯粹是懒惰。

我建议你点击这个链接:https://www.opengl.org/wiki/Compute_eye_space_from_window_space

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

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

你可以通过设置x_Screen为Maximum (WindowWidth)和Minimum(0)来检查它。你得到1和-1。对于y轴也是一样的:

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

你的z范围是[近,远]。

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坐标后,只需将其与投影矩阵的逆和ModelView矩阵的逆相乘即可得到世界坐标。