范冬林,謝美亭,康傳利,黃莉婷,付波霖
(桂林理工大學(xué) a.測繪地理信息學(xué)院;b.廣西空間信息與測繪重點(diǎn)實(shí)驗(yàn)室,廣西 桂林 541006)
傾斜攝影測量是高精度的航拍測量,因其效率高、成本低等特點(diǎn),使得利用傾斜攝影測量方式繪制地形圖漸受重視[1]。利用傾斜攝影技術(shù)生成的傾斜攝影三維模型數(shù)據(jù)相較于傳統(tǒng)人工建模數(shù)據(jù),可以更加真實(shí)地反映地物的情況,增強(qiáng)三維數(shù)據(jù)所帶來的真實(shí)感,從而擴(kuò)大傾斜攝影技術(shù)的應(yīng)用,使得傾斜攝影測量數(shù)據(jù)處理逐漸成為傾斜攝影測量領(lǐng)域研究的熱點(diǎn)之一[2]。近年來,學(xué)者對傾斜模型單體化、多源數(shù)據(jù)融合等傾斜數(shù)據(jù)處理方式進(jìn)行了大量的研究,如耿中元等提出的一種基于外部緩沖區(qū)和TIN瓦片金字塔的數(shù)據(jù)融合新算法來解決傾斜攝影的三維模型與大場景地形相融合問題的方法,擴(kuò)展了傾斜模型數(shù)據(jù)作為基礎(chǔ)場景在三維地理信息系統(tǒng)中的應(yīng)用[3];王勇等提出利用三角面片的可分割性質(zhì)來解決傾斜攝影數(shù)據(jù)的三維模型可分離單體化問題,深化了傾斜模型數(shù)據(jù)的應(yīng)用場景[4]。市場上也已經(jīng)推出了多款傾斜攝影測量數(shù)據(jù)處理軟件,如Smart3D Capture、SuperMap GIS7C、Skyline V6.5等國內(nèi)外軟件[5-7]。此外,對在其他三維建模軟件上處理傾斜攝影數(shù)據(jù)的方法進(jìn)行相關(guān)研究,如利用傾斜攝影技術(shù)與3ds Max插件開發(fā)技術(shù)實(shí)現(xiàn)的半自動(dòng)建模[8-9];在數(shù)據(jù)處理階段中,利用SketchUp二次開發(fā)技術(shù)在傾斜測量數(shù)據(jù)模型進(jìn)行建筑三維重建[10];更進(jìn)一步還有基于CeisumJS實(shí)現(xiàn)的傾斜攝影地形數(shù)據(jù)Web三維渲染技術(shù)[11-12]等,但傾斜攝影測量數(shù)據(jù)應(yīng)用在AutoCAD建模上的相關(guān)研究仍然較少。若能擴(kuò)展OSGB模型轉(zhuǎn)換格式,將OSGB模型自動(dòng)轉(zhuǎn)換為DWG三維模型,實(shí)現(xiàn)包括紋理數(shù)據(jù)的真實(shí)渲染,這將大大促進(jìn)傾斜攝影模型在AutoCAD中的使用,滿足國土、規(guī)劃部門的業(yè)務(wù)需求,更好地解決實(shí)際生產(chǎn)中的傾斜攝影數(shù)據(jù)處理與應(yīng)用問題。
通常而言, 單個(gè)OSGB三維模型數(shù)據(jù)中有多個(gè)文件夾, 每個(gè)文件夾下包含多個(gè)OSGB格式的數(shù)據(jù)文件,每個(gè)OSGB文件包含1個(gè)根節(jié)點(diǎn)(Group類型); 中間層次的節(jié)點(diǎn)(Group類型或Geode類型), 其包含有模型的幾何信息、 紋理信息、上下層節(jié)點(diǎn)之間的父子關(guān)系; 最底層的節(jié)點(diǎn)(Geode類型),該節(jié)點(diǎn)僅包含模型的幾何和紋理信息。
從數(shù)據(jù)模型上看,OSGB模型是利用自動(dòng)化軟件,經(jīng)過一定處理流程,運(yùn)算生成基于真實(shí)影像的超高密度點(diǎn)云,并以此生成基于真實(shí)影像紋理的高分辨率實(shí)景三維模型,其本質(zhì)上是mesh模型[13]。
DWG文件為AutoDesk公司推出的一種非公開的圖形格式文件,其由點(diǎn)、線、面等實(shí)體構(gòu)成CAD圖形數(shù)據(jù)庫[14]。DWG文件內(nèi)容分為索引部、標(biāo)題部、實(shí)體部、名表部四部分。圖形的大部分信息都在實(shí)體部段中,因此對于從OSGB模型轉(zhuǎn)為DWG模型,如何創(chuàng)建DWG的實(shí)體部的數(shù)據(jù)是重點(diǎn)。創(chuàng)建實(shí)體段的數(shù)據(jù)首先要考慮需要讀取的數(shù)據(jù)的存儲(chǔ)方式,然后進(jìn)行后一步的處理或存入數(shù)據(jù)文件。
OpenSceneGraph(OSG)是使用OpenGL技術(shù)開發(fā)的, 基于C++平臺(tái)的應(yīng)用程序接口(API),能讓開發(fā)人員更加快速、便捷地創(chuàng)建高性能、跨平臺(tái)的交互式圖形程序[15]。國內(nèi)傾斜攝影測量數(shù)據(jù)多數(shù)為OSGB格式,該格式為OSG的二進(jìn)制數(shù)據(jù)格式。在OSG中有多種庫文件,其中的OSG讀寫庫(osgDB庫)采用插件管理架構(gòu),允許用戶程序加載、使用和寫入3D數(shù)據(jù)庫,以支持大量常見的3D圖形文件格式。本文利用該插件機(jī)制完成對OSGB數(shù)據(jù)的解析。
目前, AutoCAD提供的開發(fā)接口有ObjectARX、 .NET、 VisualLISP、 VBA等, 其中ObjectARX(ARX)是AutoDesk公司針對CAD平臺(tái)上的二次開發(fā)而推出的一個(gè)開發(fā)軟件包, 它提供了以C++為基礎(chǔ)的面向?qū)ο蟮拈_發(fā)環(huán)境及應(yīng)用程序接口, 而且CAD自身的許多模塊也是用ObjectARX開發(fā)的, 它的功能最強(qiáng)大、 性能最高,能真正快速地、 完全地訪問DWG文件, 使用ARX編程的函數(shù)的執(zhí)行速度大大提高[16]。 ARX應(yīng)用程序是一個(gè)DLL(動(dòng)態(tài)鏈接庫), 共享CAD的地址空間, 對CAD進(jìn)行直接函數(shù)調(diào)用[17], 使得開發(fā)者可以充分利用CAD的開放結(jié)構(gòu), 直接訪問CAD數(shù)據(jù)庫結(jié)構(gòu)、 圖形系統(tǒng)以及CAD幾何造型核心, 能夠在運(yùn)行期間實(shí)時(shí)擴(kuò)展CAD功能。
由以上分析可知,將OSGB模型自動(dòng)轉(zhuǎn)換為DWG三維模型,首先要先利用OSG對OSGB文件進(jìn)行解析,得到頂點(diǎn)坐標(biāo)、紋理坐標(biāo)、面頂點(diǎn)索引、紋理、法線等數(shù)據(jù);然后將這些數(shù)據(jù)進(jìn)行存儲(chǔ),作為緩存文件,利用ARX重新創(chuàng)建多個(gè)面片組成的三維模型及紋理映射;最終輸出DWG三維模型文件。技術(shù)路線如圖1所示。
傾斜攝影技術(shù)生成的OSGB模型數(shù)據(jù)主要涉及兩類數(shù)據(jù):模型數(shù)據(jù)(包含頂點(diǎn)坐標(biāo)、面部索引和法線)和紋理數(shù)據(jù)(包含紋理圖片和紋理坐標(biāo))。本文根據(jù)OSGB格式特點(diǎn),針對上述兩類數(shù)據(jù)完成OSGB模型數(shù)據(jù)解析。
3.1.1 模型數(shù)據(jù)解析 OSG中主要包含有Node、 Geode(葉節(jié)點(diǎn))和Group(組節(jié)點(diǎn))這三大基本類節(jié)點(diǎn), 可以利用OSG中的文件讀寫庫(osgDB),調(diào)用readNodeFile函數(shù),將OSGB模型數(shù)據(jù)加載到Node類對象中,然后設(shè)計(jì)頂點(diǎn)訪問器和紋理訪問器,將這兩個(gè)訪問器都繼承于NodeVisitor類,并重載apply函數(shù),遍歷整個(gè)OSGB模型場景函數(shù)并調(diào)用被訪問子節(jié)點(diǎn)的函數(shù),依次對Node、Geode、StateSet節(jié)點(diǎn)進(jìn)行處理。其中Geode繼承自Node節(jié)點(diǎn),其包含幾何體信息,用于管理幾何圖元,模型數(shù)據(jù)的解析主要針對該節(jié)點(diǎn)進(jìn)行。
3.1.2 紋理數(shù)據(jù)解析 紋理數(shù)據(jù)是傾斜模型真實(shí)表達(dá)的基礎(chǔ),對紋理進(jìn)行正確解析才能確保轉(zhuǎn)換后的DWG模型高保真性。OSGB模型中Texture2D管理場景中的紋理對象,用Image管理圖像的像素?cái)?shù)據(jù),若要用2D圖像文件作為紋理圖形,就要將文件名賦給Image對象,并將Image關(guān)聯(lián)到Texture2D。因?yàn)镚eometry對象將vertex及其屬性數(shù)據(jù)(包括圖元的頂點(diǎn)、 頂點(diǎn)顏色、 頂點(diǎn)關(guān)聯(lián)方式、 法線顏色、 法線、 紋理坐標(biāo)等基本信息)存儲(chǔ)在數(shù)組中,故可以通過數(shù)組索引將頂點(diǎn)數(shù)組映射到顏色、法線或紋理坐標(biāo)數(shù)組??紤]到OSGB模型的紋理坐標(biāo)與DWG模型Y軸參考點(diǎn)不同,故在緩存紋理坐標(biāo)時(shí)需將其進(jìn)行轉(zhuǎn)換,在解析紋理坐標(biāo)時(shí)需要根據(jù)該公式計(jì)算解析后的紋理坐標(biāo):
Xd=Xo,
(1)
Yd=1-Yo。
(2)
其中,Xd、Yd表示DWG模型中的紋理坐標(biāo);Xo、Yo表示OSGB中的紋理坐標(biāo)。
針對紋理數(shù)據(jù),本文直接將其解析為圖像格式數(shù)據(jù)。由此便完成了OSGB數(shù)據(jù)解析工作,解析過程如圖2所示。
圖2 OSGB文件解析示意圖Fig.2 Schematic diagram of the OSGB model parsing
根據(jù)上述分析,本文對OSGB模型數(shù)據(jù)的解析步驟為:① 設(shè)計(jì)2個(gè)繼承于NodeVisitor類的訪問器——頂點(diǎn)訪問器(GeometryVisitor)和紋理訪問器(TextureVisitor);② 將一個(gè)具體的訪問器對象傳遞給節(jié)點(diǎn),遍歷整個(gè)OSGB模型場景;③ 解析結(jié)點(diǎn)中含有Drawable對象中的數(shù)據(jù)。
實(shí)現(xiàn)的關(guān)鍵代碼如下:
//獲取模型數(shù)據(jù)
void GeometryVisitor::processGeometry (osg::Geometry* geo, osg::Matrix& m)
{
if (geo->containsDeprecatedData()) geo->fixDeprecatedData();
//獲取頂點(diǎn)數(shù)據(jù)
processArray(“v”,geo->getVertexArray(), m, false);
//獲取法線數(shù)據(jù)
processArray(“vn”,geo->getNormalArray(), m, true);
//獲取紋理坐標(biāo)
processArray(“vt”,geo->getTexCoordArray(0));
};
//獲取紋理數(shù)據(jù)
Texture2D*tex2D=NULL;
StateAttribute*pTexture;
pTexture=state->getTextureAttribute(i, StateAttribute::TEXTURE);
if (tex2D=dynamic-cast
{
//獲取到紋理
Image*image=tex2D->getImage();
…
}
傾斜攝影技術(shù)生成的OSGB模型本質(zhì)上是mesh模型,該模型是以三角面片加上紋理的方式完成渲染,其數(shù)據(jù)組織方式與AutoCAD中的數(shù)據(jù)類型AcDbSubDMesh較為相似。AcDbSubDMesh可以創(chuàng)建多個(gè)面片組成的三維模型,并支持紋理映射。利用3.1節(jié)解析后的模型數(shù)據(jù)和紋理數(shù)據(jù),按照AcDbSubDMesh的創(chuàng)建方法進(jìn)行三角面片模型組織,創(chuàng)建mesh是實(shí)體,完成DWG模型重組。由此便實(shí)現(xiàn)OSGB三維模型到的DWG三維模型的轉(zhuǎn)換。DWG三維模型重組方式如圖3所示。
圖3 DWG三維模型重組方式Fig.3 Restructuring method of DWG 3D model
基于上述分析,AutoCAD中進(jìn)行三維模型重組需進(jìn)行模型數(shù)據(jù)和紋理數(shù)據(jù)的設(shè)置,通過紋理坐標(biāo)完成紋理映射,具體步驟:① 創(chuàng)建AcDbSubDMesh對象meshObj;② 創(chuàng)建命名材質(zhì)objMaterial;③ 將材質(zhì)objMaterial賦予meshObj;④ 設(shè)置紋理坐標(biāo)和法線。
實(shí)現(xiàn)的關(guān)鍵代碼如下:
//創(chuàng)建一個(gè)新的mesh對象
AcDbSubDMesh* ptrMesh=new AcDbSubDMesh();
es=ptrMesh->setSubDMesh(*(pModel Data->pVertexPnts), *(pModelData->pFaceId x),0);
//使用紋理圖片創(chuàng)建材質(zhì)
void CreateMaterial(string name, string meterialPath, AcDbDatabase *pDb);
//賦予材質(zhì)給mesh對象
pSubDMesh->setMaterial(L“osgbMatrial1”, Adesk::kTrue);
//設(shè)置頂點(diǎn)紋理坐標(biāo)
pSubDMesh->setVertexTextureArray(*(osgbModel.pTexturePnts));
//設(shè)置頂點(diǎn)法線
pSubDMesh->setVertexNormalArray (*(osgbModel.pNormalPnts));
以南寧市航洋城為例, 先利用無人機(jī)進(jìn)行傾斜攝影數(shù)據(jù)采集, 然后生成OSGB格式數(shù)據(jù), 選取三維模型中一塊數(shù)據(jù),該塊數(shù)據(jù)隸屬第21層級, 包含路面、 樹和獨(dú)立石碑地物 。在Visual studio 2015環(huán)境下編程實(shí)現(xiàn)本文提出的方法, 硬件環(huán)境為: 戴爾optiplex 7080 臺(tái)式機(jī), i5四核四線程CPU(主頻3.30 GHz), 內(nèi)存為12 G, 硬盤500 G。 軟件配置: 操作系統(tǒng)為Windows 7 SP1, AutoCAD版本為2017, OpenSceneGraph版本為3.6.1。
實(shí)驗(yàn)數(shù)據(jù)大小為98 kB,包含912個(gè)頂點(diǎn)坐標(biāo)數(shù)據(jù),12個(gè)紋理坐標(biāo)數(shù)據(jù)以及884個(gè)面片數(shù)據(jù)。該模型的部分頂點(diǎn)坐標(biāo)數(shù)據(jù)見表1,部分紋理坐標(biāo)數(shù)據(jù)見表2,部分的面部索引數(shù)據(jù)見表3。
針對該模型, 首先將其解析得到頂點(diǎn)坐標(biāo)數(shù)據(jù)和面部索引數(shù)據(jù), 然后根據(jù)ARX以mesh的方式組織為DWG模型, 得到紋理的mesh模型。 圖4a為在Acute3D Viewer中以線框方式顯示的轉(zhuǎn)換前的模型和圖4b中在AutoCAD 2017中以本文方法建立的mesh模型, 可以看出二者都由頂點(diǎn)數(shù)據(jù)連接而成的三角面片組織基本一致, 說明了利用本文方法可以將OSGB中模型數(shù)據(jù)正確轉(zhuǎn)換為無紋理的DWG模型。進(jìn)一步解析紋理數(shù)據(jù)和紋理坐標(biāo), 將紋理數(shù)據(jù)以圖片的方式存儲(chǔ)在文件系統(tǒng)中。利用ARX創(chuàng)建該模型對應(yīng)的材質(zhì),并將材質(zhì)運(yùn)用到該模型上,最后得到轉(zhuǎn)換后的DWG三維模型。圖5a表示原始OSGB模型在軟件Acute3D Viewer中的顯示效果,圖5b表示轉(zhuǎn)換后的DWG三維模型在軟件AutoCAD中的顯示效果??梢钥闯鲛D(zhuǎn)換后的DWG三維模型顯示效果良好,與OSGB模型具有一致的視覺效果。
表1 OSGB部分頂點(diǎn)坐標(biāo)數(shù)據(jù)
表2 OSGB部分紋理坐標(biāo)數(shù)據(jù)
表3 OSGB部分面部索引數(shù)據(jù)
圖4 轉(zhuǎn)換前后的對比(線框模式)Fig.4 Model comparison before and after conversion(wire-frame mode)
為了進(jìn)一步分析, 對比了兩種模型轉(zhuǎn)換前后數(shù)據(jù)組織情況(表4), 由于DWG模型采用的是非索引記錄方式, 因此其頂點(diǎn)數(shù)和UV數(shù)要遠(yuǎn)大于OSGB模型中的數(shù)量。 另外, 從OSGB文件中將紋理信息保存到圖片格式也增加了文件的大小。
圖5 轉(zhuǎn)換前后的對比(真實(shí)模式)Fig.5 Model comparison before and after conversion (realistic mode)
表4 兩種模型的數(shù)據(jù)組織情況
本文通過對OSGB模型的解析和DWG模型重組方法進(jìn)行研究分析的基礎(chǔ)上,提出了一種將OSGB模型自動(dòng)轉(zhuǎn)換為DWG模型的方法,利用OSG和ARX實(shí)現(xiàn)了OSGB模型自動(dòng)轉(zhuǎn)換為DWG三維模型的方法,并對轉(zhuǎn)換前后模型的數(shù)據(jù)組織情況進(jìn)行了對比分析,驗(yàn)證了本文方法的有效性,轉(zhuǎn)換前后的模型顯示效果具有較高一致性,能夠在AutoCAD 2017中正常加載與實(shí)現(xiàn),達(dá)到國土、規(guī)劃部門使用三維模型數(shù)據(jù)的精確性要求。
本文方法只是針對單個(gè)OSGB文件進(jìn)行解析,但一個(gè)完整的傾斜攝影模型是由多個(gè)OSGB文件組成的,在顯示傾斜攝影測量三維模型時(shí),還要考慮OSGB數(shù)據(jù)的LOD顯示效果需求,因此在LOD效果現(xiàn)實(shí)等方面還有待于進(jìn)一步研究和探索。