3d 投影矩阵

3d 投影矩阵,3d,matrix,xna,projection,perspective,3d,Matrix,Xna,Projection,Perspective,我试图理解投影矩阵背后的数学原理,我发现。此页面中的矩阵: 我发现这个矩阵和Xna的矩阵很相似 我知道他们是如何到达矩阵的m33和m44列的,但他们是如何到达m11和m22的?我不明白为什么我必须给出纵横比,如果我已经给出了视场角度 我想知道的最后一件事是:从ndc空间到窗口空间的转换方程是什么?它们是如何得到这个方程的?如果屏幕是圆形的,FOV就足够了。。。但是它们是长方形的,所以仅仅视野是不够的。FOV设置为屏幕高度,另一个是FOV乘以屏幕宽高比 m11可以作为在宽度方向上缩放FOV的一种

我试图理解投影矩阵背后的数学原理,我发现。此页面中的矩阵:

我发现这个矩阵和Xna的矩阵很相似

我知道他们是如何到达矩阵的m33和m44列的,但他们是如何到达m11和m22的?我不明白为什么我必须给出纵横比,如果我已经给出了视场角度


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

如果屏幕是圆形的,FOV就足够了。。。但是它们是长方形的,所以仅仅视野是不够的。FOV设置为屏幕高度,另一个是FOV乘以屏幕宽高比

m11可以作为在宽度方向上缩放FOV的一种方式。
m22可以被认为是在高度方向上缩放FOV的一种方式。

您可以通过缩放生成的x和y坐标来更改视野:放大它们,您将获得更小的视野(放大),缩小它们,您将获得更大的视野(缩小)。3D软件中使用的透视投影是直线的,因此如果您的视野足够大,边缘的变形将非常严重,并且您的视野不能超过180°


您需要纵横比,因为OpenGL和Direct3D中的剪辑坐标从-1到1。在水平方向上-1为左,1为右。在垂直方向上-1为底部,1为顶部。因此,如果你想让你的正方形看起来像一个正方形,你需要用纵横比缩小X坐标

投影矩阵图的链接是:这个答案可能有用吗?感谢您的快速响应,但是当您转换到窗口空间并将每个x,y乘以以下等式时,缩放到窗口的匹配就完成了:'xwin=(xndc+1)*宽度*0.5+xywin=(yndc+1)*高度*0.5+y'不,该代码看起来像是用于转换位置组件的代码(在-1到+1空间中,考虑FOV后WVP的输出)根据屏幕尺寸设置屏幕位置,并提供平移移动,以将原点参考放置在左上角。这与X和Y方向上的FOV差异无关。通常,您刚才显示的计算是在图形设备k之后的顶点着色器和像素着色器之间的GPU管道中为您完成的现在是您的视口尺寸。您是否手动确定3d位置的2d屏幕位置?不,我只是想了解“投影矩阵”是如何工作,当我们理解一些东西时,就更容易使用。我的问题是,如果在转换到屏幕位置时x已经完成,为什么我需要缩放x?投影矩阵不知道视口尺寸(以像素为单位的宽度和高度)(它只知道视口的纵横比)当它将3d位置转换为2d屏幕位置时。因此…它输出一个从0到1的屏幕位置(0表示左侧或顶部,1表示右侧或底部)。输出可能类似(0.25687,0.67852)。这就像从左边缘向右移动约25%,从顶部向下移动约67%。从您的第一条注释开始,所有代码都会将其转换为特定视口的实际像素位置。但在所有这些之前…在下一条注释中继续,但在所有这些之前,要获得初始结果,它需要知道从宽到高的距离你的方形视口的io,因此它可以首先得出(0.25687,0.67852)。纵横比缩放FOV,这样你实际上有一个比高度更大的FOV。(在比高度更宽的典型视口中)因此,可以将其视为投影矩阵的一部分,该矩阵决定了视场宽度与视场高度。如果视口为圆形且半径恒定,则m11和m22都将为1。