黃國(guó)豪
三維數(shù)字城市是未來(lái)智慧城市建設(shè)的必然,其逼真的三維呈現(xiàn)在城市建設(shè)、國(guó)土規(guī)劃、公安消防等相關(guān)領(lǐng)域得到廣泛的應(yīng)用。由于不同部門(mén)對(duì)高層建筑模型有不同的管理應(yīng)用需求,需要對(duì)高層建筑模型進(jìn)行分層進(jìn)行表達(dá),滿(mǎn)足交互式可視化等細(xì)節(jié)方面的需求[1]。
現(xiàn)有的三維建筑模型在3D GIS平臺(tái)通常是一個(gè)整體對(duì)象,無(wú)法對(duì)建筑進(jìn)行分層交互式可視化操作,只能在三維建模軟件通過(guò)手工切割再導(dǎo)入3D GIS平臺(tái)。面對(duì)海量的三維數(shù)字城市的建筑模型,手工切割的效率不僅低下,而且需要大量的人員投入。針對(duì)這種情況,該文探討了建筑模型自動(dòng)分層切割算法,基于3DS Max的二次開(kāi)發(fā)工具實(shí)現(xiàn)了建筑模型自動(dòng)分層切割,極大的提高了工作效率。
1 定義
1.1 CSG模型
三維矢量模型是二維中點(diǎn)、線(xiàn)、面矢量模型在三維中的推廣。它將三維空間中的實(shí)體抽象為三維空間中的點(diǎn)、線(xiàn)、面、體四種基本元素,然后以這四種基本幾何元素的集合來(lái)構(gòu)造更復(fù)雜的對(duì)象。以起點(diǎn)、終點(diǎn)來(lái)限定其邊界,以一組型值點(diǎn)來(lái)限定其形狀;以一個(gè)外邊界環(huán)和若干內(nèi)邊界環(huán)來(lái)限定其邊界,以一組型值曲線(xiàn)來(lái)限定其形狀;以一組曲面來(lái)限定其邊界和形狀。矢量模型能精確表達(dá)三維的線(xiàn)狀實(shí)體、面狀實(shí)體和體狀實(shí)體的不規(guī)則邊界,數(shù)據(jù)存儲(chǔ)格式緊湊、數(shù)據(jù)量小,并能直觀地表達(dá)空間幾何元素間的拓?fù)潢P(guān)系。
CSG模型(Constructive Solid Geometry)用一些基本體素如長(zhǎng)方體、球柱體、椎體和圓環(huán)等,通過(guò)集合運(yùn)算如并、交、差等操作來(lái)組合形成物體。如圖1所示。
TIN-CSG混合構(gòu)模是當(dāng)前城市3D GIS和3DCM 構(gòu)模的主要方式,即以TIN模型表示地形表面,以CSG模型表示城市建筑物,兩種模型的數(shù)據(jù)是分開(kāi)存儲(chǔ)的。為了實(shí)現(xiàn)TIN與CSG的集成,在TIN模型的形成過(guò)程中將建筑物的地面輪廓作為內(nèi)部約束,同時(shí)把CSG模型中建筑物的編號(hào)作為T(mén)IN模型中建筑物的地面輪廓多邊形的屬性,并且將兩種模型集成在一個(gè)用戶(hù)界面[3-4]。
1.2 紋理
三維模型的紋理是應(yīng)用到模型上的一個(gè)二維圖片。紋理位圖對(duì)應(yīng)二維數(shù)組中的每一元素,在表示紋理時(shí)對(duì)應(yīng)的二維下標(biāo)稱(chēng)為紋理映射坐標(biāo),用字母(u,v)表示。紋理映射是紋理圖貼到多邊形表面的過(guò)程。
紋理坐標(biāo)系(D3D)如圖3所示。
1.3 三維模型分割
三維模型分割是根據(jù)一定的幾何及拓?fù)涮卣?,將封閉的三維網(wǎng)格多面體,依據(jù)表面幾何、拓?fù)涮卣?,分解為一組數(shù)目有限、各自具有簡(jiǎn)單形狀意義的、而且各自聯(lián)通的三維模型子塊的工作。
三維模型分割的定義。三維模型分割算法大體有基于分水嶺方法的分割、基于曲率信息的分割、基于體素分解的分割、基于聚類(lèi)分析的分割、基于拓?fù)浣Y(jié)構(gòu)圖的分割,還有文獻(xiàn)[1]武漢大學(xué)楊必勝教授等研究的基于切割環(huán)分解三維建筑物模型的算法等。
該文的切割方法是在3DMax里面調(diào)用切割(cup)函數(shù)直接對(duì)模型進(jìn)行分層切割。在3DMax里面切割的好處是不用考慮復(fù)雜的切割算法以及三維實(shí)體重構(gòu),分割后的模型能保留正確的拓?fù)湫畔⒁约巴暾臉菍蛹y理信息,效率非常高。
1.4 碰撞檢測(cè)
如何求出三維模型樓頂?shù)淖鴺?biāo)是該文切割方法的基礎(chǔ),最好的辦法是利用碰撞檢測(cè)[5]。
在虛擬現(xiàn)實(shí)世界中一般是通過(guò)檢測(cè)兩個(gè)實(shí)體所占的幾何空間是否相交判斷是否發(fā)生碰撞。在現(xiàn)實(shí)世界中,每個(gè)實(shí)體都占有一定幾何空間,而且不可能出現(xiàn)兩個(gè)實(shí)體相互穿透的現(xiàn)象。當(dāng)虛擬現(xiàn)實(shí)系統(tǒng)中兩個(gè)實(shí)體所占有的幾何空間試圖相互穿透時(shí),系統(tǒng)就認(rèn)為這兩個(gè)實(shí)體發(fā)生了碰撞。
用四維空間來(lái)描述運(yùn)動(dòng)實(shí)體,前四維是通常意義上的四維空間,第四維是時(shí)間,那末一個(gè)實(shí)體就可以用四維空間中的點(diǎn)集來(lái)描述,即:
2 算法實(shí)現(xiàn)及應(yīng)用
該方法是根據(jù)大比例尺DLG數(shù)據(jù)庫(kù)的居民地面得到樓層數(shù)、三維模型主體絕對(duì)高度以及三維模型側(cè)面紋理來(lái)判斷確定每層高度,然后從下往上對(duì)模型進(jìn)行分層切割。
2.1 基于3DS Max切割算法設(shè)計(jì)
3DS Max是AutoDesk公司開(kāi)發(fā)的專(zhuān)業(yè)建模、動(dòng)畫(huà)制作、虛擬設(shè)計(jì)軟件,功能強(qiáng)大。該軟件提供了兩個(gè)層次的開(kāi)發(fā)工具:MAXscript和SDK(Software Development Kit)。SDK是3ds Max強(qiáng)大的工具包,能開(kāi)發(fā)出各種各樣的插件,3DS Max插件其實(shí)就是動(dòng)態(tài)鏈接庫(kù)用以擴(kuò)展MAX的功能,在windows里面就是DLL。
該工具開(kāi)發(fā)環(huán)境:Visual studio 2005、3DMax9.0、3DS MAX SDK和ArcGIS Engine。3DS MAX SDK則需要從完整版的3DMAX光盤(pán)中安裝。
其算法流程如下圖4所示。
(1) 樓層數(shù)F1是直接讀取模型所在居民地面的Floor屬性得到。
(2) 模型主體高度H1的計(jì)算。
只要得到模型高度頂點(diǎn)(Vertex)列表,用GetVertex(i)獲取各頂點(diǎn)坐標(biāo)列表,通過(guò)程序計(jì)算出女兒墻的高度,從而得到準(zhǔn)確的模型主體高度H1。
首先讀取模型所有的頂點(diǎn)坐標(biāo),如下圖6的B1、B2、B3、B4和D1、D2、D3、D4,根據(jù)頂點(diǎn)Z坐標(biāo)分別構(gòu)建平面封閉圖,再把全部平面封閉圖投影到一個(gè)平面上,判斷分析區(qū)分房上房頂和主體房頂。從而得到B1、B2、B3和B4是樓房主體房頂坐標(biāo)。
然后隨意取樓房主體房頂任一邊(B2,B3),找出D1、D2、D3和D4最近的點(diǎn)D3,D3點(diǎn)和樓房主體頂點(diǎn)B3連線(xiàn),取中間點(diǎn)F,從F點(diǎn)往Z坐標(biāo)反方向做射線(xiàn)與樓房模型做碰撞檢測(cè),得到碰撞點(diǎn)G。如圖6所示。
最后把碰撞點(diǎn)G和B3進(jìn)行比較,如果Z坐標(biāo)相等說(shuō)明模型沒(méi)有女兒墻;如果不相等說(shuō)明模型樓頂有女兒墻,B3的Z坐標(biāo)減去G的Z坐標(biāo)就得到女兒墻的高度,B3的Z坐標(biāo)再減去A3的Z坐標(biāo)再減去女兒墻的高度就是模型主體高度H1。
(3) 層高信息的計(jì)算。
貼圖要求為保證區(qū)域范圍內(nèi)整體色調(diào)的一致性,尤其獨(dú)立小區(qū)內(nèi)多個(gè)外觀一致性的建筑物模型,材質(zhì)色調(diào)要求一致、協(xié)調(diào)(貼圖前建立色板或公共紋理庫(kù),所有貼圖人員從紋理庫(kù)中提取紋理,但紋理名稱(chēng)不能改變,達(dá)到紋理重用以減少紋理數(shù)量)。因此可以通過(guò)三維模型側(cè)面主體紋理的查找統(tǒng)計(jì),計(jì)算出主體樓層數(shù)。
在3D Max 獲取模型所有面的貼圖信息,找到Z坐標(biāo)方向出現(xiàn)次數(shù)最多的紋理名稱(chēng),然后再計(jì)算該紋理在Z坐標(biāo)方向出現(xiàn)的個(gè)數(shù),就是主體樓層數(shù)F2。同時(shí)計(jì)算一個(gè)紋理在Z坐標(biāo)方向的高度,得到樓層高度H2。
如果F1等于F2,說(shuō)明所有的樓層高度都是一致的,不需要對(duì)一樓樓層高度進(jìn)行另外計(jì)算;
如果F1不等于F2,說(shuō)明樓層高度不一致,一般是一樓高度是挑高層。一樓挑高的層高計(jì)算公式:
F3=H1-F2×H2
最后把層高信息記錄在數(shù)組M里。
Float[] M = F3,H2,…
(4) 定義切割路徑列表。
依次將數(shù)組M放入切割路徑列表,并對(duì)潛在切割對(duì)象構(gòu)建空間索引,存放樓層屬性信息便于日后3D GIS系統(tǒng)平臺(tái)的具體應(yīng)用。從模型的最底層開(kāi)始調(diào)用3DMax的切割函數(shù)依次從下到上進(jìn)行分層切割。
2.2 應(yīng)用試驗(yàn)
該文試驗(yàn)區(qū)域的三維模型通過(guò)高精度航拍的立體像對(duì)進(jìn)行建模,模型頂上(平面屋頂、坡屋頂、瓦屋頂)的高度都是內(nèi)業(yè)量測(cè)出來(lái)的。成片居民區(qū)(屋頂有女兒墻的)以女兒墻高度測(cè)圖,并實(shí)地拍照進(jìn)行紋理采集,最后利用三維建模軟件3DMax烘培合成。試驗(yàn)區(qū)域?yàn)樽≌瑯恰?/p>
該試驗(yàn)區(qū)域精模紋理長(zhǎng)、寬均為2的n次冪像素值,貼圖單邊像素?cái)?shù)≤1024;中模紋理長(zhǎng)、寬均為2的n次冪像素值,貼圖單邊像素?cái)?shù)≤512;簡(jiǎn)模紋理長(zhǎng)、寬均為2的n次冪像素值,貼圖單邊像素?cái)?shù)≤256。貼圖紋理尺寸長(zhǎng)寬比例為1:1或1:2。紋理與實(shí)際一致(嚴(yán)格按照建筑物層數(shù)、窗戶(hù)數(shù)量制作紋理)。
數(shù)據(jù)的準(zhǔn)備:大比例尺DLG數(shù)據(jù)庫(kù)MDB的居民地面數(shù)據(jù)。
該文選取的三維建筑模型是典型的居民樓,如圖9所示。樓層共11層,樓頂有樓梯房、裝飾構(gòu)件、兒女墻等,樓體有飄窗、陽(yáng)臺(tái)等構(gòu)件,一樓是架空層。程序通過(guò)面積比較很容易把房上房頂、裝飾構(gòu)件和主體樓頂區(qū)分開(kāi)來(lái),快速準(zhǔn)確算出女兒墻的高度。程序計(jì)算一樓的挑高高度為3.8 m,主體樓層高度為2.8 m。圖10切割結(jié)果表明,主體樓層和挑高樓層分層準(zhǔn)確,沒(méi)有出現(xiàn)模型分割錯(cuò)誤,分割后的樓層紋理正確,拓?fù)潢P(guān)系正確。
3 結(jié)語(yǔ)
通過(guò)SDK插件開(kāi)發(fā)直接調(diào)用3DMax的核心函數(shù)對(duì)模型進(jìn)行自動(dòng)分層切割,不但提高了程序運(yùn)行速度,還使模型分割效率和產(chǎn)品質(zhì)量有極大的提高,縮短了生產(chǎn)周期。3DMax的二次開(kāi)發(fā)功能,對(duì)于理論研究和解決實(shí)際問(wèn)題是十分有效的方法和手段。
三維網(wǎng)格模型的分割是具有挑戰(zhàn)性的課題,下一步研究的重點(diǎn)是引入樓層戶(hù)型平面圖進(jìn)行自動(dòng)分棟分層分戶(hù)切割并自動(dòng)構(gòu)建室內(nèi)建模技術(shù)。
參考文獻(xiàn)
[1] 楊必勝,姜少波.基于切割環(huán)分解的三維建筑物細(xì)節(jié)層次模型構(gòu)造[J].測(cè)繪學(xué)報(bào),2011,40(5):575-581.
[2] 孫曉鵬.三維模型的分割及應(yīng)用研究[D].北京:中國(guó)科學(xué)院研究生院(計(jì)算技術(shù)研究所),2005.
[3] 李清泉.基于混合結(jié)構(gòu)的三維GIS數(shù)據(jù)模型與空間分析研究[D].武漢:武漢測(cè)繪科技大學(xué),1998.
[4] 孫敏,陳軍.基于幾何元素的三維景觀實(shí)體建模研究[J].武漢測(cè)繪科技大學(xué)學(xué)報(bào),2000,25(3):233-237.
[5] 焦?jié)?分布式虛擬環(huán)境中碰撞檢測(cè)響應(yīng)的研究與實(shí)現(xiàn)[D].北京:北京航空航天大學(xué),2001.
[6] 荷塘月色創(chuàng)作組.如何使用3DS SDK開(kāi)發(fā)程序[M].北京:北京理工大學(xué)出版社,1999.
[7] 羅勝.3DS Max SDK插件開(kāi)發(fā)技術(shù)[J].機(jī)床與液壓,2003(6):242-243.