bsp:二叉分割樹,在遊戲中用來分割區域性空間,方便碰撞檢測等的實現。
下面介紹一種簡單易用的分割方法:分割步驟:一、將空間中的所有的面,加入的根部節點。二、遍歷根部節點的所有面,分別找到x、y、z的最大最小值,給根節點指定乙個合適的包圍空間。三、在這個節點的包圍空間裡找到最長軸、並按這個最長軸的中間點做為新的分割點,遍歷該節點的所有面將其分在其左右子節點中。四、返回第2步,直到達到一定限制條件,結束,此時空間已經被分開了。當然閒話不說,貼上實現模擬**:
#include"stdafx.h"
#include
#include
#include
using
namespace
std;
struct
point ;
point(float
a,float
b,float
c):x(a),y(b),z(c){}
void
operator+=(
intn)
void
operator=(point&p) };
struct
face };
struct
bbox };
enum
eaxis ;
struct
treenode
intndepth;
treenode*plchild;
treenode*prchild;
std::vector>vfaceid;
intaxis;
bboxbox;
float
split; };
std::map,face>m_mface;
face*getfacebyid(int
nid)
return
null; }
class
bsptree ;
~bsptree()
}//初始化樹根
void
inittreeroot(treenode*pnode);
//釋放整個樹的資源
void
deletenode(treenode*pnode);
//生成aabb包圍盒
void
buildaabb(treenode*pnode);
//切分整個空間
void
splitspace(treenode*proot,
intnaxis,
in***epth);
//切分面
void
splitface(
intnfaceid,
float
fsplit,
intnaxis,
int*pleftnum,
int*prightnum,
int*pbothnum);
//遍歷整個樹
void
ergodictree(treenode*pnode);
protected:
private:
treenode*m_proot;
};void
bsptree::inittreeroot(treenode*pnode)
void
bsptree::deletenode(treenode*pnode)
//遍歷整個樹
void
bsptree::ergodictree(treenode*pnode)
case
axis_y:
case
axis_z: }
ergodictree(pnode->prchild);
}void
bsptree::buildaabb(treenode*pnode) }
pnode->box.max=max;
pnode->box.min=min;
}int
comparefloat(
float
a,float
b,float
foff)
void
bsptree::splitface(
intnfaceid,
float
fsplit,
intnaxis,
int*pleftnum,
int*prightnum,
int*pbothnum)
for(int
i=0;i<3;i++)
*pleftnum=nleftcount;
*prightnum=nrightcount;
*pbothnum=nbothcount;
}void
bsptree::splitspace(treenode*proot,
intnaxis,
in***epth)
proot->plchild=new
treenode;
proot->prchild=new
treenode;
proot->plchild->box.max=proot->box.max;
proot->plchild->box.min=proot->box.min;
proot->prchild->box.max=proot->box.max;
proot->prchild->box.min=proot->box.min;
naxis=(int
)axis_x;
float
xlength=proot->box.max.x-proot->box.min.x;
float
ylength=proot->box.max.y-proot->box.min.y;
float
zlength=proot->box.max.z-proot->box.min.z; if
(ylength>xlength) if
(zlength>xlength)
float
fslit=0.0f;
switch
(naxis)
break;
case
axis_y:
break;
case
axis_z:
break;
}proot->split=fslit;
intnsize=proot->vfaceid.size();
intnleftcount,nrightcount,nbothcount;
for(int
n=0;n
proot->vfaceid.clear();
//遞迴
splitspace(proot->plchild,naxis,ndepth+1);
splitspace(proot->prchild,naxis,ndepth+1);
}int
_tmain(
intargc,_tchar*argv)
bsptree.inittreeroot(proot);
bsptree.buildaabb(proot);
bsptree.splitspace(proot,0,0);
bsptree.ergodictree(proot);
getchar();
return0;
}
模擬實現空間配置器
實現背景 malloc在申請空間的時候會有很多缺陷,比如 效率比較低下,容易造成記憶體碎片,也容易造成空間額外的浪費,如果使用者自己釋放空間操作不當,還會產生記憶體洩漏的問題 實現方法 若使用者申請的空間大於128位元組,定為大塊記憶體,採用一級空間配置器的處理方法 若使用者申請的空間小於等於128...
二元空間分割樹 BSP (二)
來自於 在渲染3d遊戲的室內場景時,bsp樹是往往是乙個比較複雜但非常有效的方法。它可以用來進行高效的深度檢測。深度檢測通常 用來決定哪個物體離視點更遠,然後再根據從遠到近進行多邊形繪製,這樣出來的結果才是正確的。首先給出乙個圖,我們可以看出在removal b區域,白色的多邊形覆蓋了黃色多邊形,而...
模擬實現Spring IOC
通過在類上標註 registration 註冊進容器,injection從容器注入物件 容器類 public class springcontainer else bean.setbeanclass c mappropsmap new hashmap 處理注入屬性 field props c.get...