我意识到这个问题已经问了很长时间(至少可以说),但我有一个很好的图表,如果发布它似乎很遗憾,因为我觉得它在这里很有用.如图所示,视场(theta)与图像平面(d)的距离之间的关系是:
tan(theta/2) = ymax/d
Run Code Online (Sandbox Code Playgroud)

“镜头长度”没有任何意义。OpenGL 和 DirectX 中的“镜头”是针孔相机,因此没有尺寸(即无限小)。
如果您谈论的是焦距,那么这又没有关系,因为焦距意味着镜头和景深。
但是,您可以以您喜欢的任何单位计算相机相对于屏幕的位置(这是我教给我的“透视参考点”)。
假设屏幕宽 1 米,FOV 为 90 度(PI/2 弧度)。使用基本的三角学你知道
tan( fov / 2 ) = opposite/adjacent.
Run Code Online (Sandbox Code Playgroud)
你知道相反的(因为它是半米,即屏幕的一半)
因此,要计算邻近(即从屏幕到相机位置的距离),您只需执行以下操作:
adjacent = opposite / tan( fov / 2 )
Run Code Online (Sandbox Code Playgroud)
通过上面的简单数字,可以得出:
adjacent = 0.5 / tan( PI / 4 )
=> 0.5 / 1.0
=> 0.5
Run Code Online (Sandbox Code Playgroud)
即在这种情况下,相机将距离屏幕半米(当您考虑 90 度视野时,这是非常合乎逻辑的)。
当然,所涉及的单位有些随意......
如果你接着看的话。相机位置距离屏幕越近,FOV 越宽,同样,相机位置越远,FOV 越窄。如果你把这些画出来,你就会明白为什么。
在此基础上,您可以计算出距离屏幕“n”米远的人的完美视场……
想象一条距相机距离 d 处单位长度的水平线,其视野(即张角)被设置为使得距离 d 处的单位长线恰好覆盖图像宽度(或高度,具体取决于什么情况)您测量视场),然后 d 是镜头长度。当然你也可以进行逆计算。
tan(0.5 视场) = 0.5 d