Bsp 空間分割模擬實現

2021-08-26 07:25:50 字數 3677 閱讀 9187

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...