OpenGL:屏幕上3D边界框的大小

时间:2013-02-04 10:42:44

标签: opengl

我需要一种简单快速的方法,通过使用OpenGL Modelview和Projection矩阵以及OpenGL视口尺寸,找出3D边界框在屏幕上显示的大小(用于LOD计算)。

我的第一个目的是使用gluProject()在屏幕上投射所有8个方框角,然后计算凸包的面积。此解决方案仅适用于完全位于视锥体内的边界框。

但是如何在屏幕上获取未完全在观看体积内的盒子?对一个盒子进行成像,其中7个角落在近平面后面,并且只有一个角落在近平面的前面,因此在视锥体内。

我找到了另一个非常相似的问题Screen Projection and Culling united,但它没有涵盖我的问题。

2 个答案:

答案 0 :(得分:2)

如何使用查询并获取通过渲染的样本?

http://www.opengl.org/wiki/Query_Object并参阅GL_SAMPLES_PASSED,

通过这种方式,您可以测量渲染的碎片数量,并将其与正确的LOD选择进行比较。

答案 1 :(得分:1)

为什么不手动将世界视图投影与顶点位置相乘?这将为您提供“标准化设备坐标”中的顶点,其中-1是屏幕的左下角,+1是屏幕的右上角?

唯一的事情是如果投影是透视,你必须将你的顶点除以它们的第4个分量,即如果最终的顶点是(x,y,z,w)你将除以w。

以位置向量

为例
v = {x, 0, -z, 1}

给定垂直视角'a'和宽高比'r',x'在标准化设备坐标(范围0-1)中的位置就是这个(这个公式直接取自图形编程书):

x' = x *  cot(a/2) / ( r * z )

因此,给定参数的透视投影将如下所示(以行主格式显示):

cot(a/2) / r     0      0    0
     0        cot(a/2)  0    0
     0           0      z1  -1
     0           0      z2   0

当您将矢量乘以投影矩阵(假设世界,视图矩阵在此示例中是标识)时,您得到以下内容(我只计算新的“x”和“w”值,因为它们仅在这个例子)。

v'= {x * cot(a / 2)/ r,newY,newZ,z}

所以最后当我们将新矢量除以第四个分量时,我们得到了

v'= {x * cot(a / 2)/(r * z),newY / z,newZ / z,1}

所以v'.x现在是屏幕空间坐标v.x.这正是图形管道确定顶点在屏幕上的位置。

我之前使用过这个基本方法来计算屏幕上几何体的大小。关于它的好处在于,无论投影是透视还是正投影,数学都可以工作,只要除以矢量的第4个分量(对于正交投影,第4个分量将为1)。