本發(fā)明屬于三維場(chǎng)景中模型檢索領(lǐng)域,特別是基于二維鄰域檢索的三維場(chǎng)景海量模型實(shí)時(shí)調(diào)度方法。
背景技術(shù):
在高逼真度的大規(guī)模三維場(chǎng)景仿真系統(tǒng)中,通常需要?jiǎng)討B(tài)調(diào)度和顯示高精度的地物模型,這些地物模型具有網(wǎng)格精細(xì),紋理分辨率高,且數(shù)量巨大的特點(diǎn),在場(chǎng)景中一次性加載這些模型,往往會(huì)造成內(nèi)存溢出的問(wèn)題,所以需要根據(jù)可視范圍的變化在模型數(shù)據(jù)庫(kù)中高效地檢索調(diào)度模型,以保證三維場(chǎng)景中模型實(shí)時(shí)繪制的流暢性。
目前大規(guī)模三維場(chǎng)景中海量地物模型組織調(diào)度常采用的方法包括基于R樹(shù)(Real Trees)的空間索引和基于傳統(tǒng)四叉樹(shù)的空間檢索兩大類(lèi)。基于R樹(shù)的空間索引方法對(duì)三維場(chǎng)景中的每個(gè)模型依次建立包圍盒,即最小外接長(zhǎng)方體,再將距離相近的模型當(dāng)作一個(gè)整體建立包圍盒,以此類(lèi)推,逐漸擴(kuò)大包圍盒范圍,直至包圍盒范圍等于整個(gè)三維場(chǎng)景空間,在進(jìn)行檢索時(shí),需要將包圍盒范圍與場(chǎng)景當(dāng)前視錐體范圍比較,而三維空間的范圍比較十分復(fù)雜,計(jì)算量很大,使得檢索效率不佳?;趥鹘y(tǒng)四叉樹(shù)的檢索方法首先對(duì)每個(gè)模型投影形狀建立最小外接矩形,對(duì)這些矩形構(gòu)建四叉樹(shù),建立檢索,為提高調(diào)用速度,在模型調(diào)度時(shí)構(gòu)建緩存區(qū),取一個(gè)比可視范圍大的矩形范圍,通過(guò)遍歷比較,將在該矩形范圍內(nèi)的節(jié)點(diǎn)存入緩存區(qū),若可視范圍改變,就從緩存區(qū)中遍歷獲取數(shù)據(jù)。該方法將三維空間的范圍比較簡(jiǎn)化為二維空間的范圍比較,并采用了緩存機(jī)制,在一定程度上提高了檢索效率,但在每次更新緩存區(qū)時(shí),需要對(duì)整個(gè)四叉樹(shù)全部遍歷,緩存區(qū)更新的速度影響了整體的檢索速度。若需要對(duì)場(chǎng)景中任一模型在某個(gè)方位上相鄰模型進(jìn)行檢索,由于傳統(tǒng)的四叉樹(shù)模型在構(gòu)建時(shí)只注重了父子節(jié)點(diǎn)的關(guān)系,所以需要先遍歷到與當(dāng)前節(jié)點(diǎn)在同一層次的相鄰節(jié)點(diǎn),再依次向下遍歷,才能得到檢索節(jié)點(diǎn),這對(duì)檢索速度造成了影響。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供一種基于二維鄰域檢索的三維場(chǎng)景中海量模型實(shí)時(shí)調(diào)度方法,以解決基于傳統(tǒng)四叉樹(shù)模型進(jìn)行模型檢索調(diào)度時(shí)效率低下的問(wèn)題。
本發(fā)明的目的是這樣實(shí)現(xiàn)的,基于二維鄰域檢索的三維場(chǎng)景中海量模型實(shí)時(shí)調(diào)度方法,其特征在于,至少包括如下步驟:
步驟1,獲取該三維場(chǎng)景范圍,若不是正方形,則取該范圍的最小外接正方形,創(chuàng)建大小與該正方形范圍相等的空白二維矢量點(diǎn)圖層;
步驟2,從該三維場(chǎng)景的模型數(shù)據(jù)庫(kù)中遍歷場(chǎng)景中每個(gè)模型,獲取每個(gè)模型中心投影的經(jīng)緯度,根據(jù)獲取的經(jīng)緯度在步驟1創(chuàng)建的圖層上添加對(duì)應(yīng)的點(diǎn),所有模型添加完成后,得到該場(chǎng)景的模型點(diǎn)圖層;
步驟3,對(duì)模型點(diǎn)圖層建立主鄰居四叉樹(shù);
步驟4,對(duì)構(gòu)建好的主鄰居四叉樹(shù)進(jìn)行先序遍歷,創(chuàng)建緩存區(qū),將當(dāng)前場(chǎng)景可視范圍內(nèi)應(yīng)顯示的節(jié)點(diǎn)模型存入緩存區(qū),并在場(chǎng)景中加載這些節(jié)點(diǎn),繪制當(dāng)前場(chǎng)景可視范圍內(nèi)的模型;
步驟5,更新緩存區(qū),漫游時(shí)根據(jù)場(chǎng)景可視范圍的實(shí)時(shí)變化方向,獲取在這些方向上場(chǎng)景可視范圍內(nèi)的邊緣節(jié)點(diǎn),使用基于主鄰居四叉樹(shù)的二維鄰域檢索方法對(duì)這些邊緣節(jié)點(diǎn)在這些方向上的相鄰節(jié)點(diǎn)進(jìn)行檢索,根據(jù)場(chǎng)景可視范圍在各個(gè)方向上的變化速度,確定需要檢索節(jié)點(diǎn)的范圍大小,將檢索到的節(jié)點(diǎn)存入緩存區(qū)域,更新緩存區(qū)域,直接對(duì)緩存區(qū)內(nèi)的節(jié)點(diǎn)進(jìn)行遍歷,確定需要加載和卸載的節(jié)點(diǎn);
步驟6,根據(jù)查詢(xún)條件進(jìn)行快速查詢(xún);如果要對(duì)場(chǎng)景中任一模型的某一方向上的模型進(jìn)行更新,則需要先檢索到該模型所在節(jié)點(diǎn);給定某一模型,選擇查詢(xún)方向,以及在方向上的具體位序,即可快速檢索到相應(yīng)節(jié)點(diǎn),再根據(jù)查詢(xún)到的位置在數(shù)據(jù)庫(kù)中檢索對(duì)應(yīng)模型,進(jìn)行更新。
所述步驟3,包括如下步驟:
步驟31,定義主鄰居四叉樹(shù)節(jié)點(diǎn)模型,在構(gòu)建主鄰居四叉樹(shù)時(shí),每個(gè)節(jié)點(diǎn)中應(yīng)至少包括以下信息:
(1)位置編碼;
(2)節(jié)點(diǎn)尺寸;
(3)節(jié)點(diǎn)類(lèi)型:三種類(lèi)型,分別是:WHITE,BLACK,GRAY,其中,WHITE代表該區(qū)域沒(méi)有模型,BLACK代表該區(qū)域有且只有1個(gè)模型,GRAY代表該區(qū)域有且大于1個(gè)模型,這里的一個(gè)模型并非指的是單個(gè)物體的模型,可以代指某一小片區(qū)域的整體建模;
(4)父節(jié)點(diǎn);
(5)孩子節(jié)點(diǎn);
(6)當(dāng)前節(jié)點(diǎn)在四個(gè)方向上的主鄰居;
(7)當(dāng)前節(jié)點(diǎn)的經(jīng)緯度范圍;
步驟32,取圖層A1作為根節(jié)點(diǎn);
步驟33,判斷要?jiǎng)澐值墓?jié)點(diǎn)類(lèi)型是否為GRAY,若是,則執(zhí)行步驟34,若否,則執(zhí)行步驟38;
步驟34,對(duì)節(jié)點(diǎn)進(jìn)行劃分,得到四個(gè)子節(jié)點(diǎn);
步驟35,更新新的子節(jié)點(diǎn)主鄰居,每個(gè)子節(jié)點(diǎn)首先繼承其父節(jié)點(diǎn)的外部鄰居,接著更新其內(nèi)部鄰居。
步驟36,相應(yīng)更新所有原有節(jié)點(diǎn)的主鄰居,在對(duì)一個(gè)節(jié)點(diǎn)進(jìn)行分解后,需要將該變化通知該節(jié)點(diǎn)四個(gè)方向上所有的鄰居,這樣它們才可以相應(yīng)地更新其主鄰居;
步驟37,判斷當(dāng)前所有的節(jié)點(diǎn)中是否已經(jīng)不存在GRAY類(lèi)型節(jié)點(diǎn),若是,完成構(gòu)建;若否,執(zhí)行步驟38;
步驟38,按“Z”字形順序取下一個(gè)節(jié)點(diǎn)。
所述步驟4,包括如下步驟:
步驟41,獲取場(chǎng)景的可視范圍,即經(jīng)緯度范圍;
步驟42,對(duì)步驟3創(chuàng)建的主鄰居四叉樹(shù)進(jìn)行先序遍歷;
步驟43,獲取當(dāng)前遍歷節(jié)點(diǎn)的區(qū)域范圍;
步驟44,獲取當(dāng)前三維場(chǎng)景的可視范圍;
步驟45,判斷當(dāng)前遍歷節(jié)點(diǎn)的范圍是否完全不在當(dāng)前場(chǎng)景可視范圍內(nèi),若是,轉(zhuǎn)步驟49,若否,轉(zhuǎn)步驟46;
步驟46,判斷當(dāng)前遍歷節(jié)點(diǎn)的范圍是否完全在當(dāng)前場(chǎng)景的可視范圍內(nèi),若是,轉(zhuǎn)步驟48,若否,轉(zhuǎn)步驟47;
步驟47,判斷當(dāng)前節(jié)點(diǎn)是否已達(dá)到主鄰居四叉樹(shù)的最大深度,若是,轉(zhuǎn)步驟48,若否,轉(zhuǎn)步驟42;
步驟48,在場(chǎng)景中加載該節(jié)點(diǎn)范圍內(nèi)的模型,轉(zhuǎn)步驟410;
步驟49,創(chuàng)建緩存區(qū),將該節(jié)點(diǎn)加入緩存區(qū);
步驟410,判斷是否已遍歷完主鄰居四叉樹(shù)所有節(jié)點(diǎn),若是,則結(jié)束遍歷,若否,則轉(zhuǎn)步驟42。
所述步驟5,包括如下步驟:
步驟51,獲取當(dāng)前的場(chǎng)景可視范圍變化方向;
步驟52,獲取場(chǎng)景可視范圍內(nèi)在可視范圍變化方向上的邊緣節(jié)點(diǎn);
步驟53,根據(jù)可視范圍變化方向,使用主鄰居檢索方法對(duì)邊緣節(jié)點(diǎn)遍歷,對(duì)其在可視范圍變化方向上的相鄰節(jié)點(diǎn)進(jìn)行檢索,檢索的節(jié)點(diǎn)范圍由可視范圍在其變化方向上的變化速度確定;
步驟54,將步驟53中檢索到的子塊存入緩存區(qū)域;
步驟55,對(duì)緩存區(qū)內(nèi)的子節(jié)點(diǎn)進(jìn)行遍歷;
步驟56,獲取當(dāng)前遍歷節(jié)點(diǎn)的范圍;
步驟57,獲取當(dāng)前三維場(chǎng)景的可視范圍;
步驟58,判斷當(dāng)前遍歷節(jié)點(diǎn)的范圍是否完全不在當(dāng)前場(chǎng)景可視范圍內(nèi),若是,轉(zhuǎn)步驟55,若否,轉(zhuǎn)步驟59;
步驟59,在場(chǎng)景中加載該節(jié)點(diǎn)范圍內(nèi)的模型;
步驟510,判斷緩存區(qū)遍歷是否結(jié)束,若是,轉(zhuǎn)步驟511,若否,轉(zhuǎn)步驟55;
步驟511,判斷視場(chǎng)是否有改變,若是,轉(zhuǎn)步驟51,若否,結(jié)束。
在創(chuàng)建和更新緩存區(qū)時(shí),應(yīng)設(shè)定幾個(gè)閾值,通過(guò)判斷場(chǎng)景可視范圍內(nèi)應(yīng)顯示的節(jié)點(diǎn)個(gè)數(shù)所屬的范圍,或根據(jù)視點(diǎn)距離場(chǎng)景中模型的距離,決定從模型數(shù)據(jù)庫(kù)中調(diào)用模型的精細(xì)程度,屬于三維場(chǎng)景模型調(diào)度中層次化細(xì)節(jié)相關(guān)技術(shù),不進(jìn)行詳細(xì)描述。
本發(fā)明提出的基于二維鄰域檢索的三維場(chǎng)景中海量模型實(shí)時(shí)調(diào)度方法將三維場(chǎng)景中的模型用點(diǎn)來(lái)表示,得到對(duì)應(yīng)的二維模型點(diǎn)圖層,通過(guò)對(duì)該圖層構(gòu)建主鄰居四叉樹(shù),結(jié)合二維鄰域檢索算法,實(shí)現(xiàn)快速對(duì)相鄰節(jié)點(diǎn)的索引,大大降低了緩存創(chuàng)建時(shí)間,從而提高三維場(chǎng)景中模型的檢索速度,保證了三維場(chǎng)景漫游的流暢性。
本發(fā)明的優(yōu)點(diǎn)在于首先根據(jù)三維場(chǎng)景的經(jīng)緯度范圍創(chuàng)建一個(gè)空白的二維矢量點(diǎn)圖層,將場(chǎng)景中的每個(gè)模型用一個(gè)二維點(diǎn)來(lái)表示,點(diǎn)的坐標(biāo)是模型中心點(diǎn)投影的經(jīng)緯度坐標(biāo),將三維場(chǎng)景中所有模型對(duì)應(yīng)的點(diǎn)一一繪制在該矢量點(diǎn)圖層上,得到二維模型圖層,再對(duì)該模型圖層創(chuàng)建主鄰居四叉樹(shù),在漫游時(shí),使用基于主鄰居四叉樹(shù)的二維鄰域檢索算法可以快速更新緩存區(qū)的數(shù)據(jù),并且可以實(shí)現(xiàn)對(duì)場(chǎng)景中模型快速檢索。
附圖說(shuō)明
下面結(jié)合實(shí)施例附圖對(duì)本發(fā)明作進(jìn)一步說(shuō)明:
圖1本發(fā)明實(shí)施例流程圖;
圖2本發(fā)明實(shí)施例主鄰居四叉樹(shù)編碼方式說(shuō)明圖;
圖3主鄰居四叉樹(shù)節(jié)點(diǎn)的四個(gè)主鄰居說(shuō)明圖;
圖4(A)新子節(jié)點(diǎn)NW的主鄰居更新說(shuō)明圖;
圖4(B)確定孩子節(jié)點(diǎn)[21]在N方向上的主鄰居說(shuō)明圖;
圖5構(gòu)建主鄰居四叉樹(shù)流程圖;
圖6采用主鄰居四叉樹(shù)先序遍歷確定顯示節(jié)點(diǎn)流程圖;
圖7緩存區(qū)構(gòu)建遍歷更新流程圖;
圖8(A)三維場(chǎng)景模型圖層建立的主鄰居四叉樹(shù)示意圖;
圖8(B)三維場(chǎng)景可視范圍顯示示意圖。
具體實(shí)施方式
實(shí)施例1
基于二維鄰域檢索的三維場(chǎng)景中海量模型實(shí)時(shí)調(diào)度方法,其特征在于,至少包括如下步驟:
步驟1,獲取該三維場(chǎng)景范圍,若不是正方形,則取該范圍的最小外接正方形,創(chuàng)建大小與該正方形范圍相等的空白二維矢量點(diǎn)圖層;
步驟2,從該三維場(chǎng)景的模型數(shù)據(jù)庫(kù)中遍歷場(chǎng)景中每個(gè)模型,獲取每個(gè)模型中心投影的經(jīng)緯度,根據(jù)獲取的經(jīng)緯度在步驟1創(chuàng)建的圖層上添加對(duì)應(yīng)的點(diǎn),所有模型添加完成后,得到該場(chǎng)景的模型點(diǎn)圖層;
步驟3,對(duì)模型點(diǎn)圖層建立主鄰居四叉樹(shù);
步驟4,對(duì)構(gòu)建好的主鄰居四叉樹(shù)進(jìn)行先序遍歷,創(chuàng)建緩存區(qū),將當(dāng)前場(chǎng)景可視范圍內(nèi)應(yīng)顯示的節(jié)點(diǎn)模型存入緩存區(qū),并在場(chǎng)景中加載這些節(jié)點(diǎn),繪制當(dāng)前場(chǎng)景可視范圍內(nèi)的模型;
步驟5,更新緩存區(qū),漫游時(shí)根據(jù)場(chǎng)景可視范圍的實(shí)時(shí)變化方向,獲取在這些方向上場(chǎng)景可視范圍內(nèi)的邊緣節(jié)點(diǎn),使用基于主鄰居四叉樹(shù)的二維鄰域檢索方法對(duì)這些邊緣節(jié)點(diǎn)在這些方向上的相鄰節(jié)點(diǎn)進(jìn)行檢索,根據(jù)場(chǎng)景可視范圍在各個(gè)方向上的變化速度,確定需要檢索節(jié)點(diǎn)的范圍大小,將檢索到的節(jié)點(diǎn)存入緩存區(qū)域,更新緩存區(qū)域,直接對(duì)緩存區(qū)內(nèi)的節(jié)點(diǎn)進(jìn)行遍歷,確定需要加載和卸載的節(jié)點(diǎn);
步驟6,根據(jù)查詢(xún)條件進(jìn)行快速查詢(xún);如果要對(duì)場(chǎng)景中任一模型的某一方向上的模型進(jìn)行更新,則需要先檢索到該模型所在節(jié)點(diǎn);給定某一模型,選擇查詢(xún)方向,以及在方向上的具體位序,即可快速檢索到相應(yīng)節(jié)點(diǎn),再根據(jù)查詢(xún)到的位置在數(shù)據(jù)庫(kù)中檢索對(duì)應(yīng)模型,進(jìn)行更新。
實(shí)施例2
如圖1所示,基于二維鄰域檢索的三維場(chǎng)景中海量模型實(shí)時(shí)調(diào)度方法包括如下步驟:
步驟1,獲取該三維場(chǎng)景范圍,若不是正方形,則取該范圍的最小外接正方形,邊長(zhǎng)為d(單位:按經(jīng)緯度單位度),創(chuàng)建一個(gè)邊長(zhǎng)為d的空白二維矢量點(diǎn)圖層A0;
步驟2,從該三維場(chǎng)景的模型數(shù)據(jù)庫(kù)中遍歷場(chǎng)景中每個(gè)模型,獲取每個(gè)模型中心投影的經(jīng)緯度,根據(jù)獲取的經(jīng)緯度在圖層A0上添加對(duì)應(yīng)的點(diǎn),所有模型添加完成后,得到該場(chǎng)景的模型點(diǎn)圖層A1;
步驟3,對(duì)圖層A1建立主鄰居四叉樹(shù);
步驟4,對(duì)構(gòu)建好的主鄰居四叉樹(shù)進(jìn)行先序遍歷,創(chuàng)建緩存區(qū),將當(dāng)前場(chǎng)景可視范圍內(nèi)應(yīng)顯示的節(jié)點(diǎn)模型存入緩存區(qū),并在場(chǎng)景中加載這些節(jié)點(diǎn),繪制當(dāng)前場(chǎng)景可視范圍內(nèi)的模型;
步驟5,更新緩存區(qū),漫游時(shí)根據(jù)場(chǎng)景可視范圍的實(shí)時(shí)變化方向,獲取在這些方向上場(chǎng)景可視范圍內(nèi)的邊緣節(jié)點(diǎn),使用基于主鄰居四叉樹(shù)的二維鄰域檢索方法對(duì)這些邊緣節(jié)點(diǎn)在這些方向上的相鄰節(jié)點(diǎn)進(jìn)行檢索,根據(jù)場(chǎng)景可視范圍在各個(gè)方向上的變化速度確定需要檢索節(jié)點(diǎn)的范圍大小,將檢索到的節(jié)點(diǎn)存入緩存區(qū)域,隨著可視區(qū)域的變化,不斷更新緩存區(qū)域,直接對(duì)緩存區(qū)內(nèi)的節(jié)點(diǎn)進(jìn)行遍歷,確定需要加載和卸載的節(jié)點(diǎn);
步驟6,根據(jù)查詢(xún)條件進(jìn)行快速查詢(xún)。如果要對(duì)某一模型的某一方向上的模型進(jìn)行更新,則需要先檢索到該模型所在節(jié)點(diǎn)。給定某一模型,選擇查詢(xún)方向,以及在方向上的具體位序,即可快速檢索到相應(yīng)模型,再根據(jù)查詢(xún)到的位置在數(shù)據(jù)庫(kù)中找到對(duì)應(yīng)模型,進(jìn)行更新。
如圖5所示,步驟3包括如下步驟:
步驟31,定義主鄰居四叉樹(shù)節(jié)點(diǎn)模型,在構(gòu)建主鄰居四叉樹(shù)時(shí),每個(gè)節(jié)點(diǎn)應(yīng)至少包括以下信息:
(1)位置編碼:用一串四進(jìn)制數(shù)表示,根節(jié)點(diǎn)不進(jìn)行編碼,如圖2所示,將根節(jié)點(diǎn)分為四等分,則四個(gè)節(jié)點(diǎn)的編碼按“Z”字形順序依次為0,1,2,3,四個(gè)節(jié)點(diǎn)可以依次表示為[0],[1],[2],[3];繼續(xù)對(duì)子節(jié)點(diǎn)進(jìn)行四等分,子節(jié)點(diǎn)的四個(gè)子節(jié)點(diǎn)仍然按“Z”字形順序編號(hào)為0,1,2,3,但其編碼應(yīng)為父節(jié)點(diǎn)編碼加上該節(jié)點(diǎn)在兄弟節(jié)點(diǎn)中的編號(hào),如圖2中對(duì)[0]劃分后,[0]的四個(gè)子節(jié)點(diǎn)編碼分別00,01,02,03,[0]的四個(gè)子節(jié)點(diǎn)分別表示為[00],[01],[02],[03],依次類(lèi)推,所有的節(jié)點(diǎn)可以表示為[節(jié)點(diǎn)編碼];
(2)節(jié)點(diǎn)尺寸:代表區(qū)域的邊長(zhǎng)(度);
(3)節(jié)點(diǎn)類(lèi)型:三種類(lèi)型,分別是:WHITE,BLACK,GRAY(WHITE代表該區(qū)域沒(méi)有模型,BLACK代表該區(qū)域有且只有1個(gè)模型,GRAY代表該區(qū)域有且大于1個(gè)模型,這里的一個(gè)模型并非指的是單個(gè)物體的模型,可以代指某一小片區(qū)域的整體建模);
(4)父節(jié)點(diǎn):當(dāng)前節(jié)點(diǎn)的直接父節(jié)點(diǎn);
(5)孩子節(jié)點(diǎn):當(dāng)前節(jié)點(diǎn)的四個(gè)孩子節(jié)點(diǎn);
(6)當(dāng)前節(jié)點(diǎn)在四個(gè)方向上的主鄰居:如圖3所示,在創(chuàng)建主鄰居四叉樹(shù)時(shí),為每個(gè)節(jié)點(diǎn)定義西,北,東,南四個(gè)方向的主鄰居指針,分別用符號(hào)CN0,CN1,CN2,CN3表示,這四個(gè)指針?lè)謩e指向節(jié)點(diǎn)西,北,東,南四個(gè)方向上的主鄰居,主鄰居是指:若節(jié)點(diǎn)在某個(gè)方向上只有一個(gè)相鄰節(jié)點(diǎn),則該相鄰節(jié)點(diǎn)即為該節(jié)點(diǎn)在該方向上的主鄰居;若節(jié)點(diǎn)在某個(gè)方向上相鄰節(jié)點(diǎn)大于一個(gè),則該節(jié)點(diǎn)的主鄰居指節(jié)點(diǎn)在某方向上的第一個(gè)相鄰節(jié)點(diǎn)。第一個(gè)相鄰節(jié)點(diǎn)規(guī)定如下:節(jié)點(diǎn)在西邊的主鄰居是節(jié)點(diǎn)在西邊的相鄰塊中最北邊的節(jié)點(diǎn);節(jié)點(diǎn)在北邊的主鄰居是節(jié)點(diǎn)在北邊的相鄰節(jié)點(diǎn)中最西邊的節(jié)點(diǎn);節(jié)點(diǎn)在東邊的主鄰居是節(jié)點(diǎn)在東邊相鄰節(jié)點(diǎn)中最南邊的節(jié)點(diǎn);節(jié)點(diǎn)在南邊的主鄰居是節(jié)點(diǎn)在南邊的相鄰節(jié)點(diǎn)中最東邊的節(jié)點(diǎn);
(7)當(dāng)前節(jié)點(diǎn)的范圍:經(jīng)度最小值(該節(jié)點(diǎn)區(qū)域的經(jīng)度最小值),經(jīng)度最大值(該節(jié)點(diǎn)區(qū)域的經(jīng)度最大值),緯度最小值(該節(jié)點(diǎn)區(qū)域的緯度最小值),緯度最大值(該節(jié)點(diǎn)區(qū)域的緯度最大值);
步驟32,取圖層A1作為根節(jié)點(diǎn);
步驟33,判斷要?jiǎng)澐值墓?jié)點(diǎn)類(lèi)型是否為GRAY,若是,則轉(zhuǎn)步驟34,若否,則轉(zhuǎn)步驟38;
步驟34,對(duì)節(jié)點(diǎn)進(jìn)行劃分,得到四個(gè)子節(jié)點(diǎn);
步驟35,更新新的子節(jié)點(diǎn)主鄰居,每個(gè)子節(jié)點(diǎn)首先繼承其父節(jié)點(diǎn)的外部鄰居,接著更新其內(nèi)部鄰居。舉例來(lái)說(shuō),如圖4(A)所示,對(duì)于節(jié)點(diǎn)NW的更新為:CN0=父節(jié)點(diǎn)的CN0,CN1=父節(jié)點(diǎn)的CN1,CN2=節(jié)點(diǎn)NE,CN3=節(jié)點(diǎn)SW。具體更新方法為(下文中將西,北,東,南分別用W,N,E,S來(lái)表示):
(1)有些孩子節(jié)點(diǎn)可以繼承其父節(jié)點(diǎn)的主鄰居,如圖4(A)所示,父節(jié)點(diǎn)W方向和N方向上的主鄰居對(duì)于NW節(jié)點(diǎn)依然有效,同理父節(jié)點(diǎn)E方向和S方向的對(duì)SW節(jié)點(diǎn)依然有效;
(2)有些孩子節(jié)點(diǎn)需要?jiǎng)t需要進(jìn)行更新來(lái)反映有效的主鄰居,如節(jié)點(diǎn)NE和節(jié)點(diǎn)SW,對(duì)于節(jié)點(diǎn)NE和節(jié)點(diǎn)SW又分為兩種情況:父節(jié)點(diǎn)的主鄰居尺寸比父節(jié)點(diǎn)的尺寸大或者相等;父節(jié)點(diǎn)的主鄰居尺寸比父節(jié)點(diǎn)的尺寸小。在第一種情況下,不需要進(jìn)行更新,孩子節(jié)點(diǎn)的主鄰居可以直接繼承父節(jié)點(diǎn)的主鄰居,而在第二種情況下,孩子節(jié)點(diǎn)的主鄰居需要被更新。如圖4(B),表示了[21]是如何確定其在N方向上的主鄰居,[21]首先繼承其父節(jié)點(diǎn)在N方向上的主鄰居[022],但是正確的主鄰居是[03]。所以[21]的CN1需要被更新。通過(guò)從W到E方向?qū)21]在N方向上的鄰居進(jìn)行水平遍歷,直到第一次到達(dá)一個(gè)[21]的直接鄰居,即[03]。其中在從W方向到E方向的遍歷步驟中,終止檢索的標(biāo)準(zhǔn)是:當(dāng)所有遍歷過(guò)的鄰居節(jié)點(diǎn)的尺寸之和比該節(jié)點(diǎn)的尺寸大,停止遍歷。其它類(lèi)似情況下處理方法相同。
步驟36,相應(yīng)更新所有原有節(jié)點(diǎn)的主鄰居,在對(duì)一個(gè)節(jié)點(diǎn)進(jìn)行分解后,需要將該變化通知該節(jié)點(diǎn)四個(gè)方向上所有的鄰居,這樣它們才可以相應(yīng)地更新其主鄰居。
步驟37,判斷當(dāng)前所有的節(jié)點(diǎn)中是否已經(jīng)不存在GRAY類(lèi)型節(jié)點(diǎn),若是,完成構(gòu)建;若否,執(zhí)行步驟38;
步驟38,按“Z”字形順序取下一個(gè)節(jié)點(diǎn)。
如圖6所示,所述步驟4,包括如下步驟:
步驟41,獲取場(chǎng)景的可視范圍,即經(jīng)緯度范圍;
步驟42,對(duì)步驟3創(chuàng)建的主鄰居四叉樹(shù)進(jìn)行先序遍歷;
步驟43,獲取當(dāng)前遍歷節(jié)點(diǎn)的區(qū)域范圍;
步驟44,獲取當(dāng)前三維場(chǎng)景的可視范圍;
步驟45,判斷當(dāng)前遍歷節(jié)點(diǎn)的范圍是否完全不在當(dāng)前場(chǎng)景可視范圍內(nèi),若是,轉(zhuǎn)步驟49,若否,轉(zhuǎn)步驟46;
步驟46,判斷當(dāng)前遍歷節(jié)點(diǎn)的范圍是否完全在當(dāng)前場(chǎng)景的可視范圍內(nèi),若是,轉(zhuǎn)步驟48,若否,轉(zhuǎn)步驟47;
步驟47,判斷當(dāng)前節(jié)點(diǎn)是否已達(dá)到主鄰居四叉樹(shù)的最大深度,若是,轉(zhuǎn)步驟48,若否,轉(zhuǎn)步驟42;
步驟48,在場(chǎng)景中加載該節(jié)點(diǎn)范圍內(nèi)的模型,轉(zhuǎn)步驟410;
步驟49,創(chuàng)建緩存區(qū),將該節(jié)點(diǎn)加入緩存區(qū);
步驟410,判斷是否已遍歷完主鄰居四叉樹(shù)所有節(jié)點(diǎn),若是,則結(jié)束遍歷,若否,則轉(zhuǎn)步驟42;
如圖7所示,所述步驟5,包括如下步驟:
步驟51,獲取當(dāng)前的場(chǎng)景可視范圍變化方向;
步驟52,獲取場(chǎng)景可視范圍內(nèi)在可視范圍變化方向上的邊緣節(jié)點(diǎn)B1,B2,B3,…,Bn;
步驟53,根據(jù)可視范圍變化方向,使用主鄰居檢索方法對(duì)節(jié)點(diǎn)B1,B2,B3,…,Bn遍歷,對(duì)其在可視范圍變化方向上的相鄰節(jié)點(diǎn)進(jìn)行檢索,檢索的節(jié)點(diǎn)范圍由可視范圍在其變化方向上的變化速度確定,例如,檢索Bi,i∈{1,2,3,…,n}在N方向上的所有直接鄰居,為了查找Bi在N方向的鄰居,首先可以得到Bi的CN1,以CN1為起始點(diǎn),利用幾個(gè)函數(shù)進(jìn)行一個(gè)簡(jiǎn)單的遍歷就可以得到N方向上所有的鄰居。
Bi在N方向上任意一個(gè)鄰居(記為X)可以通過(guò)以下的主鄰居檢索算法檢索到:
令如果(Size(X)<Size(Bi)),當(dāng)則令
其中,Size(X)返回節(jié)點(diǎn)X的邊長(zhǎng),j為0,1,2,3時(shí),分別返回節(jié)點(diǎn)X的CN0,CN1,CN2,CN3;
如果節(jié)點(diǎn)在N方向上的鄰居尺寸等于或大于該節(jié)點(diǎn)的尺寸,則一步完成檢索,否則,則會(huì)從W方向開(kāi)始按順序依次檢索。
在所有其他方向上,鄰域檢索也是相同的原則。對(duì)W方向上的主鄰居,應(yīng)從N方向至S方向逐次檢索;對(duì)E方向上的主鄰居,應(yīng)從S方向至N方向逐次檢索;對(duì)S方向上的主鄰居,應(yīng)從E方向至W方向逐次檢索,即可得到模型的某一方向上某一具體序位的子塊。
步驟54,將步驟53中檢索到的子塊存入緩存區(qū)域;
步驟55,對(duì)緩存區(qū)內(nèi)的子塊進(jìn)行遍歷;
步驟56,獲取當(dāng)前遍歷節(jié)點(diǎn)的范圍;
步驟57,獲取當(dāng)前三維場(chǎng)景的可視范圍;
步驟58,判斷當(dāng)前遍歷節(jié)點(diǎn)的范圍是否完全不在當(dāng)前場(chǎng)景可視范圍內(nèi),若是,轉(zhuǎn)步驟55,若否,轉(zhuǎn)步驟59;
步驟59,在場(chǎng)景中加載該節(jié)點(diǎn)范圍內(nèi)的模型;
步驟510,判斷緩存區(qū)遍歷是否結(jié)束,若是,轉(zhuǎn)步驟511,若否,轉(zhuǎn)步驟55;
步驟511,判斷視場(chǎng)是否有改變,若是,轉(zhuǎn)步驟51,若否,結(jié)束。如圖8(A)中所示為三維場(chǎng)景中模型圖層構(gòu)建的主鄰居四叉樹(shù)示意圖,其中點(diǎn)陰影部分801表示當(dāng)可視范圍的向東變化時(shí)的應(yīng)更新的緩存節(jié)點(diǎn),斜劃線(xiàn)陰影部分803表示當(dāng)前加載到場(chǎng)景中的節(jié)點(diǎn),矩形粗線(xiàn)框802表示當(dāng)前場(chǎng)景的可視范圍(矩形線(xiàn)框長(zhǎng)寬分別由經(jīng)度范圍和緯度范圍確定),點(diǎn)804代表模型圖層中的模型點(diǎn);圖8(B)中所示為對(duì)應(yīng)圖8(A)中矩形粗線(xiàn)框802中的三維場(chǎng)景,矩形粗線(xiàn)框802中的模型點(diǎn)分別對(duì)應(yīng)三維場(chǎng)景中的房子模型805,樹(shù)模型806,飛機(jī)模型807,點(diǎn)畫(huà)線(xiàn)808示意了三維場(chǎng)景中加載的各個(gè)節(jié)點(diǎn)范圍。