我有一个带透视投影的 3D 场景。
我想根据边界框(min
和 max
)使场景适合屏幕。
我的场景是这样居中的:
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.) 没有帮助,因为它基于正交投影)
最佳答案
这个问题在透视投影中比在正交投影中更难的原因是你需要的 min
和 max
在透视投影中不是常量。
在透视投影中,可见区域的任一侧之间的距离随着您远离相机而增加。
对于透视投影,您通常有一个视角theta
、一个相机位置和一个“注视” vector v
。在距相机位置 d
的任意距离(v
方向),您可以想象一个法线为 v
的平面。您的相机可以“看到”的这个平面区域的宽度为:
2 * d * tan(theta / 2).
在简单的固定相机设置中,您可能将相机放在原点并向下看 z 轴,然后任何点的距离 d
将只是该点的 z
坐标。
另请注意,您可能具有不同的水平和垂直视野角度。如果您设置了垂直视野角“fovy”和宽高比(视口(viewport)宽度/视口(viewport)高度),那么您的水平视野角就是垂直视野角乘以宽高比。
关于c++ - OpenGL:使场景适合屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30337801/