摘 要:基于傾斜攝影的實(shí)景三維模型是mesh面,在實(shí)際GIS應(yīng)用過程中,需要對模型進(jìn)行單體化處理。目前,傳統(tǒng)的方法采用DP modeler或者3DMAX等軟件進(jìn)行單體化建模,效率低,成本高。本文研究基于多邊形剪裁的實(shí)景三維模型單體化技術(shù),采用三角網(wǎng)索引,實(shí)時(shí)動(dòng)態(tài)的LOD技術(shù)和多邊形裁剪等技術(shù),在原mesh模型的基礎(chǔ)上,提取建筑、道路等地理實(shí)體平面位置,根據(jù)平面位置將地理實(shí)體從mesh網(wǎng)格模型中切割出來,同時(shí)對模型側(cè)面進(jìn)行平滑處理,開發(fā)三維模型自動(dòng)單體化軟件。該技術(shù)在新疆某大面積實(shí)景三維模型項(xiàng)目建設(shè)中得到應(yīng)用,改變了傳統(tǒng)單體化建模的手工建模方法,成倍地降低了三維建模單體化和修模生產(chǎn)成本。
關(guān)鍵詞:無人機(jī)傾斜攝影測量;多邊形剪裁;自動(dòng)紋理映射;LOD技術(shù)
中圖分類號(hào):V 297" " " " " " " " " 文獻(xiàn)標(biāo)志碼:A
傾斜攝影技術(shù)是測量測繪領(lǐng)域發(fā)展起來的一項(xiàng)高新技術(shù)?;趦A斜攝影測量的實(shí)景三維中國建設(shè),是數(shù)字中國建設(shè)的重要組成部分,是國家重大時(shí)空基礎(chǔ)設(shè)施項(xiàng)目。2023年,實(shí)景三維中國建設(shè)進(jìn)入全面實(shí)施階段。傾斜攝影自動(dòng)化建模的技術(shù)機(jī)制,決定了輸出的模型沒有對單獨(dú)的地物進(jìn)行物理區(qū)分,而是一個(gè)連續(xù)的Tin網(wǎng)。傾斜攝影模型的大多數(shù)應(yīng)用都需要能單獨(dú)選中建筑等地物,賦予并查詢屬性等基本GIS功能,單體化問題是傾斜攝影模型在GIS應(yīng)用中需要解決的重要問題。目前,傳統(tǒng)的方法采用DP modeler或者3DMAX等軟件進(jìn)行單體化建模,工作效率低,耗費(fèi)大量的人力和物力。本文研究基于多邊形剪裁的實(shí)景三維模型單體化技術(shù)[1],在原mesh模型的基礎(chǔ)上,提取建筑,道路等地理實(shí)體平面位置,根據(jù)平面位置將地理實(shí)體從mesh網(wǎng)格模型中切割出來,同時(shí)對模型側(cè)面進(jìn)行平滑處理,開發(fā)了三維模型自動(dòng)單體化軟件。
1 總體技術(shù)路線
無人機(jī)在獲取影像數(shù)據(jù)后,利用采集的影像的特征、相機(jī)等設(shè)備的實(shí)際參數(shù)、無人機(jī)拍攝時(shí)的定位信息,利用相關(guān)幾何模型對影像數(shù)據(jù)進(jìn)行幾何校對。采取多幅影像聯(lián)合平差的方式,解決傾斜影像之間的幾何形變及互相重疊遮擋的問題。再應(yīng)用多視影像密集匹配技術(shù)高效、精確地找到多幅傾斜影像中的同名點(diǎn)的坐標(biāo),通過獲取同名點(diǎn)坐標(biāo)將影像匹配,從而獲得需要測量的地物的三維影像信息。得到高密度、真彩色的點(diǎn)云,在處理軟件中導(dǎo)入數(shù)據(jù),構(gòu)建TIN三角網(wǎng),建立實(shí)景三維模型。將實(shí)景三維模型導(dǎo)入EPS提取輪廓線,生成DWG或者SHP矢量數(shù)據(jù)。對矢量數(shù)據(jù)和三維模型進(jìn)行數(shù)據(jù)疊加和多邊形剪裁,將模型進(jìn)行自動(dòng)切割,然后將生成的模型測量紋理自動(dòng)平滑,最終生成具有單體化的三維模型。整個(gè)技術(shù)路線如圖1所示。
2 關(guān)鍵技術(shù)
三維模型自動(dòng)單體化關(guān)鍵技術(shù)包括三角網(wǎng)索引、實(shí)時(shí)動(dòng)態(tài)的LOD技術(shù)和多邊形裁剪等。
2.1 三角網(wǎng)索引
三角形網(wǎng)格生成算法是三角網(wǎng)算法的基礎(chǔ),它根據(jù)輸入的點(diǎn)集或線框等信息,自動(dòng)構(gòu)建包括三角形網(wǎng)格的數(shù)據(jù)結(jié)構(gòu)。常用的算法包括Delaunay三角剖分、約束性Delaunay三角剖分以及Powell-Sabin三角剖分等。采用三角形網(wǎng)格優(yōu)化算法對生成的三角形網(wǎng)格進(jìn)行優(yōu)化,提高其質(zhì)量和性能[2]。本文采用優(yōu)化算法包括以下3點(diǎn)。1)去除冗余頂點(diǎn)。在三角形網(wǎng)格中,有些頂點(diǎn)可能是冗余的,即它們并不貢獻(xiàn)于網(wǎng)格的形狀或結(jié)構(gòu)。這些冗余頂點(diǎn)可以去除,以減少存儲(chǔ)空間和計(jì)算時(shí)間。2)優(yōu)化三角形片。在三角形網(wǎng)格中,有些三角形可能不是最優(yōu)的,需要進(jìn)行優(yōu)化。例如,可以使用Loop細(xì)分、Catmull-Clark細(xì)分等算法對三角形進(jìn)行細(xì)分,以提高網(wǎng)格質(zhì)量[3]。3)修復(fù)漏洞。在三角形網(wǎng)格中,可能會(huì)出現(xiàn)漏洞或破洞,需要進(jìn)行修復(fù)。常見的修復(fù)算法包括Z-order曲線、凸包法等。渲染算法各有優(yōu)缺點(diǎn),需要根據(jù)具體應(yīng)用場景選擇合適的算法。當(dāng)進(jìn)行渲染時(shí),需要注意保持渲染質(zhì)量和效率平衡,以便實(shí)現(xiàn)高效的渲染效果。最后需要進(jìn)行三角形網(wǎng)格變換,主要是對三角形網(wǎng)格進(jìn)行變換操作,例如旋轉(zhuǎn)、縮放以及平移等。常用的算法包括齊次坐標(biāo)變換、矩陣變換等。這些變換操作可以單獨(dú)進(jìn)行,也可以組合進(jìn)行,以實(shí)現(xiàn)更復(fù)雜的變換效果。在進(jìn)行變換操作的過程中,需要注意保持三角形網(wǎng)格的質(zhì)量和精度,避免出現(xiàn)畸形或漏洞等問題。三角形網(wǎng)格渲染算法主要是將三角形網(wǎng)格轉(zhuǎn)換成圖像或視頻等可視化形式,以便于觀察和分析。常見的渲染算法包括光柵化渲染、光線追蹤渲染、延遲渲染等。這些渲染算法各有優(yōu)缺點(diǎn),需要根據(jù)具體應(yīng)用場景選擇合適的算法。在進(jìn)行渲染的過程中,需要注意保證渲染質(zhì)量和效率的平衡,以便實(shí)現(xiàn)高效的渲染效果。具體實(shí)現(xiàn)方法如下。
文件存儲(chǔ)格式定義:文件由3個(gè)部分組成,文件頭、文件目錄索引和數(shù)據(jù)。
文件頭:固定長度30個(gè)Byte,前4個(gè)字節(jié)為文件版本信息(short類型),后面26個(gè)Byte為26個(gè)字符(char類型),用于存儲(chǔ)說明性文字。
文件目錄索引:目錄結(jié)構(gòu)整體是可變大小,但是每條目錄為固定大小。
1條目錄固定長度為44Byte。0~3為索引號(hào)(int類型),4~11和12~19為2個(gè)double類型。
20~27和28~35為2個(gè)double類型,是此范圍的右上角點(diǎn)的二維坐標(biāo),36~39是此目錄起始位置到此目錄實(shí)際數(shù)據(jù)所在位置起點(diǎn)的偏移量(int類型),40~43為此目錄對應(yīng)數(shù)據(jù)段的三角形個(gè)數(shù)(int類型)。整個(gè)目錄有1~n條目錄在連續(xù)的地址中存儲(chǔ)。將不規(guī)則三角網(wǎng)按照一定的范圍劃分為矩形網(wǎng)格,該網(wǎng)格的劃分最終形成索引目錄結(jié)構(gòu)內(nèi)容,每個(gè)網(wǎng)格的左下角點(diǎn)和右上角點(diǎn)為索引目錄中范圍數(shù)值,對所有的網(wǎng)格進(jìn)行排序,其排序規(guī)則如下:按每個(gè)網(wǎng)格左下角點(diǎn)的X值遞增排序,如果X相等,那么Y值進(jìn)行遞增排序。每個(gè)矩形網(wǎng)格中的所有三角形形成每個(gè)目錄索引指向的數(shù)據(jù)段內(nèi)容,它的排序規(guī)則是每個(gè)三角形的形心到此網(wǎng)格左下角點(diǎn)的角度遞增排序,如果角度一致,那么按照形心到左下角點(diǎn)距離遞增排序。
當(dāng)按照上述方法將不規(guī)則三角網(wǎng)數(shù)據(jù)存儲(chǔ)為外部文件后,可以使用任何編程語言對其數(shù)據(jù)進(jìn)行操作處理,此處使用C++編程語言對其進(jìn)行描述。程序中維護(hù)2個(gè)數(shù)據(jù)結(jié)構(gòu)定義,1個(gè)是用來存儲(chǔ)已加載到內(nèi)存中的以網(wǎng)格為單元的不規(guī)則三角網(wǎng)數(shù)據(jù),每個(gè)節(jié)點(diǎn)的排序方式與目錄索引排序方式相同;另一個(gè)為目錄索引數(shù)據(jù),也就是網(wǎng)格定義的數(shù)據(jù)。因此查詢輸入點(diǎn)的高程信息的流程如下:程序在初始化階段不加載任何三角網(wǎng)數(shù)據(jù),只加載目錄索引數(shù)據(jù),程序先在索引三角形數(shù)據(jù)鏈表中查找此點(diǎn)所在范圍是否已經(jīng)加入內(nèi)存,如果已加入內(nèi)存則在該數(shù)據(jù)節(jié)點(diǎn)中計(jì)算高程,否則在目錄索引結(jié)構(gòu)中查找該點(diǎn)范圍,將包括此點(diǎn)的范圍數(shù)據(jù)從文件中讀取并加入索引三角形數(shù)據(jù)鏈表中,再計(jì)算該點(diǎn)高程數(shù)據(jù)。
2.2 實(shí)時(shí)動(dòng)態(tài)的LOD技術(shù)
本文采用動(dòng)態(tài)調(diào)整LOD Scale的圖像顯示優(yōu)化方法,具體包括以下5個(gè)步驟。1) 步驟一。根據(jù)系統(tǒng)幀率的指標(biāo)要求,設(shè)定系統(tǒng)幀率可取值的最大值FRmax及最小值FRmin;獲取系統(tǒng)當(dāng)前采用的LOD" Scale值作為Scale的初始值s0,設(shè)定Scale可取值的最大值Smax及最小值Smin。2)步驟二。獲取系統(tǒng)的當(dāng)前幀率fr,如果fr>FRmax,那么減少Scale的取值,如果當(dāng)前Scale的取值不小于最小值Smin,那么以新的Scale取值作為LOD Scale渲染圖像,執(zhí)行步驟二;否則,若當(dāng)前Scale的取值小于最小值Smin,則執(zhí)行步驟三。3)步驟三。獲取當(dāng)前圖像的當(dāng)前顯示細(xì)節(jié),將所述當(dāng)前顯示細(xì)節(jié)與數(shù)組SC[i]中的元素逐一比較:當(dāng)遍歷到最后一個(gè)小于當(dāng)前顯示細(xì)節(jié)且與當(dāng)前顯示細(xì)節(jié)差值最小、同時(shí)之后的元素均不為0的元素時(shí),停止遍歷,將所述元素的編號(hào)記為n;如果n+1<N,那么Scale值為Smin;若n=N,則Scale值Smax 以Scale值s作為LOD渲染圖像,執(zhí)行所述步驟三;當(dāng)遍歷到與當(dāng)前顯示細(xì)節(jié)相同的元素時(shí),停止遍歷,將所述元素的編號(hào)記為n,則Scale值s0, 以Scale取值s0作為LOD渲染圖像,執(zhí)行所述步驟三。當(dāng)遍歷到最后一個(gè)小于當(dāng)前顯示細(xì)節(jié)且與當(dāng)前顯示細(xì)節(jié)差值最小、同時(shí)之后的元素均為0的元素時(shí),停止遍歷,將所述元素的編號(hào)記為n,則Scale值s0 以Scale值s0作為LOD渲染圖像,執(zhí)行步驟三。4)步驟四。獲取系統(tǒng)的當(dāng)前幀率fr,若fr>FRmax,那么減少Scale值s,若s不小于最小值Smin,則以s作為LOD" Scale渲染圖像,執(zhí)行步驟三;否則,執(zhí)行步驟二和步驟五。若fr<FRmin,則增大Scale值s,若s不大于最大值Smax,則以s作為LOD" Scale渲染圖像,執(zhí)行步驟二;否則,則執(zhí)行步驟三;若FRmin≤fr≤FRmax,則執(zhí)行步驟二。5)步驟五。將當(dāng)前顯示細(xì)節(jié)作為第i(i=(s-1)·10)個(gè)元素存入數(shù)組SC中。
2.3 多邊形剪裁技術(shù)
本文采用Sutherland—Hodgman多邊形裁剪算法。該算法的基本思想是每次用窗口的一條邊界及其延長線來裁剪多邊形的各邊。多邊形通常由它的頂點(diǎn)序列來表示,經(jīng)過裁剪規(guī)則針對某條邊界裁剪后,結(jié)果形成新的頂點(diǎn)序列,又留待下條邊界進(jìn)行裁剪,…,直到窗口的所有邊界都裁剪完畢,算法形成最后的頂點(diǎn)序列,才是結(jié)果多邊形(它可能構(gòu)成一個(gè)或多個(gè)多邊形)[4]。當(dāng)多邊形一個(gè)頂點(diǎn)Pi相對于窗口某條邊界及其延長線進(jìn)行剪裁時(shí),分為下列4種情況(即裁剪規(guī)則)。1)頂點(diǎn)Pi在內(nèi)側(cè),前一頂點(diǎn)Pi-1也在內(nèi)側(cè),則將Pi納入新的頂點(diǎn)序列。2)頂點(diǎn)Pi在內(nèi)側(cè),前一頂點(diǎn)Pi-1在外側(cè),則先求交點(diǎn)Q,再將Q、Pi依次納入新的頂點(diǎn)序列。3)頂點(diǎn)Pi在外側(cè),前一頂點(diǎn)Pi-1在內(nèi)側(cè),則先求交點(diǎn)Q,再將Q納入新的頂點(diǎn)序列。4)頂點(diǎn)Pi與前一頂點(diǎn)Pi-1均在外側(cè),則頂點(diǎn)序列中不增加新的頂點(diǎn)。
考慮多邊形相對于一條邊界及其延長線進(jìn)行裁剪的算法。
2.3.1 賦初值
將頂點(diǎn)序列中的最后一個(gè)頂點(diǎn)賦給前一頂點(diǎn)S;
設(shè)置初始標(biāo)志flag:
if(S在邊界內(nèi)側(cè))flag=0;
else flag=1;
設(shè)新的頂點(diǎn)序列數(shù)j=0;
2.3.2 頂點(diǎn)坐標(biāo)求解
對多邊形各頂點(diǎn)進(jìn)行裁剪規(guī)則處理,結(jié)果放入新的多邊形頂點(diǎn)序列Q[i][j]中:
for(對第一個(gè)頂點(diǎn)直到最后一個(gè)頂點(diǎn),逐一處理){if(Pi在邊界內(nèi)側(cè)){if(flag!=0){flag=0;求交點(diǎn)并放入新的多邊形頂點(diǎn)序列Qjxx;j++;}將當(dāng)前頂點(diǎn)放入新的多邊形頂點(diǎn)序列Qj中。
2.3.3 數(shù)據(jù)處理與試驗(yàn)結(jié)果
在三維景觀中,就可以將需要裁剪的區(qū)域定義成掩膜,進(jìn)行區(qū)域裁剪[5]。具體由下面語句來實(shí)現(xiàn)。
void CMyClip_AView:
:ClipedgeL(CPoint polypoint[],CPoint clipwindow[],UINT polynum)
/*其中參數(shù)polypoint[ ]為多邊形頂點(diǎn),clipwindow[]為裁剪窗口頂點(diǎn),polynum為多邊形頂點(diǎn)數(shù)目*/{//找出裁剪窗口邊界
long xl,xr,yt,yb;
UINT i;
xl=clipwindow[0].x;
xr=clipwindow[0].x;
yt=clipwindow[0].y;
yb=clipwindow[0].y;
for(i=1;ilt;=4;i++){if(xlgt;clipwindow[i].x)
xl=clipwindow[i].x;
if(xrlt;clipwindow[i].x)
xr=clipwindow[i].x;
if(ybgt;clipwindow[i].y)
yb=clipwindow[i].y;
if(ytlt;clipwindow[i].y)
yt=clipwindow[i].y;}//
CPoint B[Polygon_Num],C[Polygon_Num];
UINT m_nA,m_nB;
int x,y;
long tem1,tem2;
m_nA=polynum;/*記載原始多邊形頂點(diǎn)個(gè)數(shù)*/
m_nB=0;/*記載新生成多邊形頂點(diǎn)個(gè)數(shù)*/
for(i=0;ilt;m_nA;i++){if(polypoint[i].xlt;xl amp;amp; polypoint[i+1].xlt;xl)
{B[m_nB].x =polypoint[i].x ;
B[m_nB].y =polypoint[i].y ;
m_nB=m_nB+1;
continue;}
if(polypoint[i].xlt;xl amp;amp; polypoint[i+1].xgt;=xl)/*邊兩個(gè)端點(diǎn)起點(diǎn)在外部,終點(diǎn)在內(nèi)部,求交點(diǎn),然后交點(diǎn),終點(diǎn)都應(yīng)該送入臨時(shí)數(shù)組*/{/*保留交點(diǎn)*/
x=xl;
tem1=(xl-polypoint[i].x);
//tem2=(xl-x1)*dy/dx+y1;
//y/x=dy/dx----gt;y=x*dy/dx
tem2=tem1*(polypoint[i+1].y-polypoint[i].y)/(polypoint[i+1].x-polypoint[i].x)+polypoint[i].y;
y=tem2;
B[m_nB].x =x;
B[m_nB].y =y;
m_nB=m_nB+1;
continue;}if(polypoint[i].xgt;=xl amp;amp; polypoint[i+1].xlt;xl)/*起點(diǎn)在內(nèi)部,終點(diǎn)在外,求交點(diǎn),然后起點(diǎn),交點(diǎn)送入臨時(shí)數(shù)組*/
{/*保留內(nèi)部點(diǎn)*/
B[m_nB].x =polypoint[i].x ;
B[m_nB].y =polypoint[i].y ;
m_nB=m_nB+1;
/*保留交點(diǎn)*/
x=xl;
tem1=(xl-polypoint[i].x);
tem2=tem1*(polypoint[i+1].y-polypoint[i].y)/(polypoint[i+1].x-polypoint[i].x)+
polypoint[i].y;
y=tem2;
B[m_nB].x =x;
B[m_nB].y =y;
m_nB=m_nB+1;
continue;}}
//把第一個(gè)點(diǎn)的數(shù)據(jù)拷貝到最后
//形成裁剪后的多邊形
if(i==m_nA){B[m_nB]=B[0];}//下------------------
m_nA=0;
for(i=0;ilt;m_nB;i++){if(B[i].ylt;yb amp;amp; B[i+1].ylt;yb)
與Weiler-Atherton算法、Vatti算法和Greiner-Hormann算法相比,本算法采用矢量數(shù)組結(jié)構(gòu)、遍歷多邊形頂點(diǎn)并記錄裁剪多邊形和被裁減多邊形交點(diǎn)及其前驅(qū)、后繼信息,而無須考慮輸入多邊形的方向、形狀等,可以應(yīng)對多邊形邊重合、邊頂點(diǎn)相交等特殊的情況,實(shí)現(xiàn)多邊形裁剪,并對建筑物側(cè)面進(jìn)行平滑處理。除建筑物外,采用該算法可以對路燈、井蓋等地面物體進(jìn)行批量單體化處理,效果良好[6]。
3 結(jié)果與討論
結(jié)果表明,采用本多邊形剪裁算法可以大幅提高工作效率,采用多邊形剪裁方法能夠快速、準(zhǔn)確地提取目標(biāo)對象的單體化模型。通過實(shí)景三維模型的可視化展示,能夠直觀地觀察目標(biāo)對象的單體化效果。該技術(shù)適用于不同領(lǐng)域的實(shí)景三維模型的單體化處理,具有廣泛的應(yīng)用前景??傊?,基于多邊形剪裁的無人機(jī)傾斜實(shí)景三維模型單體化技術(shù)是一項(xiàng)具有重要應(yīng)用價(jià)值的研究。該技術(shù)研究能夠提高實(shí)景三維模型的質(zhì)量和精度,為相關(guān)領(lǐng)域提供更可靠的數(shù)據(jù)支持。同時(shí),該技術(shù)具有高效性、可視化和實(shí)用性等特點(diǎn),有廣泛的應(yīng)用前景,最終實(shí)現(xiàn)實(shí)景三維中國建設(shè)降本增效。
參考文獻(xiàn)
[1]劉勇奎,高云,黃有群.一種有效的多邊形剪裁算法[J].軟件學(xué)報(bào),2003(4):845-856.
[2]蔡松露,戚正威,梁阿磊.基于GIS環(huán)境中一種高效的多邊形剪裁方法[J].計(jì)算機(jī)應(yīng)用與軟件學(xué),2010(3):40-45.
[3]郭功舉.面向?qū)ο蟮膹?fù)雜多邊形裁剪實(shí)現(xiàn)[J].現(xiàn)代測繪,2003,26(4):12-15.
[4]F.COHEN,ETC.Modeling and sysnthesis of images of 3D textures"surface[J].Graphical Modeling ang Image Processing,2016(53):501-510.
[5]GORDON PETRIE.Developments in digital photogrammetric"systems for topographic mapping application[J].ITC Journal,2017(2):101-105.
[6]向世明.OpenGL編程與實(shí)例[M].北京:電子工業(yè)出版社,2019.