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