楊 波,樊超群
(中國電子科技集團第二十八研究所,江蘇 南京 210004)
隨著科學(xué)技術(shù)的發(fā)展,消防、公安、軍事等領(lǐng)域?qū)κ覂?nèi)人員精準(zhǔn)定位的需求日益增加,但精準(zhǔn)室內(nèi)定位顯示要依賴于精確的三維建筑室內(nèi)模型。目前常用的生成三維建筑模型的方法主要有基于無人機的傾斜攝影修正、基于BIM的Revit軟件建模和3DMAX建模等,但這些方式基本都需要專業(yè)領(lǐng)域的工程師才能操作,并且完成一個完整的模型需要大量時間,無法滿足消防和公安等實時使用的需求[1]。
本文將介紹以當(dāng)前建筑行業(yè)廣泛使用的AutoCAD二維建筑圖樣為基礎(chǔ),利用二次開發(fā)技術(shù)提取室內(nèi)建筑模型要素,通過三維模型軟件,快速簡易生成精確三維室內(nèi)建筑模型的方法。
目前常用的生成三維建筑模型的方法主要有基于無人機傾斜攝影修正、基于BIM的Revit軟件建模和3DMAX建模等,下述簡單介紹這幾種方式。
1)無人機傾斜攝影。
通過無人機搭載數(shù)個專業(yè)高分辨率傾斜攝影相機,分別從不同方向沿事先規(guī)劃好的航線拍攝目標(biāo)建筑物,拍攝完成后根據(jù)GPS信息和慣性導(dǎo)航信息對數(shù)據(jù)進行幾何校正處理,再利用專業(yè)的測繪軟件通過多視角的影像運算出建筑模型,在此基礎(chǔ)上再通過著色處理等方式形成傾斜攝影三維建筑模型[2]。
2)Revit軟件建模。
Revit是Autodesk公司專為建筑信息模型(BIM)設(shè)計的,記錄建筑的全生命周期,包括幾何和非幾何信息,但是需要專業(yè)建筑設(shè)計人員根據(jù)前期二維圖樣仔細設(shè)計所有建筑要素,比如立柱、墻體、門、窗等,通過逐層累加形成三維建筑模型[3]。
3)3DMAX建模。
3DMAX軟件廣泛應(yīng)用于建筑設(shè)計、游戲、工業(yè)設(shè)計等領(lǐng)域,采用3DMAX創(chuàng)建三維建筑模型需要專業(yè)設(shè)計人員基于二維圖樣底圖,對各要素進行造型、PS處理、貼圖等操作,通過渲染使建筑模型比較逼真,最后將模型整體導(dǎo)入三維場景系統(tǒng)使用[4]。
上述3種方式都需要專業(yè)技術(shù)人員配合專用商業(yè)軟件才能生成三維建筑模型,無法滿足消防等領(lǐng)域即時性的要求。
本文設(shè)計一種基于二維AutoCAD圖樣快速生成三維建筑模型的方法,其包括基于二維圖樣圖層的建筑特征要素數(shù)據(jù)輸出和基于三維設(shè)計軟件的三維建筑模型生成,主要有如下幾個步驟。
1)導(dǎo)入樓層圖樣:將樓層建筑平面圖加載到軟件中。
2)提取圖層信息:獲取當(dāng)前平面圖圖樣的圖層信息。
3)圖層要素分類:根據(jù)預(yù)先設(shè)定要素,將圖層分類。
4)輸出特征要素文件:通過建筑物名稱、樓層和樓高等信息輸出特征要素數(shù)據(jù)文件。
5)生成建筑模型:利用解析過的特征要素數(shù)據(jù),根據(jù)特征生成相應(yīng)建筑模型。
流程圖如圖1所示。
AutoCAD二次開發(fā)方法有ObjectARX、VBA、AutoLISP和.NET等,本文主要介紹AutoCAD.NET二次開發(fā)方法。
AutoCAD.NET使用戶可通過編程的方法利用程序集或開放庫操作AutoCAD和圖形文件。通過開放的對象,它們可被許多不同的編程語言和環(huán)境訪問,AutoCAD.NET的API接口中有許多不同類型的對象,其對象模型之間的關(guān)系構(gòu)成一種樹狀結(jié)構(gòu)[5](見圖2)。
在對象結(jié)構(gòu)中以Application為基礎(chǔ),一個AutoCAD應(yīng)用程序就是一個Application對象,通過Application對象,用戶可以訪問主窗口以及任何打開的圖形。一旦用戶獲得了圖形,就可以訪問圖形中的對象[6]。下述是本文用到的幾個主要對象。
1)Document對象。
Document對象實際上就是AutoCAD圖形,它是DocumentCollection對象的一部分,并提供訪問與Document對象相關(guān)的Database對象。
Document對象提供訪問圖形狀態(tài)欄(StatusBar)、document對象被打開的窗口(Window)、Editor(Editor)和事務(wù)管理器(TransactionManager)的對象。Editor提供用戶以輸入形式獲取的點、輸入字符串或數(shù)字值的功能。
2)Database對象。
Database對象包括所有的圖形和大部分非圖形的AutoCAD對象。被包含在Database中的一些對象有實體、符號表、命名字典。實體在Database中表示圖樣內(nèi)部的圖形對象。直線、圓、圓弧、文本、填充和多段線都是實體的一個例子。用戶可以在屏幕上看到一個實體并可以操作它。用戶通過Document對象的Database成員屬性可以訪問當(dāng)前文檔的Database對象。
3)圖形和非圖形對象。
圖形對象,也稱為圖元,是組成圖形的可見對象(例如直線、圓、光柵圖像等)。添加圖形對象到圖形中是通過正確的塊表記錄引用,然后使用AppendEntity方法將一個新對象添加到圖形中來完成的。
非圖形對象是指屬于圖形的一部分但不可見的(提示性的)對象,例如Layers、Linetypes、DimStyles、TableStyle等。若要創(chuàng)建新的符號表記錄,請使用表所有者的Add方法或使用SetAt方法添加一個字典到命令對象字典中[7]。
輸出特征要素文件以C#.NET平臺開發(fā),圖3所示為輸出特征要素數(shù)據(jù)文件總體流程圖,包括如下幾個步驟。
1)導(dǎo)入樓層圖樣:將樓層建筑平面圖加載到AutoCAD軟件中(見圖4)。
2)提取圖層信息:獲取當(dāng)前平面圖圖樣的圖層信息。
3)圖層要素分類:根據(jù)預(yù)先設(shè)定要素,將圖層分類。
4)提取要素信息:根據(jù)特征要素提取對應(yīng)圖層中點、線、多線段和塊等模型信息。
5)輸出特征要素數(shù)據(jù)文件:通過建筑物名稱、樓層和樓高等信息結(jié)合特征要素信息輸出特征要素數(shù)據(jù)文件。
6)是否輸出所有樓層:根據(jù)判斷是否已完成所有樓層數(shù)據(jù)輸出,如果已完成則結(jié)束,如果未完成則重復(fù)步驟1~5。
具體開發(fā)軟件為VisualStudio 2010與AutoCAD 2014結(jié)合開發(fā),首先加載AutoCAD指定目錄的acdbmgb.dll與acmgb.dll作為引用文件,這2個文件是進行AutoCAD.NET二次開發(fā)必須引用的,通過AtuoCAD自定義菜單與代碼中[CommandMethod("XXX")]字符關(guān)聯(lián)調(diào)出軟件主界面[8]。
在導(dǎo)入樓層圖樣后,通過界面讀取當(dāng)前圖樣的圖層LayerTable信息,以列表形式展示并可以通過控制顯隱來直觀感受圖層所對應(yīng)的特征要素。接著按照預(yù)先設(shè)定墻體Wall、門窗Window和樓梯Stair等建筑要素將圖層分類,再分別針對分類要素對相應(yīng)圖層的數(shù)據(jù)進行篩選提取,比如點Point3d、線Line、多線段Polyline和塊BlockReference等,最后按照名稱等建筑物總體屬性,樓層高度等各樓層屬性,墻、門窗和樓梯等樓層特征要素屬性組織成對應(yīng)XML文件輸出[9]。
三維設(shè)計軟件建筑模型生成流程如圖5所示,包括如下幾個步驟。
1)導(dǎo)入特征要素數(shù)據(jù)文件:導(dǎo)入整體建筑模型特征要素數(shù)據(jù)文件。
2)解析建筑要素:通過解析結(jié)構(gòu)化文件識別各個特征要素數(shù)據(jù)。
3)生成建筑模型:利用解析過的特征要素數(shù)據(jù),根據(jù)特征生成相應(yīng)建筑模型。
以三維渲染效果較好的Unity3D為例,Unity3D方便的腳本編譯接口,結(jié)合VS2010可快速部署開發(fā)環(huán)境。按照一定格式提供解析,依據(jù)解析的特征要素分別創(chuàng)建不同的Object,如樓層Object、墻Object、門窗Object和樓梯Object等。在Unity3D世界中Object形狀由Mesh元素決定,而Mesh通過坐標(biāo)點繪制而成,通過解析XML文件中存儲的要素的坐標(biāo)點,然后賦值給各要素對應(yīng)的Mesh,就可繪制出Object的形狀,從而構(gòu)建出整個三維建筑模型。最后通過材質(zhì)設(shè)置Material以使建筑更加逼真[10],最終效果如圖6所示。
利用AutoCAD的二次開發(fā)技術(shù)進行建筑特征的信息提取導(dǎo)出中間模型數(shù)據(jù),再結(jié)合三維模型軟件二次開發(fā)解析數(shù)據(jù)快速生成三維建筑模型,該技術(shù)優(yōu)點是操作界面簡單,容易快速上手,適用于需要快速現(xiàn)場依據(jù)電子圖樣生成三維模型的需求,但也有相應(yīng)的缺點,即需要二維和三維2種軟件相結(jié)合。