适合场景到屏幕

OpenGL: Fit scene to screen

本文关键字:屏幕      更新时间:2023-10-16

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

我想根据边界框(minmax)将场景适配到屏幕上。

我设置了这样的场景居中:

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

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

(this: 8.070)如何自动计算显示整个模型的视图?(我知道边界球和向上向量)没有帮助,因为它基于正交投影)

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

在透视投影中,当你离开相机时,可见区域的两个边缘之间的距离会增加。

对于透视投影,你通常有一个视角,theta,一个相机位置,和一个"看"向量,v。在距离摄像机位置(在v的方向上)d的任意距离上,你可以想象一个法线为v的平面。这个平面中你的相机可以"看到"的区域的宽度为:

2 * d * tan(theta / 2).

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

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