孫浩鵬
(長春工程學院科學技術(shù)處,長春 130012)
本次建模的目的是應用于基于虛擬現(xiàn)實的水輪機運行控制仿真,在項目初始階段的建模過程中選擇了省內(nèi)某水電站,并得到此水電站周圍山脈的等高線圖。目前較常用的三維地圖的建模方法,是從等高線地形圖中取得離散點高程數(shù)據(jù),然后利用Delaunay三角網(wǎng)[1]對離散高程數(shù)據(jù)點進行三維建模,經(jīng)過試驗發(fā)現(xiàn)其缺點是模型數(shù)據(jù)量巨大,多邊形模型的三角化在UV展開時困難等,導致虛擬現(xiàn)實的應用不能完全滿足要求。故提出新的建模方法,利用NURBS(非標準樣條曲線)方法中的LOFT(放樣建模)建成NURBS模型,之后將所得的NURBS模型轉(zhuǎn)換成四邊形的多邊形模型。分析步驟及算法實現(xiàn),并給出所生成的三維地形圖實例,其構(gòu)建的三維地形符合等高線的規(guī)律,構(gòu)建的模型運行速度快,生成的立體圖像逼真,在虛擬現(xiàn)實系統(tǒng)中運行良好。
模型的建立在三維軟件中選擇LOFT方式,此命令是通過多個曲線之間的點連成面的建模方式,它要求所提供的截面形狀曲線必須是一個封閉的曲線,在得到形狀曲線上所有頂點數(shù)據(jù)以后,必須重新參數(shù)化這條曲線,并以用戶所給出的曲線上的頂點順序來存儲這些頂點數(shù)據(jù),得到的等高線同一地點的每個曲線上的點個數(shù)最好相同。普通等高線的繪制在某個山體的山頂處如果忽略,在建模時,要根據(jù)山體的走向來估算山頂?shù)母叨炔⒆詣咏⒁粋€放縮比為零的點個數(shù)相同的曲線以作為建模中山頂?shù)姆忾]線體。對于大型山脈的多個山體交匯處等高線稱之為鞍部,這里的表現(xiàn)為不同的多個同心圓相鄰,鞍部的建模需要將包圍相鄰同心圓的大圓在相鄰同心圓中心處斷開,成為兩個獨立的圓并分別放樣。
目前常用方法為通過讀取等高線離散數(shù)據(jù)點來構(gòu)建三角網(wǎng),根據(jù)Delaunay三角網(wǎng)構(gòu)建過程的不同,一般把生成Delaunay三角網(wǎng)的算法分為插入法、生長法和分治法[2]。逐點插入法于1977年由Lawson提出[3],隨后有眾多學者對其進行了改進。此方法思路基本如下:先通過離散點構(gòu)建初始大三角形,并隨機排列點集P中的所有點P0,P1,…。如果點集P中的點Pa被三角形PiPjPk包含,就連接點Pa和三角形PiPjPk的各個頂點,將其劃分成3個三角形;如果Pa在三角形PiPjPk的邊PiPj上,則連接Pa與共邊PiPj的2個三角形的第3個點,剖分形成4個子三角形,以此類推。在最后通過邊交換方法規(guī)格化三角剖分并移除包含大三角形任意頂點的所有三角形,當在三角網(wǎng)中新插入一個點P后,三角網(wǎng)通過邊交換等方法進行重構(gòu)優(yōu)化。由于生長方法消耗的時間過長,所以近年來已經(jīng)很少用到此方法。分治算法思想[4]于1975年由Shamos和Hoey提出,并由多位科學家對其進行了改進。其主要原理是根據(jù)點坐標對點集進行排序后將點集二分成2個點集Va,Vb;當兩個點集中的數(shù)量超過3則再次分成2個下層點集,當所有點集分解成小于3的點集后,合并Va,Vb。其思路是將點集分割成易于生成三角網(wǎng)的數(shù)據(jù)點集合,然后把子集中的能構(gòu)成三角網(wǎng)的點合并,經(jīng)優(yōu)化生成最終的三角網(wǎng)。通過比較看出,插入法對計算機的硬件要求較低,但是時間較長,分治法對計算機硬件要求較高,時間上比插入法優(yōu)秀。通過對常用算法的分析得知,在形成山體的過程中三角面?zhèn)€數(shù)過多,為了減少數(shù)量而優(yōu)化又導致三角網(wǎng)分布明顯混亂,對后期的UV分解造成明顯的困難和干擾。
Leberl在1982年通過對等高線、水系、山脊線的矢量化進行了自動提?。?]。Greenlee是較早嘗試掃描法對等高線的提取的[6]。大體步驟先將紙質(zhì)地形圖掃描為數(shù)字柵格地形圖,通過濾波去噪得到彩色分割得到二值化等高線圖,細化二值等高線圖并處理等高線粘連處理和斷線的連接。在得到完整的等高線圖后,操作過程如下:首先通過直接讀取等高線到三維軟件中,并建立每條線的變量數(shù)據(jù)格式庫,每條線的高度值也讀入并依據(jù)高度將各條曲線空間上沿著Y軸移動至相應高度點,結(jié)果如圖1所示。在讀入線后我們需要使每條線上的曲線點盡量減少,在LOFT放樣建模中,一般的環(huán)形閉合曲線需要8個點就可以了。通過程序?qū)γ織l線自動進行重新構(gòu)建,即在讀入的曲線上按照等間距讀取8個點,并依據(jù)這8個點構(gòu)建新的曲線如圖2所示。這樣在三維軟件中的曲線就可以達到最優(yōu)化的建模方式了。
圖1 等高線高度定位
圖2 等高線優(yōu)化點
實現(xiàn)程序偽代碼如下:
{
Int ID,KK;//定義線條數(shù)的ID和重構(gòu)曲線點參數(shù)
Float high[];//讀取每條線的高度值
For(line=0;line++;)
{
Select-r curve(ID);
set Attr"curve(ID).translateY"high[ID+
1];//根據(jù)每條線的高度值將線移動
select-r curve(ID);
rebuild Curve-ch 1-rpo 1-rt 0-end 1-kr 0-kcp 0-kep 1-kt 0-s KK-d 3-tol 0.01"curve(line)";//對曲線根據(jù)所給的變量KK進行點重構(gòu)
select–cl;
}}
在得到的等高線圖中有非同心圓類等高線時,需要對線體進行判斷。判斷此線是否包含2個或者2個以上同心圓類的等高線。判斷算法利用每條線體的重心值的偏差,如果是同一個山脊,等高線的重心值在Y軸上依次升高的同時在X和Z軸上的偏差是比較小的。如果是不同的2個山脊,在等高線讀取過程中就會得知線體的重心在X軸和Z軸上會有較大的突變型偏差,最外圍的等高線的重心與任意包含于它的等高線重心偏差都會大于同一個山脊的等高線重心偏差值。這樣我們就利用2個差量即重心的X和Z的差量判斷出等高線是否來自同一個山脊。當差量大于我們給定的恒量時,我們需要對變化的等高線進行分析,如果任意等高線內(nèi)包含的山脊數(shù)為1,則不進行分段處理。如果任意等高線內(nèi)包含的山脊數(shù)大于2,則將等高線重心差量過大的那根線自動切割成內(nèi)包含山脊個數(shù)一樣的閉合線。分割曲線由所包含的山脊的中心決定,在各山脊的中心點連線,先算出連線的中心點設(shè)定為C點,并計算所連線與所需分割曲線的斷點K1和K2,斷點的選擇由經(jīng)過C點的直線與所需分割線相交得到。此時將2個分割的交點K1、K2和C點共3個點連成一條直線L,這樣就可以用L復制后和分割的曲線連成兩個閉合的曲線。
當待分割等高線內(nèi)包含3個或3個以上山脊時,如圖4所示,先分別計算出各組山脊的重心,將彼此連接后得到的線體看為一個三角形,分別求得各條邊的中點C1、C2和C3,直接做各邊的垂線與外圍等高線相交處記為K1、K2、和K3,雖然有細微偏差,在運算過程中為了提高速度忽略交線的夾角。當包含山脊個數(shù)大于3時,可以直接以各個山脊單獨建模,到最后用焊接的方法得到山脊底部統(tǒng)一的模型。程序流程如圖3所示。
圖3 程序流程圖
圖4 多山脊等高線添加點示意圖
根據(jù)流程圖得到的求解C點和K點的偽代碼如下:
{
float*Pivots=new float[sizev*sizeu*3];//定義重心、線
Pivots[i][j][k]//定義三維數(shù)組重心
For(Int i=1;i++;i<ID)//此處ID為等高線的總數(shù)量
Pivot[i][j][k]=getattrib pivot Line[i];
If Pivot[i][j][k]- Pivot[i+1][j+1][k+1]>Q//Q為指定恒量
Mark Line[i];//將當前的等高線編號記錄下來作為將要分段的線
soGeo Line.AddPart(part As soPoints)//利用兩組重心點平均值建立線
if(abs(x1-x0)>=abs(y1-y0))
{Length=abs(x1-x0)EPCurveTool;
curve-d 3-p k1-p k2-p k3;//通過K1,K2,K3得到新的直線
select-tgl nurbsCircle1;
intersectCrvPreset 1 0.01 2 0 1 0 1;//計算后得到新的交點
select-r Line.u[i];
detachCurve-ch 1-cos on-rpo 1 Line.u[i].Line.u[i+1];//分離Line[i]
}
這樣就通過首先求解相交曲線點,從當前點斷開曲線得到新的閉合曲線,從而達到每個等高線都不包含多個代表山脊的等高線。其中重心的變量是用一維數(shù)組加偏移地址的方法,每一個三維網(wǎng)格點可以用網(wǎng)格塊編號和ijk指標來計算其在一維數(shù)組中的偏移地址。
對于同一等高線,如果不采用放樣建模,而直接用得到的等高線曲線利用三角網(wǎng)建模方式,得到的山體在轉(zhuǎn)折處表現(xiàn)過硬,三角面的菱角明顯。通過實驗比較可以看出,采用等高線建模的山體表面光滑,特別是在山脊等坡度過度處光滑性較好,同時能更好地在三維軟件中貼圖和植物模型的分布上提供平整的UV分布,從山體植被來說放樣建模方法更真實準確地反映了山體的真實幾何形態(tài)。同時三角網(wǎng)建模方式的面數(shù)較多,在正常運算中,往往是將一個四邊形直接拆分成2個三角形,所以通過對局部的等高線進行試驗看出等高線建模的四邊形面數(shù)要小于三角網(wǎng)建模的三角形面數(shù)的一半。建模后的山體導入虛擬現(xiàn)實軟件中后,在沒有植被的情況下通過測試運行。如表1所示,三角網(wǎng)建模的山體和放樣建模的山體在幀速率的比較下明顯不同。
表1 不同建模方式比較
通過等高線的一系列處理得到的山體模型是四邊面模型,為貼圖提供極大的方便,也可以根據(jù)四邊面的UV分布將模型表面賦予植被。四邊面模型在虛擬現(xiàn)實系統(tǒng)中運行良好,尤其是山體與大壩的結(jié)合面可以良好焊接,使水電站虛擬現(xiàn)實系統(tǒng)在運行中減少破面和漏面現(xiàn)象。
[1]Miles R E.Probability distribution of a network of triangles(a solution to problem 67-15)[J].Society for Industrialand Applied Mathematics,1969,11(3):399-402.
[2]Wu Xiaobo,Wang Shixin,Xiao Chunsheng.A new study of Delaunay triangulation creation [J].Acta Geodaetica et Cartographica Sinica,1999,28(1):28-35.
[3]Lawson C L.Mathematical SoftwareⅢ[A].Rice J.Software for clsuface interpolation[C].Pasadena,California:California Institute of Technology,1977:161-194.
[4]Shamos M I,HoeyD.Closest-pointproblems[A].IEEE Computer Science.Proceeding of the 16th Annual IEEE Symposium on Foundation of Computer Science[C].Los Angeles.California:IEEE,1975:151-162.
[5]Leberl F,Olson D.Raster scanning for operational digitizing of graphical data[J].Photogrammetric Engineering and Remote Sensing(S0099-1122),1982,48(4):615-627.
[6]Greenlee D.Raster and vector processing for scanned linework[J].Photogrammetric Engineering and Remote Sensing(S0099-1122),1987,53(10):1383-1387.