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

标签 opengl volume bounding-box

如何在纯 OpenGL 中为屏幕上可见的所有内容设置边界框?我想要边界框的所有 8 个点的 X、Y 和 Z。

最佳答案

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

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


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

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

这对应于超平面:Z = - W ,在裁剪坐标空间中,所以形式的任何(齐次)点:(x, y, -z, z)将转换到:(x/z, y/z, -1, 1) .

映射到 3D 视口(viewport)的规范 View 体积由以下定义:
-1 <= X/W <= 1, -1 <= Y/W <= 1, -1 <= Z/W <= 1 , 以 (6) 个超平面为界:

X ± W = 0, Y ± W = 0, Z ± W = 0 (the homogeneous clipping planes)

因此可以扩展上面的内容以找到对应于对​​应于 3d 视口(viewport)的 View 体积的“角”的(齐次)坐标。考虑视口(viewport)的右上角,在“近”平面上。对应于:(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 的要求,但我发现关于选择的问题经常出现。 p>

关于opengl - 获取在 OpenGl 中可以看到的所有内容的边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14855206/

相关文章:

c++ - glutWarpPointer() 在应用程序处于事件状态时不工作

linux - Linux 图形系统与 GPU 对话的最低级别开放/公共(public) API 是什么?

java - 使用 VAO 和 VBO 在 LWJGL 3 中渲染四边形时出现问题

macos - 如何从Core-Audio中的输入设备获取音量数据?

javascript - 为什么 getBoundingClientRect 只能在本地工作?

java - 为什么我的 GeoJsonLayer.boundingBox 等于 null?

opengl - 如何使用 glGetTexImage 从立方体贴图读取数据到 OpenGL 中的 CPU?

audio - 如何显示麦克风的当前音量?

ios - 在 iOS 11 中播放音乐库时更改和隐藏音量 HUD(音量叠加)

boost - 在Boost库中计算Voronoi图的边界框是什么