2012-03-10 121 views
0

我试图理解投影矩阵背后的数学,我发现this page。从该页面的矩阵:投影矩阵

Matrix

我发现这个矩阵类似于XNA的矩阵。

我明白他们是如何得到矩阵的m33和m44列,但他们如何得到m11和m22?而且我不明白为什么我必须给出宽高比,如果我已经给出了视角的话。

我想知道的最后一件事是:从ndc空间转换到窗口空间的方程是什么,以及它们如何达到这个方程?

+0

投影矩阵图片的链接是这样的:http://medialab.di.unipi.it/web/IUM/Waterloo/img284.gif – 2012-03-10 13:13:54

+0

这个答案可能有帮助吗? http://stackoverflow.com/questions/28286057/trying-to-understand-the-math-behind-the-perspective-matrix-in-webgl/28301213#28301213 – gman 2015-06-25 09:26:41

回答

0

如果屏幕是圆形的,FOV就足够了......但它们是矩形的,所以只有FOV是不够的。 FOV设置为屏幕高度,另一个是FOV乘以屏幕宽度与高度的比率。

m11虽然可以用来缩放宽度方向上的FOV。可以认为m22是在高度方向上缩放FOV的一种方式。

+0

感谢您的快速反应,但规模窗口拟合是当你转移到窗口空间并用这个方程乘以每个x,y时完成的:'xwin =(xndc + 1)* width * 0.5 + x ywin =(yndc + 1)* height * 0.5 + y' – 2012-03-10 18:13:38

+0

no,该代码看起来像是根据屏幕尺寸将位置分量(-1到+1空间,WVP输出WVP考虑后)转换为屏幕位置,并提供平移移位以将原点参考放置在左上角。这与X和Y方向上的FOV差异无关。通常,您刚刚展示的calc在顶点着色器和像素着色器之间的GPU管道中为您完成,因为您的图形设备知道您的视口尺寸。你是否手动确定3D位置的2D屏幕位置? – 2012-03-11 00:34:09

+0

不,我只是想了解“投影矩阵”是如何工作的,当我们理解某些东西时,更容易与之合作。我的问题是为什么我需要缩放x,如果它已经完成,当我们转换到屏幕位置 – 2012-03-11 16:53:31

0

您可以通过缩放得到的x和y坐标来改变视野:您可以缩放它们,获得更小的视野(放大),然后缩小它们,您将获得更大的视野查看(缩小)。 3D软件中使用的透视投影是直线的,所以如果你的视野足够大,边缘的变形将变得很严重,而且视场不能超过180°。

因为OpenGL和Direct3D中的剪辑坐标从-1运行到1,所以需要纵横比。在水平方向上-1是左侧,1是右侧。垂直方向-1是底部,1是顶部。所以,如果你想让你的方块真的出现一个正方形,你需要用纵横比缩小X坐标。