?

基于OpenGL的交互式三維樹木建模與可視化研究

2019-01-24 01:05唐麗華張姝婧
浙江農林大學學報 2019年1期
關鍵詞:衰減系數側枝枝干

趙 凱,唐麗華,2,張姝婧

(1.浙江農林大學 信息工程學院,浙江 杭州311300;2.浙江農林大學 浙江省林業智能監測與信息技術研究重點實驗室,浙江 杭州311300)

近年來,樹木三維可視化建模成為虛擬植物研究領域的熱點課題之一,在數字植物園建設、虛擬景觀規劃設計、三維游戲開發和影視動畫設計等諸多領域都有著廣闊的應用前景。樹木包含的器官較多,其結構較為精細且無規則性,尤其是枝干和樹葉,具有復雜的幾何拓撲結構。這使得計算機對其進行建模會比較困難,所以如何快速、精準建立具有高真實感的樹模型是主要需要解決的問題[1]。目前,植物三維建模的方法主要分為3種:基于圖形的方法、基于圖像的方法和基于專業軟件的方法。3種建模方法各有優劣,基于圖形方法的模型比較注重植物生理的形態結構,主要包括基于分形理論的迭代函數系統(iterated function system)和L系統(L-system),還有粒子系統(partial system)和隨機過程生長法等,建立模型效率較高且構建方式較為靈活,但是難以對形態結構特別復雜的植物進行三維建模。圖像方法則是針對圖形方法的不足提出的,它是根據輸入計算機的一幅或多幅2維圖像來完成對植物形體的三維重建,但其建模過程較為復雜,生成的模型形態結構固定,缺乏靈活性。另外,由于易受室外環境的影響,如遮擋或季節因素導致圖像數據的缺失而難實現可視化建模[2-3]?;谲浖5姆椒?,目前比較流行的軟件有SpeedTree,Xfrog,3dsMax以及Maya等[4-7],雖然生成的模型真實感是所有方法里最好的,并且能實現具有復雜形態結構的植物體的建模,但是該建模方法要求用戶具備較扎實的植物生理學知識。綜合比較上述方法,出于能夠快速、高仿真、可交互建立具有真實植物空間結構信息的三維樹木模型的目的,本研究針對現有建模方法的缺陷和不足,利用基于改進的分形迭代函數系統的建模方法,設計并實現了單樹建模軟件系統,通過提取特征參數和變量控制系數來控制樹體模型生成,所建立的模型能較好地反應樹木生理生態結構,還克服了建模流程復雜、模型真實感弱、交互性差等缺點。

1 樹木形態結構與模型構建

1.1 樹木形態結構分析

本研究涉及的樹體三維可視化建模僅考慮地上部分。樹體地上部分的器官主要可分為枝干、樹葉、花朵、果實。枝干的形態結構復雜多變,根據生長層次的不同可將枝干按層級劃分[8]:主干、一級分枝、二級分支枝和三級分枝……。決定分枝形態和空間格局的因素又可分為:分枝長度、分枝基徑、分枝著枝角(與上級枝干的夾角)、分枝方位角(沿上級枝干旋轉的角度)、彎曲度等。

一般來講,園林植物外部形態可以由樹枝的分枝模式來區分。分枝模式主要分為兩大類:主(單)軸分枝和合軸分枝。主軸分枝主要表現為其主莖上的頂芽不斷向上生長形成明顯的主干,主莖上的腋芽形成側枝,側枝上再生成各級分枝,但它們的生長均不超過主莖,形態結構抽象圖如圖1所示。合軸分枝則主要表現為莖的頂芽發育到一定時候停滯或死亡,由其下方腋芽取而代之形成強壯的側枝,一段時間后生長優勢又轉向下一級分枝,因此沒有明顯的主干,形成了多個彎曲的主軸,整個樹冠呈開張狀態[5]。

1.2 模型構建

在模型構建中,本研究將可視化建模過程拆分成3個部分:樹體的枝干建模、葉片建模以及模型和場景渲染。將建模過程分步處理,不僅可以簡化整個建模的流程,還可以提高模型的重用性,方便在植物模型生成后進行局部調整[10]。這使得建模系統具有很好的交互性,用戶只需通過調節幾個部位對應的屬性值,就可以根據自己的需要設計生成相應的樹枝形態和樹葉形態。

1.2.1 構建枝段元 將樹枝分級處理,每一級樹枝可以理解成由不同的枝段構成,而每一個枝段又可以理解為由若干個不同的枝段元連接構成——枝段元是構成枝干模型的最小單位。在自然界里植物枝干的形狀幾乎都近似圓臺形,因此,有研究者用圓臺模型模擬三維分形樹的樹木枝段元[9]。但是經實驗發現,如果直接簡單調用OpenGL圖形庫里的圓臺而不做處理,那么就會導致樹枝彎曲時枝段元拼接處出現缺口(圖2)。經實驗發現:用多邊形棱臺進行枝干模擬可以較好地處理枝段元的拼接問題,所以本研究采用正六邊形棱臺近似模擬枝干。實驗結果顯示枝干模型的平滑性較好且未出現連接缺口。其原理是先通過定義點的初始位置和終點位置,然后根據定義的位置繪制2個正六邊形,最后把2個正六邊形的12個頂點相互進行連接[11]。因此,該方法很好地解決了枝干連接的問題,同時也提高了模型的渲染效率。枝段元由4個參數來進行控制,分別是:Radius,Length,Angle,Twist。其中Radius表示枝段元的底面半徑,Length表示枝段元的高度,而Angle表示枝段元上底面、下底面中心連線繞z軸(Open-GL三維坐標系)的夾角,Twist表示枝段元上底面、下底面中心連線繞x軸的角度,兩者共同作用來控制枝干生長方向,效果如圖3(A)所示?;谝陨现Χ卧獙傩钥刂?,若干個枝段元通過偏轉、彎曲、連接就可以組成一條枝段,如圖3(B)所示,而枝段又受SideAngle即側枝著枝角度屬性控制。

圖1 樹體形態結構Figure 1 Morphological structure of tree body

圖2 圓臺段元拼接處缺口Figure 2 Connection gap of elements of circular truncated cone

圖3 枝段元抽象圖(A)枝段抽象圖(B)Figure 3 Abstract graph of branch elements (A),an abstract graph of branches (B)

1.2.2 枝干建模 由于樹枝與樹枝之間存在相似的生理特征和結構特征,也就是自相似性,而分形方法恰好能夠較好地描述這一特征,那么可以將三維樹木的枝干生成過程看成是一個分形迭代過程。將當前樹枝段元的參數數據經過一定的算術運算后所得的結果作為次級枝段元的參數數據,然后再進行遞歸調用得到再下一級枝段元的參數。按這種算術關系多次迭代后再將枝段元首尾連接即可實現一根一定長度的由粗變細且具有彎曲度的枝條[12]。利用這種遞歸調用思想最終可生成具有自相似結構的三維分形樹木。用Radius′,Length′,Angle′,Twist′分別表示次級枝段元的屬性,可以得到如下關系式:

關系式(1)中:LenScale表示枝段元長度控制系數,RadScale表示枝段元半徑控制系數,C1和C2分別表示一個固定常數。然而基于以上建模方法,其生成的枝干模型是規則的、有序的,這與實際自然界的樹枝生長形態不符,因為受自然環境的影響,雖然整體上具有自相擬性,但每個分支在粗細長度、彎曲程度、著枝角度和方位角度等方面都是有所差異的。為了更好地還原真實情況,在迭代生成枝干的過程中加入了隨機干擾因子,由關系式(1)可得關系式(2):

1.2.3 樹葉建模 由于1株樹的葉子數量比較龐大,并且樹葉的邊緣信息和葉脈紋路差異巨大,若對每一片葉子進行幾何建模不僅會增加計算量,同時也會比較耗時,所以本研究采用通用的方法——紋理映射。該方法只需利用OpenGL先設置一個多邊形模板作為樹葉的模板,然后將樹葉紋理(樹葉圖片)映射到模板上,最后加以渲染就可以得到較為真實的樹葉模型。通過設置樹葉(多邊形模板)屬性參數,如葉片大?。↙eafSize),葉片著枝角(LeafAngle),葉片方位角(LeafTwist)等就可獲得形態各異的樹葉,從而改變樹模型的局部形態。

1.3 三維樹木建模算法描述

第1步:先設定起始枝段元參數,如枝段元的長度(Length),底面半徑(Radius),夾角(Angle),旋轉角(Twist), 長度控制系數(LenScale), 半徑控制系數(RadScale)以及樹枝干深度系數(TreeDepth), 也就是遞歸算法深度,即遞歸調用的次數。第2步:根據第1步設定的參數繪制起始枝段元模型,并貼上紋理。第3步:上一步的長度和半徑乘以控制系數(LenScale和RadScale)得到本次應繪制的枝段元的長度和半徑,貼上紋理,并緩存此次結果作為下次執行遞歸函數時需調用的參數,同時樹枝干深度系數(TreeDepth)減小1個單位。第4步:判斷TreeDepth是否等于0,若TreeDepth為 0,則停止繪制枝段元,轉而開始繪制樹葉,設置葉子的數量、大小以及旋轉角和夾角等屬性參數,添加紋理并生成樹葉。若 TreeDepth>0, 則以當前段元長度(Length), 半徑(Radius), 夾角(Angle)和旋轉角(Twist)作為參數進入遞歸函數,繼續繪制枝段元。第5步: 重復第3步到第4步操作,直到樹的枝干深度系數達到生成樹葉的遞歸系數值,程序運行結束跳轉生成1株完整的三維分形樹。

1.4 枝干繪制函數的主要代碼

//初始值設置

floatAngle=15.0f;//枝段元偏移角度

floatLateralAngle=10.0f;//側枝段元偏移角度

floatScaleLen=0.85f;//長度衰減系數

floatScaleRad=0.75f;//半徑衰減系數

floatTwist=65.0f;//側枝旋轉角度(方位角)

floatSideAngle=60.0f;//側枝與上級枝的分叉角度

floatSideScaleDepth=0.80f;//側枝深度控制系數

floatSideScaleSize=0.90f;//側枝粗細長度衰減系數

//枝干段元迭代函數

voidBuildBranch (intCount,GLfloatLeafSize)

{

if (Count)

{

if (Next)

{

Next->SetAngle (Angle*random2 ()) ;

Next->SetTwist(Twist+ Twist*random1(1,3));

Next->SetLength(ScaleLen*Length);//長度衰減系數×長度

Next->SetRadius(ScaleRad*Radius);//半徑衰減系數×半徑

Next->BuildBranch(Count-1,LeafSize);

}

}

if (Count>=1)

{//建側枝

SideBranch=newCBranch;

ASSERT(SideBranch);

if(SideBranch)

{

SideBranch->LeafScale=LeafSize/CSegment:SideScale;

SideBranch->Base=this;

SideBranch->Rebuild(max(1.0f,min(Count,Count*SideScaleDepth)));

}

}

else

{//建樹葉

Leaves=newCLeaf;

Leaves[0].Angle=LeafAngle;

Leaves[0].Scale=LeafSize;

Leaves[0].Twist=Twist+(Twist+180);

}

}

2 三維樹木可視化實現

2.1 建立應用接口

為了實現基于OpenGL的交互式樹木三維可視化建模系統,本研究選用Visual Studio 2010作為開發工具,用Visual C++語言編程實現,通過配置OpenGL運行環境,運用OpenGL提供的圖形圖像技術以及基于改進的分形迭代算法繪制虛擬三維樹木,實現通用性高、真實感強且人機交互性良好的虛擬三維樹木模型的自動化生成系統。運行硬件環境具體為:Windows 10 64位操作系統,8G內存,Inter Core i5-4200h處理器,NVIDIAGeForceGTX 950M顯卡。

2.2 枝干可視化模擬

根據1.2節模型構建內容可知,若知道枝段元底面半徑就可以依據三角函數定理得到正六邊形下底面每個頂點在三維坐標系中的位置,由枝段元的高度和半徑衰減系數又能得到上底面六邊形頂點坐標,也就是次級枝段元下底面六邊形各頂點坐標。利用OpenGL圖形繪制技術就能繪制出六邊形棱臺用以表示枝段元。表1列出了六邊形底面各點在三維坐標系的具體取值,圖4是六邊形各坐標點的位置及對應紋理貼圖的示意圖。

由于枝段存在彎折和偏轉的特征,坐標點位置就要根據夾角和旋轉角加以變更,具體變更公式見關系式(3)。各坐標點位置確定后即可通過OpenGL的紋理貼圖函數glNormal3f(),glTexCoord2f(),glVertex3f()加以貼圖渲染,基于以上操作即可得到帶紋理效果的枝干,具體效果如圖5。

圖4 坐標點位置(A)和紋理貼圖(B)Figure 4 Points position (A) and texture map(B)

表1 各坐標點取值Table 1 Value of each point

圖5 樹干模擬效果圖(A)及枝干模擬效果圖(B)Figure 5 The simulation pictures of trunks(A) and branches (B)

2.3 樹葉可視化模擬

本研究用圖片貼圖的方法模擬樹葉,素材取自自然界真實樹葉的照片,格式選擇24位圖的bmp格式。為了提高樹葉的真實感,需要將除葉片以外的圖像像素全部消除或隱藏,所以這里采用了BMP透明處理技術,其方法原理是獲取一張像素為2n×2n,格式為bmp的位圖,將圖片中所有需要透明處理的地方的Alpha值設置為0.0,不需要透明處理的地方的Alpha值設置為1.0,然后設置Alpha的測試通過條件為: “大于0則通過”。如一張背景為黑色的樹葉照片,將像素為黑色的Alpha值設為0.0,除黑色以外的Alpha值設為1.0,繪制樹葉紋理時使用OpenGL圖庫自帶的glEnable(GL_ALPHA_TEST)和glAlphaFunc(GL_GREATER,0)函數就可以使樹葉完整的顯示出來,從圖6可以看到經BMP透明技術處理后的樹葉模型效果。

2.4 陰影繪制

為了增加樹木繪制的真實感,本研究還增加了光照和陰影效果。在OpenGL里光照模型是由光源、材質和光照環境決定的,通過設置光源位置(LightPosition),環境光(LightAmbient)和反射光(LightDiffuse)等屬性值,共同作用來模擬現實光照效果?;诠庹站涂梢岳L制陰影效果,目前比較流行的陰影模擬方法是采用Shadow Maping算法,其生成陰影的原理為:shadow map將場景渲染2次,第1次是從燈光的角度(把相機放到燈光位置)渲染場景,然后存儲渲染的深度信息到一張紋理上。第2次再從觀察者的角度來渲染,在第2次渲染時才渲染陰影,對于每個圖元的深度信息和第1次從燈光角度渲染的深度信息比較,如果當前深度值大于第1次渲染的深度值,則說明有物體在當前片元和燈光之間,那么當前片元在陰影區[13]。

圖6 經bmp透明技術處理前 (A)和處理后(B)的樹葉模型Figure 6 Leaf model treatedbefore(A)and after(B) bmp transparent technology

3 交互式設計實現

為了增加樹體建模的靈活性,本研究將樹木模型參數做了可視化處理,即把涉及到樹木形態結構的參數整合到一個參數控制面板上,這些參數總共包括了14項:樹枝干深度系數(TreeDepth),枝干段元夾角(Angle),側枝段元夾角(LateralAngle),沿上級枝的旋轉角(Twist),與上級枝的夾角(SideAngle),枝干長度衰減系數(LenScale),枝干半徑衰減系數(RadScale),側枝深度衰減系數(SideScaleDepth),側枝尺寸系數(SideScaleSize), 樹葉大?。↙eafSize), 樹葉偏轉角(LeafAngle), 樹影長度(TreeShadowLen),枝影密度(BranchShadowDen)和葉影密度(LeafShadowDen)。當改變其中一項參數后,樹體的形態變化將實時顯示在視圖區。另外,還增加了貼圖更換功能,當點擊更換按鈕后可通過選擇文件夾里已有的貼圖文件來更換模型外部特征,進一步增加了建模的靈活性。通過控制鍵盤前后左右按鍵和鼠標左右鍵實現上下左右旋轉功能和前進后退功能,有利于更細致的觀察。

3.1 枝干交互設計實現

樹干建模的參數主要受枝干深度系數、枝干段元夾角、側枝段元夾角、沿上級枝的旋轉角、與上級枝的夾角、枝干長度衰減系數、枝干半徑衰減系數、側枝深度衰減系數、側枝尺寸衰減系數等9項參數控制,參數不同生成的樹木形態結構就不同,由此可以生成形態各異的三維樹木。為了適應樹木模型的多變性,添加了樹皮更換功能。點擊控制面板上的 “樹皮更改”按鈕后(圖7A)彈出樹皮選擇窗口(如圖7B),選擇所需樹皮貼圖,點擊確認按鍵后即可生成用戶所需的樹皮樣式。樹皮更改后的樹木模型如圖7C。

圖7 樹皮參數更改前(A)中(B)后(C)效果圖Figure 7 Pictures of before (A),middle(B) and after(C) the change of bark parameters

3.1.1 單軸樹 根據1.1節樹木形態結構分析可知,單軸樹會有一根明顯的主干,圍繞主干生成側枝,主干和側枝的長度、半徑自底向上呈現縮減趨勢,所以需設置長度和半徑縮減系數。為了模擬現實中彎曲狀態,通過設置枝段元夾角等參數即可實現,主要參數如表2所示,效果如圖8所示,稍微調節其中一個參數就可改變相應樹形態。但是需注意的是TreeDepth和SideScaleDepth的屬性值不能同時設置到最大值,若設置過大,會引起枝干數量呈指數型增長,從而瞬間增加計算機顯卡的計算量并占用大量內存而造成卡頓。

3.1.2 合軸樹 合軸樹沒有明顯的主枝干,具有茂密的側枝,整個植物冠狀呈張開形態,所以只需根據上表的參數加以調整,利用分形迭代算法即可實現合軸樹的效果,主要參數如表3所示,效果如圖9所示。同樣,這里只需調節其中一個參數就可改變相應樹形態,TreeDepth和SideScaleDepth屬性值不能同時設置到最大值。

表2 單軸樹參數參考表Table 2 The parameter graph of a monoaxial tree

表3 合軸樹參數參考表Table 3 The parameter graph of a multiway tree

圖8 單軸樹效果圖Figure 8 Picture ofa monoaxial tree

圖9 合軸樹效果圖Figure 9 Picture ofa multiway tree

3.2 樹葉交互設計實現

對于構建好的枝干模型,根據樹葉建模和可視化模擬,添加樹葉后使得樹木進一步增加了真實感,為了進一步增加建模的靈活性,本研究將樹葉的大小和角度屬性進行了交互式的設計,通過調節控制面板對應屬性值即可自動調整樹葉在枝干上的分布特征。另外,為了適應樹模型的多變性,也添加了樹葉更換功能,同樹皮更改一樣,點擊控制面板上的 “樹葉更改”按鈕后(圖10A)彈出樹葉選擇窗口(如圖10B),選擇所需樹葉貼圖點擊確認按鍵后即可生成用戶所需的樹葉樣式。樹葉更改后的樹木模型如圖10C。

圖10 樹葉參數更改前(A)中(B)后(C)效果圖Figure 10 The pictures of before (A),middle(B) and after(C) the changes of leaf parameters

3.3 樹影交互設計實現

樹的影子主要通過樹影長度、枝影密度、葉影密度3項屬性值加以控制。用戶可以通過對以上屬性參數調節來獲得所需的陰影效果,數值越大樹影長度越長,枝干和樹葉影子越明顯;數值越小樹影長度越短,枝干和樹葉影子越稀?。▓D11);當數值為0時無陰影效果。

圖 11 樹影參數更改前(A)后(B)效果圖Figure 11 Pictures of before (A)and after(B)the changes of tree shadow parameters

4 總結和展望

本研究在分形理論的基礎上,利用改進的樹木生成算法以及通過Visual Studio和OpenGL圖形技術相結合的方法,實現了可視化效果良好的交互式三維樹木建模系統。本研究提出的建模方法不是針對單一樹種進行建模的,而是通過調整控制面板的屬性參數和變量或者自定義貼圖的方式來構建形態樣式各異的三維樹木模型的。實驗結果表明:本研究提出的方法是有效可行的,相比于基于單圖、多圖建?;蚧诩す恻c云等圖像建模方法出現的模型真實感低,交互性差,構建效率不高的缺點,本方法生成的樹體模型不僅形態結構和外部特征具有很高的靈活性且操作方法簡單易上手,在保證實時性繪制的前提下,能夠達到真實性的要求。當然本研究的三維樹木建模方法也存在不足,對于形態結構較為復雜的樹木無法精確建模,且對于植物器官細節的特征變量還不能進行有效提取,真實感也還有待提高。生成算法也還需進一步優化,進一步提升計算速度,從而建立一個通用性更強、建模效率更高、人機交互性更好的自動化三維樹木建模系統。

猜你喜歡
衰減系數側枝枝干
何 芳
浙江楠幼樹生長節律研究
玫瑰或刺
銀杏樹冠結構對主干直徑和干形的影響
玫瑰或刺
水位波動作用下軟土的變形強度特性研究
西紅柿側枝什么時候疏除好
結合時間因子的校園論壇用戶影響力分析方法研究
落水洞直徑對巖溶泉流量影響的試驗研究
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合