我有以下(相对容易)的问题。我正在开发一个光线跟踪器,我正在按照此链接中解释的教程进行操作:
有一个我没有得到的公式,用于将像素(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)而是放在另一个我可以决定的位置呢?公式如何变化?愿你帮助我吗?谢谢!
答案 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坐标后,只需将其与投影矩阵的逆矩阵和逆模型矩阵相乘即可得到世界坐标。