Unity八叉樹及導(dǎo)航
樹的組織特點(diǎn):一種只有唯一的上級和若干下級的概念結(jié)構(gòu)。
對于八叉樹來說則是:只有唯一的上級和最多八個(gè)下級,而在本例中,下級節(jié)點(diǎn)的數(shù)量只會為0(null)或8。

聲明:
請確??赐炅艘曨l,我會直接講解我的改動(dòng)與添加。
0.有物體的區(qū)域,Draw的線框改色
1.物體位移重建線框(樹的數(shù)據(jù))
2.通過點(diǎn)的坐標(biāo)得到其所在的小區(qū)塊
3.導(dǎo)航

改色
在OctreeNode的DivideAndAdd方法中
這個(gè)if只有在遞歸的時(shí)候才會觸發(fā),因?yàn)槲覀儾惶赡茉O(shè)計(jì)根物體尺寸小于最小尺寸。
那么,進(jìn)入遞歸表明這個(gè)區(qū)域涉及到了物體,而走進(jìn)這個(gè)if表明這個(gè)區(qū)域已經(jīng)是預(yù)設(shè)的最小單位。
上面的if先檢測了子節(jié)點(diǎn)的區(qū)域是否涉及物體,然后再去遞歸,
上面return服務(wù)于,一個(gè)與物體Bounds相交并且尺寸小于minSize的子節(jié)點(diǎn)區(qū)域,使其不再產(chǎn)生子節(jié)點(diǎn),并且置紅顏色表示這個(gè)區(qū)域與物體相交。

重建線框
1) 在Octree類中,把構(gòu)造方法中建立數(shù)據(jù)組織的語句封裝給另一個(gè)函數(shù),為了更簡單的調(diào)用我把這個(gè)方法記錄在了一個(gè)UnityAction中。
2) 寫一個(gè)Mono腳本,當(dāng)檢測物體的變換發(fā)生改變時(shí),調(diào)用UnityAction。

定位點(diǎn)所在小區(qū)塊
1) 重新組織數(shù)據(jù)
將一個(gè)父區(qū)域切割為八個(gè)小區(qū)域,其所作的操作就是:
過立方體的中心,在其X、Y、Z軸做切線。
我直接舉實(shí)例:
先判斷點(diǎn)在大區(qū)域的中心的左右位置,能排除8個(gè)可能中的4個(gè),
在判斷點(diǎn)在大區(qū)域的中心的上下位置,能排除4個(gè)可能中的2個(gè),
最好判斷點(diǎn)在大區(qū)域的中心的前后位置,排除2個(gè)可能中的1個(gè)。
以此就從一個(gè)大區(qū)域中,得到了點(diǎn)所在的小區(qū)域。
2) 循環(huán)二分查找
這里強(qiáng)調(diào)一下八叉樹存在的意義,它每次產(chǎn)生子區(qū)域能更精準(zhǔn)的表示一個(gè)物體所占的區(qū)域,而對于不存在物體的區(qū)域不做細(xì)化。八叉樹所表示的方形區(qū)域一般不會被分割為n*n*n的大魔方。
我們要定位的目標(biāo)是層層推進(jìn)找到點(diǎn)所在的最小樹節(jié)點(diǎn),對于不存在物體的區(qū)域,這個(gè)節(jié)點(diǎn)會是根的子節(jié)點(diǎn);而區(qū)域存在物體的區(qū)域,這個(gè)節(jié)點(diǎn)的區(qū)域尺寸是規(guī)定的最小尺寸,層數(shù)由根節(jié)點(diǎn)所表示的區(qū)域決定(根的尺寸/2小于等于最小尺寸的次數(shù))。

導(dǎo)航就是隨便寫的了,通過物體判斷行進(jìn)方向上一點(diǎn)(物體pos+dir*minSize)是否處于有物體的區(qū)域,如果有,就進(jìn)行避障。
物體pos+dir*minSize中minSize是最小的區(qū)域尺寸,我們延伸檢測minSize就能有效檢測所有區(qū)域。(當(dāng)一幀的移動(dòng)大于一格不成立)。