c++ - OpenGL:使场景适合屏幕

标签 c++ opengl math graphics glm-math

我有一个带透视投影的 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、一个相机位置和一个“注视” 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/

相关文章:

c++ - 鼠标位置改变绘制立方体的大小

c++ - MFC Rich编辑控件2.0文本颜色

opengl - 关于 OpenGL 纹理坐标

math - 在网络上编写数学方程的最佳方法是什么?

string - 给定一个字符串,计算字符串没有重复(和禁止字符)的排列数

c# - 计算 "Pie Segment"和 "sub areas"区域的边界点

c++ - 使用 Unix 域套接字 (UDS) 替代 splice(2)

c++ - xlw:如何使用新的 typedef 从 Excel 单元格中获取 std::string(并可能填充 std::map)

performance - 优化 GPU 利用率处理离散图像的技术

c# - 快速多窗口渲染