“透视投影矩阵”的FOV似乎不正确

本文关键字:FOV 不正确 透视投影 | 更新日期: 2023-09-27 17:59:17

根据MSDN上的教程,我正在使用SharpDX从头开始编写"3D软引擎"。然而,我无法使我的预期视野和实际视野相匹配。

我现在简化的世界由四个3D顶点组成,其中Z=0位于(0,1,0);(0,-1,0);(1,0,0);(-1.0,0)。我把相机放在(0,0,2)上,看着(0,0,0),(0,1,0)向上。我设置了FOV为90度(PI/2弧度)的投影矩阵,并准备通过调用Vector3.TransformCoordinate(Vector3, Matrix)来渲染四个顶点中的每一个。

我的理解是FOV用于计算可以应用于每个(Y,Z)对的比例因子1/TAN(FOV/2),使得y' = y * scale / z。类似地,给定纵横比,也计算(X,Z)对的比例。

对于90度的(垂直)FOV和相机距离2,我希望我的所有顶点都离位图的边缘相当远。然而,顶部和底部顶点的Y值分别为-0.49和+0.49,这意味着如果渲染,它们实际上会接触到屏幕边界。我是否误解了FOV的概念?我看到的结果是我对大约53度视场的期望。就好像切线在取倒数之前被减半了。。。

我第一次尝试这个是在(0,0,1)和FOV为90度的相机上,因为我确信比例因子会是1(1/TAN(90/2) = 1),但顶点在屏幕外。

“透视投影矩阵”的FOV似乎不正确

透视变换将坐标从摄影机空间转换为剪辑空间。

摄影机空间是一个以摄影机为原点的普通笛卡尔系统。

剪辑空间是一个临时空间,之后会映射到视口。对于视口内的点,xy坐标都在范围[-1, 1]内。