2011-06-09 193 views
1

我正在渲染一个旧的游戏格式,我有一个组成你是在网格列表。我终于得到了PVS(区域可见从另一个区域)工作和这削减了很多我不需要渲染但不太多的网格。所以现在,我应该渲染的网格列表仅包含我可以看到的其他网格。但它并不完美。仍然有很多网格包括超过剪辑的真正遥远的网格。边界框平截头体渲染 - 距离渲染 - OpenGL

现在首先,我试图挑出不在我的视角内的网格。我听说一个边框是最好的方法去做这件事。有没有人有一个关于如何去做这件事的想法?我知道我需要最大点(x,y z)和最小点(x,y z),以便一个盒子包含所有的顶点。

然后,我检查一下,看看这两点之一是否在我的视角?这很简单吗?

谢谢!

回答

2

AABB或轴对齐边界框是用于测试两个3D区域的相交/包含的非常简单且快速的对象。

正如您所建议的,您正在计算要比较的两个区域的最小值和最大值x,y,z,例如描述平截头体的区域和描述网格的区域。它是轴对齐的,因为随后的立方体的边与坐标系的每个轴都平行。显然,这可能会有些不准确(交集/遏制的误报,但绝不会出现假阴性),所以一旦用AABB测试筛选列表,您可能会考虑对其余网格进行更准确的测试。

您测试相交/遏制如下:

F =平截头体的AABB

M =网格

bool is_mesh_in_frustum(const AABB& F, const AABB& M) 
{ 
    if(F.min.x > M.max.x || M.min.x > F.max.x || F.min.y > M.max.y || M.min.y > F.max.y || F.min.z > M.max.z || M.min.z > F.max.z) 
    { 
     return false; 
    } 
    return true; 
} 

还可以查找算法包围球,方向包围的AABB盒子(OBB)和其他类型的边界卷。根据您渲染的网格数量,您可能需要也可能不需要更准确的方法。

要首先创建一个AABB,您可以简单地走过网格的顶点并记录您遇到的最小/最大x和y和z值。还可以考虑,如果网格不变形,那么网格坐标空间中的边界框将是静态的,因此,只要有顶点数据,就可以为所有网格计算AABB。

然后你只需要确保你变换预先计算的AABB最小值和最大值的顶点为圆台坐标空间,你做了测试每个渲染通道之前。

(征求意见)编辑:

的AABB可以提供假阳性,因为它充其量你界定该区域的精确形状,但更通常比你边界的区域更大。

考虑一个球,如果你使用AABB,它就像把一个篮球成箱,你把所有这些在框,球斜面接触不到的角落缝隙。

或者对于截锥体向内照相机倾斜的情况,AABB将沿着朝向照相机的轴简单地继续,实际上限制了比照相机大的区域。

这是一个不准确的来源,但它不应该导致你剔除一个甚至稍微在平截头体内部的对象,所以在最坏的情况下,你仍然会画出一些靠近相机但仍然不在平截头体内的网格。

您可以通过首先进行AABB测试并生成一个较小的网格列表来返回true,然后在较小的列表上对截锥体和/或网格使用更精确的边界体积执行更准确的测试。

+0

谢谢!我只是很好奇,当它不是一个盒子或者更多的金字塔形状时,如何在平截头体中有一个AABB。 – 2011-06-09 04:55:32

+0

谢谢澄清! – 2011-06-09 05:12:36