如何在纯OpenGL的屏幕上显示所有内容的边界框?我希望边界框的所有8个点都有X,Y和Z.
答案 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,而不是框。