本發(fā)明涉及一種混合數(shù)據(jù)模型在建筑物三維建模中的應(yīng)用,屬于三維建模技術(shù)領(lǐng)域。
背景技術(shù):
建筑物是城市中的主要地物,建筑物三維建模是計算機圖形學(xué)、地理信息系統(tǒng)、攝影測量學(xué)及其相關(guān)學(xué)科研究的熱點,并在虛擬現(xiàn)實、復(fù)雜場景設(shè)計、計算機視覺和三維gis等領(lǐng)域得到了廣泛應(yīng)用,建筑物三維建模方法直接影響到城市三維可視化的速度和效果,如何快捷、逼真地構(gòu)建建筑物三維模型是很多研究人員重點研究的課題。
按照模型的存儲元素類型分類,三維空間數(shù)據(jù)模型可分為柵格數(shù)據(jù)模型、矢量數(shù)據(jù)模型、柵格和矢量混合模型3類。按照模型的構(gòu)成元素分類,三維空間數(shù)據(jù)模型可分為基于面元的模型、基于體元的模型和面元體元混合模型3類。
基于面元的模型包括格網(wǎng)(grid)、不規(guī)則三角形格網(wǎng)(tin)、線框(wireframe)、邊界表示(boundaryrepresentation)、斷面(section)和參數(shù)函數(shù)表示(parameterfunction)等。
基于體元的模型包括四面體格網(wǎng)(ten)、八叉樹(octree)、結(jié)構(gòu)實體幾何法(csg)、三維柵格(array)、塊段(block)、六面體(hexahedral)、多面體(polyhedral)和棱柱體(prism)等。
基于面元模型的優(yōu)點為數(shù)據(jù)存儲量小,建模快捷,實體顯示和更新的速度快,不足之處為不能描述實體的內(nèi)部屬性,難以進行實體的三維空間分析和查詢?;隗w元模型的優(yōu)點為適于空間操作和分析,不足之處為數(shù)據(jù)結(jié)構(gòu)復(fù)雜,存儲空間大,建模速度慢。
八叉樹體素分解是將空間三維物體逐級分解,最終形成八叉樹體素表示的結(jié)構(gòu)。八叉樹的主要優(yōu)點是可以方便地實現(xiàn)物體的并、交、差等集合運算,適用于較規(guī)則的實體的建模。
參數(shù)函數(shù)表示的指導(dǎo)思想是利用有限的空間數(shù)據(jù),構(gòu)造一個函數(shù)的解析式,用這個解析式來生成新的空間點,用以逼近原有物體。參數(shù)函數(shù)表示包括解析函數(shù)模型和非解析函數(shù)模型。解析函數(shù)模型的優(yōu)點為數(shù)學(xué)運算簡便、數(shù)據(jù)存儲量小,但復(fù)雜的空間對象很難用統(tǒng)一的函數(shù)參數(shù)方程來表達。為了克服解析函數(shù)的局限性,人們提出了非解析函數(shù)。b樣條函數(shù)是比較實用的參數(shù)函數(shù),具有存儲量小、分析運算速度快、空間幾何不變性等特點,是構(gòu)建三維空間實體邊界曲面的有效方法。
技術(shù)實現(xiàn)要素:
本發(fā)明提供一種在建筑物三維建模中運用的混合數(shù)據(jù)模型,混合模型采用了八叉樹作為整體描述,利用了nurbs描述實體的不規(guī)則曲面,存儲結(jié)構(gòu)采用擴展節(jié)點和混合式的八叉樹結(jié)構(gòu),編碼方法采用八進制前綴編碼技術(shù),根據(jù)混合模型設(shè)計了建筑物三維建模的數(shù)據(jù)結(jié)構(gòu)。
本發(fā)明的大體思路為首先利用八叉樹對建筑物實體v進行三維空間分割,當(dāng)分割后的建筑物子體位于實體邊界且外形不是規(guī)則立方體時,采用nurbs曲面描述該體元的表面,然后用一個屬性值實現(xiàn)八叉樹與nurbs曲面的鏈接,建立混合模型,根據(jù)混合模型設(shè)計建筑物三維建模的數(shù)據(jù)結(jié)構(gòu),存儲結(jié)構(gòu)采用擴展節(jié)點和混合式的八叉樹結(jié)構(gòu),編碼方法采用八進制前綴編碼技術(shù),最后進行實體的三維建模。
為了實現(xiàn)建筑物三維建模的問題,本發(fā)明提供了一種基于八叉樹與nurbs曲面相結(jié)合的混合數(shù)據(jù)模型。該模型的具體構(gòu)建過程包括:
1)輸入一個建筑物實體v,利用八叉樹對建筑物實體v進行三維空間分割,當(dāng)分割后的建筑物子體位于實體邊界且外形不是規(guī)則立方體時,采用nurbs曲面描述該體元的表面,具體步驟如下:
①通過用樹結(jié)構(gòu)對模型進行遞歸,按x、y、z,3個不同方向,將所要表示的三維空間實體v分割為8個大小相等的子立方體。然后根據(jù)每個子立方體中所含的目標(biāo)來決定是否對子立方體繼續(xù)進行8等分的劃分。一直劃分到每個子立方體被一個目標(biāo)所充滿,或沒有目標(biāo),或其大小已成為預(yù)先定義的不可再分的體素為止。八叉樹每個節(jié)點有8個子節(jié)點或者沒有子節(jié)點。若立方體未被某個目標(biāo)填滿,則需要繼續(xù)劃分。當(dāng)立方體被某個目標(biāo)填滿或者立方體中沒有目標(biāo)時,都不需繼續(xù)劃分。八叉樹每個維度每劃分一次,其分辨率都將增大到原來的兩倍。在邊界灰度節(jié)點中加入子體的面、邊、頂點信息,從而形成擴展的八叉樹結(jié)構(gòu)。
②采用八叉樹空間分解法生成曲面離散點集,根據(jù)空間曲面的大小,得到一個包圍整個空間曲面的立方體包圍盒,將該包圍盒作為八叉樹的根節(jié)點來初始化八叉樹數(shù)據(jù)結(jié)構(gòu)。
③將包圍盒分解成8個子區(qū)域,作為大立方體的8個子節(jié)點,生成子體曲面上的空間離散點集。
④空間分割時注意采集實體不規(guī)則部分的外圍散點,將不規(guī)則體元剖分成參數(shù)函數(shù)曲面,生成子體的nurbs曲面。
2)用一個屬性值實現(xiàn)八叉樹與nurbs曲面的鏈接,建立混合模型,若八叉樹某節(jié)點編碼的屬性值為n,表示該節(jié)點關(guān)聯(lián)一個局部的nurbs曲面。通過節(jié)點與對應(yīng)的8個子節(jié)點體內(nèi)的特征點相結(jié)合,形成局部nurbs曲面,實現(xiàn)時采用網(wǎng)格細化和求交切割的方法,用不規(guī)則體元填充八叉樹與表面模型之間的空隙,完成模型的自適應(yīng)分割。
3)根據(jù)混合模型設(shè)計建筑物三維建模的數(shù)據(jù)結(jié)構(gòu),存儲結(jié)構(gòu)采用擴展節(jié)點和混合式的八叉樹結(jié)構(gòu),編碼方法采用八進制前綴編碼技術(shù),具體步驟如下:
①在八叉樹的上層使用指針式結(jié)構(gòu)建立節(jié)點的索引。
②在下層按節(jié)點編碼的大小排序,建立該局部空間內(nèi)包含的所有非空葉節(jié)點的線性表。
③對同一父節(jié)點的8個兄弟節(jié)點,其具有最小(x,y,z)值的節(jié)點編號為0,相鄰兄弟節(jié)點的編號沿x方向增加1,沿y方向增加2,沿z方向增加4,并將父節(jié)點的編碼作為其8個子節(jié)點編碼的前綴。為保證八叉樹中每一節(jié)點編碼的長度相同,在編碼后增加一串區(qū)別于0~7八進制數(shù)的字符“t”,使每個節(jié)點編碼的長度均為樹的最大深度h。節(jié)點編碼可表示為q1q2…qitt…t,其中q1,q2,…,qi∈{0,1,…,7},0≤i≤h。顯然,q1q2…qn表示了空間最低層次(第n層)立方體網(wǎng)格單元,q1q2…qitt…t表示了空間分割至第i層時的立方體網(wǎng)格。
4)利用opengl實現(xiàn)建筑物三維建模和可視化系統(tǒng)。
附圖說明
圖1是八叉樹分割方式的方法結(jié)構(gòu)示意圖。
圖2是nurbs對曲線和曲面的模擬方式示意圖。
圖3是混合三維數(shù)據(jù)模型的分割及模擬方式的結(jié)構(gòu)示意圖。
圖4是三維模型。
具體實施方式
下面結(jié)合附圖和實施例對本發(fā)明進一步說明。
對弧面形狀的三維空間實體進行分割,構(gòu)建八叉樹結(jié)構(gòu),分割方法參見圖1。八叉樹每個節(jié)點有8個子節(jié)點或者沒有子節(jié)點。圖1(c)中,小圓圈表示該立方體未被某個目標(biāo)填滿,需要繼續(xù)劃分。灰度小矩形表示該立方體被某個目標(biāo)填滿,空白小矩形表示該立方體中沒有目標(biāo),這兩種情況下都不需繼續(xù)進行空間劃分。將實體轉(zhuǎn)換為八叉樹結(jié)構(gòu)時,在邊界灰度節(jié)點中加入子體的面、邊、頂點信息,從而形成擴展的八叉樹結(jié)構(gòu)。
當(dāng)分割后的建筑物子體位于實體邊界且外形不是規(guī)則立方體時,設(shè)置該子體的屬性值為n,表示該節(jié)點關(guān)聯(lián)一個局部的nurbs曲面,采用nurbs曲面描述該體元的表面。通過節(jié)點與對應(yīng)的8個子節(jié)點體內(nèi)的特征點相結(jié)合,形成局部nurbs曲面。圖2為nurbs擬合曲線和曲面的示意圖。基于八叉樹和nurbs曲面建立的混合數(shù)據(jù)模型如圖3所示。
根據(jù)八叉樹-nurbs混合三維數(shù)據(jù)模型,采用面向?qū)ο蟮某绦蛟O(shè)計語言c++為建筑物設(shè)計相應(yīng)的數(shù)據(jù)結(jié)構(gòu),其形式化表示如下:
classbuildingobject{//建筑物對象
private:
intbuildingid;//建筑物編號
floatlength;//建筑物主體長
floatwidth;//建筑物主體寬
floatheight;//建筑物主體高
floatroofheight;//建筑物屋頂高
floatridgelength;//建筑物屋脊長
treenodeoctree[8];//定義8個子八叉樹
public:
voidinitialize();
octree*creatoctree()//八叉樹生成函數(shù)
nurbs*pnurbscreatnurbs(nurbspoint**point)//nurbs曲面生成函數(shù)};
樹節(jié)點的數(shù)據(jù)結(jié)構(gòu):
structtreenode{//八叉樹節(jié)點
longcode;//節(jié)點編碼
intsize;//節(jié)點大小
inttype;//屬性
intlayer;//節(jié)點所在層
intindex;//節(jié)點在兄弟節(jié)點中的序號
structtreenode*pparent;//父節(jié)點指針
structtreenode*pchd[8];//子節(jié)點指針
boolleaf;//是否為葉子節(jié)點
boolpolygon;//節(jié)點是否關(guān)聯(lián)nurbs曲面對象
nurbspoint**point;//nurbs曲面控制點,用指
針定義二維動態(tài)數(shù)組
intnnurebsctrl;//nurbs曲面控制點數(shù)
nurbs*pnurbs;//關(guān)聯(lián)nurbs曲面指針
intnurbsobjectid;//曲面對象的id碼
}
采用擴展節(jié)點(面、邊、頂點)和混合式的八叉樹結(jié)構(gòu)進行存儲,在八叉樹的上層使用指針式結(jié)構(gòu)建立節(jié)點的索引,而在下層按節(jié)點編碼的大小排序,建立該局部空間內(nèi)包含的所有非空葉節(jié)點的線性表。減少了存儲空間,又提高了顯示的精度和搜索效率。
利用opengl技術(shù)實現(xiàn)實體的三維建模和可視化。生成如圖4所示的三維模型。
對于本例中的弧面形狀的建筑物,采用混合模型對三維空間實體的分割次數(shù)遠遠小于八叉樹模型,為八叉樹模型的1/8左右?;旌夏P偷拇鎯α恳脖劝瞬鏄淠P蜕?0%以上,相應(yīng)的模型顯示速度提高了20%,模型的精度也有所提高。