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,然后在较小的列表上对截锥体和/或网格使用更精确的边界体积执行更准确的测试。
谢谢!我只是很好奇,当它不是一个盒子或者更多的金字塔形状时,如何在平截头体中有一个AABB。 – 2011-06-09 04:55:32
谢谢澄清! – 2011-06-09 05:12:36