glm :: perspective的fov参数是否定义为视场角的一半?

时间:2019-06-23 17:14:08

标签: c++ opengl rendering glm-math perspectivecamera

我正处于我在OpenGL中编写的渲染器的优化阶段,下一步是剔除我看不到的所有内容。在阅读this和其他资源时,我看到了平截头体的视觉描述,如:

Frustum

图片来自:https://www.scratchapixel.com/images/upload/perspective-matrix/camsetup1.png

因此认为我们传递了类似glm::radians(90.0f)之类的东西。但是,我开始遇到算法的剔除问题,因为我认为我会沿着飞机的左右方向旋转45度...但是后来我开始出现假阳性剔除。一旦我将其更改为使用传递给fov的{​​{1}}角度,则清除工作开始正常。

但是我不确定两件事:

  1. 我说的正确吗?如上图所示,fov值应为绿角的一半吗?
  2. 如果(1)是true,那么为什么fov为90并不能向我显示我左右两侧的一切?

这些对于我来说很重要,因为我想让剔除算法尽可能地被剔除而不会出现误报。您可能会猜到,我收到了误报,因为我认为“我需要将用于glm::perspective的第一个参数再除以2以得到一半的角度”,这导致了更紧密的截锥体剔除比应有的更多。

我当前选择的方法是计算平截头体的左边缘和右边缘,并通过点积剔除左边缘或右边缘(就像它们是线段)无法看到的任何2D线。这就是为什么狭窄的角度让我感到悲伤。顺便说一句,如果有更好的方法可以做到这一点,请告诉我,尽管我认为两种点积可能是我要检查的直线计算效率上最便宜的一种。

1 个答案:

答案 0 :(得分:2)

glm::perspectivefov参数是视锥的底部到顶部的角度( y 轴)。
如果视口是矩形,并且视口的宽度大于高度(并且fov <180°),则从左到右的角度大于从上到下的角度:

aspect = width / height
fov_x  = atan(tan(fov_y/2) * aspect) * 2