获取OpenGl中可以看到的所有内容的边界框

时间:2013-02-13 13:56:14

标签: opengl volume bounding-box

如何在纯OpenGL的屏幕上显示所有内容的边界框?我希望边界框的所有8个点都有X,Y和Z.

3 个答案:

答案 0 :(得分:3)

OpenGL没有定义您在屏幕上看到的固定“盒子”音量。从某种意义上说,应用程序使用变换和投影来定义这些边界 - which do not, in general, form a rectangular prism。这种“边界框”最接近的是标准化设备坐标空间或投影后的3d视口

世界坐标空间中包含所有几何体的bounding box是您必须根据数据确定的,并且与GL管道无关。


要恢复映射到视口角落的世界坐标空间(WCS)中的点,您需要了解矩阵变换和齐次坐标的工作原理。

投影后的标准化设备坐标空间(NDCS)中的“前”或“近”平面(除以W)为:Z/W = -1。 NDCS是左手坐标空间。

这对应于剪切坐标空间中的超平面Z = - W,因此表单的任何(同类)点:(x, y, -z, z)将投影到:{{1} }。

映射到3D视口的规范视图体积由以下内容定义:
(x/z, y/z, -1, 1),以(6)超平面为界:

  

X±W = 0,Y±W = 0,Z±W = 0(均匀削波平面)

因此,可以扩展以上以找到对应于视图体积的“角”的(均匀)坐标,其对应于3d视口。考虑视口的右上角,在“近”平面上。它对应于:-1 <= X/W <= 1, -1 <= Y/W <= 1, -1 <= Z/W <= 1,但形式的任何一点:(1, 1, -1, 1)都会投射到相同的3D(NDCS)点。

给定一些矩阵:(W, W, -W, W)转换点[M](在WCS中)以产生P,然后只需使用逆(矩阵)变换:{{1} }

同样的想法可以应用于每个“角落”。它对于拾取非常有用 - 拾取光线从“眼睛”运行到Q = (1, 1, -1, 1)的WCS反投影。


注意:这比我打算进行的更详细,可能超出OP的要求,但我看到有关选择的问题出现了很多。

答案 1 :(得分:1)

为什么你需要OpenGL呢?这是你绘制的东西,所以只需在你的所有数据中运行一个函数。考虑投影并在视图体积外丢弃结果;这些检查非常简单,特别是在使用正交投影时。

答案 2 :(得分:0)

我认为在OpenGL中,屏幕上的内容是frustum,而不是框。