OpenGL:使场景适合屏幕

OpenGL: Fit scene to screen

我有一个带透视投影的 3D 场景。

我想根据边界框(minmax)使场景适合屏幕。

我将我的场景居中:

glm::vec3 center = (min + max) / 2.0f;
rootNode->translate(-center.x, -center.y, -center.z);

现在我需要一个缩放因子来缩放我的 rootNode 以适应屏幕。 我该怎么做?

(这:8.070 How can I automatically calculate a view that displays my entire model? (I know the bounding sphere and up vector.) 没有帮助,因为它基于正交投影)

这个问题在透视投影中比在正交投影中更难的原因是你需要的 minmax 在透视投影中不是常数。

对于透视投影,可见区域的任一侧之间的距离随着您远离相机而增加。

对于透视投影,您通常有一个视角 theta、一个相机位置和一个 "looking at" 矢量 v。在距相机位置 d 的任意距离(v 方向),您可以想象一个法线为 v 的平面。您的相机可以 "see" 的平面区域宽度为:

2 * d * tan(theta / 2).

在简单的固定相机设置中,您可能将相机放在原点并向下看 z 轴,然后任何点的距离 d 将只是该点的 z 坐标.

另请注意,您可能具有不同的水平和垂直视野角度。如果您设置了垂直视角 "fovy" 和纵横比(视口宽度/视口高度),那么您的水平视角是垂直视角乘以纵横比。