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

时间:2015-07-23 15:23:53

标签: c++ graphics 3d rendering pixel

我有以下(相对容易)的问题。我正在开发一个光线跟踪器,我正在按照此链接中解释的教程进行操作:

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)和向上/向右/看起来根本不使用矢量。似乎在每个教程中都使用不同的公式来映射像素,但我无法理解。 那么,如果我的相机没有放在(0,0,0)而是放在另一个我可以决定的位置呢?公式如何变化?愿你帮助我吗?谢谢!

2 个答案:

答案 0 :(得分:1)

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

如果您在本网站上进行了更多研究,您会找到答案。本网站的重点是解释这种技术。只是请期待任何人在SO上为你回答。你的问题应该在很大程度上被投票。这是纯粹的懒惰。

答案 1 :(得分:-1)

我建议您关注此链接: 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 Coord来说也是如此:

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