c – OpenGL:适合场景到屏幕

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

我想根据边界框(最小和最大)将场景调整到屏幕.

我把我的场景集中在这里:

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.)无济于事,因为它基于正交投影)

最佳答案 使用透视投影比使用正交投影更难以解决这个问题的原因是,您需要的最小值和最大值与透视投影不一致.

使用透视投影,当您远离相机时,可见区域的任一边缘之间的距离会增加.

使用透视投影,您通常会有一个视角,θ,一个摄影机位置和一个“看着”矢量,v.在任何距离,d从摄像机的位置(在v方向)你可以想象一个平面正常是v.你的相机可以“看到”的这个平面的区域有宽度:

2 * d * tan(theta / 2).

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

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

点赞