1. 什么是BSP树
BSP算法的初始数据是一个多边形集,BSP在预处理的时候先在多边形集中选取一个多边形作为支持平面,然后根据这个平面将集合划分成两个部分,每个部分是一个新的子节点,递归进行该过程,直到每个子节点中的多边形都构成一个凸区域(最小凸边型),每个区域是一个叶节点,或成为cell,然后算法预计算在每个区域中可以见到哪些区域,得到PVS(潜在可见集)。
<IGNORE_JS_OP style="WORD-WRAP: break-word; WHITE-SPACE: normal; TEXT-TRANSFORM: none; WORD-SPACING: 0px; COLOR: rgb(51,51,51); FONT: 14px/21px Tahoma, Helvetica, SimSun, sans-serif; ORPHANS: 2; WIDOWS: 2; LETTER-SPACING: normal; BACKGROUND-COLOR: rgb(255,255,255); TEXT-INDENT: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">
下面是搜索 BSP 树的伪代码:
struct BSP_tree
{
plane partition;
list polygons;
BSP_tree *front, *back;
};
这个结构体定义在下面的讨论中将被一直使用。它[来源:GameRes.com]表示BSP树的一个接点,包含有一个分割平面,处于分割平面的多边形列表,以及指向子接点的指针。
void Buld_BSP_Tree( BSP_tree *tree, list polygons )
{
polygon *root = polygons.Get_From_List();
tree->partition = root->Get_Plane();
tree->polygons.Add_To_List( root );
list front_list, back_list;
polygon *poly;
while( ( poly = polygons.Get_From_List() ) != 0 )
{
int result = tree->partition.Classify_polygon(poly);
switch( result )
{
case COINCIDENT: // 共面
tree->polygons.Add_To_List(poly);
break;
case IN_BACK_OF:
back_list.Add_To_List(poly);
break;
case IN_FRONT_OF
front_list.Add_To_List(poly);
break;
case SPANNING:
polygon *front_piece, *back_piece;
split_Polygon( poly, tree->partition, front_piece, back_piece );
back_list.Add_To_List( back_piece );
front_list.Add_To_List( front_piece );
break;
}
}
if( !front_list.Is->Empty_List() )
{
tree->front = new BSP_tree;
Build_BSP_Tree( tree->front, front_list );
}
if( !back_list->Is_Empty_List() )
{
tree->back = new BSP_tree;
Build_BSP_Tree( tree->back, back_list );
}
}
Buld_BSP_Tree函数根据以上说明的步骤递归地建立BSP树。它使用输入的多边形列表中的第一个多边形所在的平面作为分割平面,假定此列表中的每一个多边形都为凸多边形。
复制代码
代码来源于网络