【问题标题】:Get bounding box for everything that can be seen in OpenGl获取在 OpenGL 中可以看到的所有内容的边界框
【发布时间】:2013-02-14 04:42:36
【问题描述】:

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

【问题讨论】:

    标签: opengl volume bounding-box


    【解决方案1】:

    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 的要求,但我看到很多关于挑选的问题。

    【讨论】:

    • 使用光线投射进行拾取需要相当冗长的解释,最好将其写成教程文章。我总是通过散列颜色值、在屏幕外渲染和从鼠标位置读取所述颜色来解决它。像魅力一样工作。
    • @BartekBanachewicz,对于几何问题来说听起来很沉重!就像旧的 GL_SELECT 模式渲染一样。
    • 非常感谢。这很有帮助。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 视情况而定。使用透视投影时是平截头体,使用正交投影时是方框。而且我什至还没有开始使用顶点着色器,它可以将几乎所有内容映射到所有内容。
      猜你喜欢
      • 1970-01-01
      • 2011-07-10
      • 2023-02-01
      • 1970-01-01
      • 2021-02-01
      • 2022-08-21
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      相关资源
      最近更新 更多