【发布时间】:2013-02-14 04:42:36
【问题描述】:
如何在纯 OpenGL 中在屏幕上可见的所有内容上获得边界框?我想要边界框的所有 8 个点的 X、Y 和 Z。
【问题讨论】:
标签: opengl volume bounding-box
如何在纯 OpenGL 中在屏幕上可见的所有内容上获得边界框?我想要边界框的所有 8 个点的 X、Y 和 Z。
【问题讨论】:
标签: opengl volume bounding-box
OpenGL 没有定义您在屏幕上看到的固定“盒子”体积。从某种意义上说,应用程序定义了这些边界 - which do not, in general, form a rectangular prism - 使用变换和投影。最接近这种“边界框”的是标准化设备坐标空间或投影后的 3d 视口。
在世界坐标空间中包含所有几何图形的bounding box 是您必须从数据中确定的内容,与 GL 管道无关。
要恢复世界坐标空间 (WCS) 中映射到视口角的点,您需要了解矩阵变换和齐次坐标的工作原理。
投影(除以 W)后标准化设备坐标空间 (NDCS) 中的“前”或“近”平面为:Z/W = -1。 NDCS 是一个左手坐标空间。
这对应于超平面:Z = - W,在剪切坐标空间中,所以任何(同质)点的形式:(x, y, -z, z) 将投影到:(x/z, y/z, -1, 1)。
映射到 3D 视口的规范视图体积定义为:-1 <= X/W <= 1, -1 <= Y/W <= 1, -1 <= Z/W <= 1,以 (6) 个超平面为界:
X ± W = 0, Y ± W = 0, Z ± W = 0(齐次裁剪平面)
因此可以扩展上述内容以找到与对应于 3d 视口的视图体积的“角”相对应的(齐次)坐标。考虑视口的右上角,在“近”平面上。它对应于:(1, 1, -1, 1),尽管以下形式的任何点:(W, W, -W, W) 都将投影到相同的 3D (NDCS) 点。
给定一些矩阵:[M] 将点 P(在 WCS 中)转换为产生 Q = (1, 1, -1, 1),然后只需使用逆(矩阵)变换:P = inv[M] * Q
同样的想法可以应用到每个“角落”。它对于拾取也非常有用 - 拾取光线从“眼睛”延伸到 (x, y, -1, 1) 的 WCS 逆投影。
注意:这比我打算详细介绍的要详细,并且可能超出了 OP 的要求,但我看到很多关于挑选的问题。
【讨论】:
为什么需要 OpenGL?是你在画东西,所以只需对你的所有数据运行一个函数。考虑投影并丢弃视图体积之外的结果;检查非常简单,尤其是在使用正交投影时。
【讨论】:
我认为在 OpenGL 中,屏幕上显示的是 frustum,而不是框。
【讨论】: