石祥龍,劉桂陽
(黑龍江八一農(nóng)墾大學(xué)信息與電氣工程學(xué)院,大慶 163319)
為了便于觀察位于地下的植物根系,通過建立虛擬植物根系模型,以可視化的方式定量而系統(tǒng)地描述植物生長發(fā)育、器官建成和產(chǎn)量形成等生理生態(tài)過程與環(huán)境之間的數(shù)量關(guān)系,對指導(dǎo)農(nóng)業(yè)科研生產(chǎn)和教學(xué)具有重要意義[1-5]。
目前研究中建立植物根系模型的成果較多,但大都是通過實際植物根系生長測量或虛擬植物生長模擬得到三維空間拓?fù)浣Y(jié)構(gòu)數(shù)據(jù),形態(tài)仿真上大都是在大體結(jié)構(gòu)上對某一種特定植物進(jìn)行簡單模擬,結(jié)果實現(xiàn)的三維模型拓?fù)浣Y(jié)構(gòu)相對簡單,模型形態(tài)材質(zhì)粗糙,與實物差別較大[6-9]。還有一些研究中使用了參數(shù)化的建模方法,使根系模型具有較多的可控性,但一般都是數(shù)學(xué)上的簡單描述,實驗中的涉及到計算機(jī)圖形學(xué)上的面片建模與材質(zhì)生成算法都沒有實現(xiàn),一般根系專業(yè)研究人員無法直接使用[10-16]。
本文通過對一般植物根系三維數(shù)據(jù)進(jìn)行參數(shù)提取,利用實時可視化的方法定制生成指定的根系模型,并實現(xiàn)了按時間信息生成的模擬仿真算法。該方案以Unity3D為研發(fā)平臺,為根系研究人員提供自動化根系的生成工具插件,可以根據(jù)觀測或虛擬仿真數(shù)據(jù)直觀地生成根系模型,并提供方便的手動調(diào)整功能。
植物根系是由大量根個體組成的一個復(fù)雜系統(tǒng)。為了有效地描述根系的各組成部分,通常采用類似于植株地上部分的節(jié)元概念[17]。通過觀察圖1可以發(fā)現(xiàn),植物的根系可以劃分為較小的樹形結(jié)構(gòu),每個較小的樹形結(jié)構(gòu)可以進(jìn)一步細(xì)分更小的樹型結(jié)構(gòu),繼續(xù)下去,直到劃分為多條位置和粗細(xì)都不規(guī)則的折線段。我們可以將整個根系定義為由多條不同級別的折線段來組成,這些折線段是構(gòu)成根系的基礎(chǔ)。這里將每條折線段定義為根單元[18]。如圖2所示,根單元是多個端點首尾順序連接、直徑大小連續(xù)變化的多個柱狀結(jié)構(gòu)體。一個根單元的節(jié)點處可以派生出新的根單元,多個層級的根單元組成一個小型的根系,多個小型根系層級連接組成整個根模型。
圖1 群體組織結(jié)構(gòu)模型
圖2 根系構(gòu)成
通過以上分析可以看出,一個完整的植物根系系統(tǒng)就是由多個層級連接的根單元組成的集合。
在描述植物根系的拓?fù)浣Y(jié)構(gòu)時,采用圖論中一個倒向放置的軸向樹來進(jìn)行分析[19]。根系統(tǒng)是一個具有多級樹型的拓?fù)浣Y(jié)構(gòu),在Unity3D系統(tǒng)中,使用父子物體來實現(xiàn),每個GameOb?ject物體上存在相關(guān)的插件來實現(xiàn)根單元之間生長消息的傳遞。圖3分別為根系的抽象拓?fù)浣Y(jié)構(gòu)、對應(yīng)的Unity層次對象和仿真模型。
圖3 抽象拓?fù)浣Y(jié)構(gòu)、Unity層次對象和仿真模型
一個根單元可以直接位于根系統(tǒng)下,也可以位于其它根單元的單元控制子節(jié)點下,與上級根單元形成父子關(guān)系。上下級的根單元之間存在空間和時間上的約束關(guān)系,作為子物體,下級根單元從屬于上級根單元的控制子節(jié)點。
如圖4所示,一個根單元模型可以看成根據(jù)n(n≥2)個單元控制子節(jié)點(node)位置及相關(guān)參數(shù)生成的平滑柱體。柱體的面數(shù)由截面邊數(shù)(seg?ment)確定,其中每個根單元含有截面形狀、直徑大小、生長時間等參數(shù),主要參數(shù)如表1所示。
表1 根單元的主要控制參數(shù)
圖4 根單元抽象模型
由于植物生長特性,控制點的生長時間及粗度與上一個控制點有直接關(guān)聯(lián),所以采用相對累加的參數(shù)化進(jìn)行設(shè)置,便于控制模型的生長,即在每個控制點上設(shè)置的相對于上一個控制點的粗度和時間變化值。表2列出了各子節(jié)點的主要參數(shù)。
表2 根單元控制子節(jié)點的主要參數(shù)
一個根單元的不同控制點之間,生長時間存在偏差,離根部越近的節(jié)點開始生長時間越早,為便于數(shù)據(jù)標(biāo)定,使用startGrowTime表示前后兩個節(jié)點之間的時間差,growPeriod則表示生長開始到結(jié)束的整個時間差。
控制子節(jié)點用來表示根單元的路徑位置,每個節(jié)點處還需要有橫截面信息才能實現(xiàn)根單元的三維模型,定義為Section類,其主要字段和方法見表3。
表3 根單元控制子節(jié)點的主要參數(shù)
根據(jù)實際需要的不同,截面分為三種級別:正多邊形模擬的粗糙圓形、一般圖像邊界頂點多邊形、手動調(diào)整的精確多邊形。
1.4.1 粗糙類圓截面
對于一些比較細(xì)小、根枝截面接近圓形的根單元,可以使用正多邊形來表示,生成正多邊形的算法比較容易實現(xiàn)。如圖5(a)所示,角度步進(jìn)值deltaAngle=360/segment,currentAngle每次累加步進(jìn)值即可,截面頂點坐標(biāo)取正弦和余弦的一半是為了保證多邊形的外接圓直徑為1,這樣再存儲截面的縮放比例直接表示直徑長度。
圖5 根單元截面類型
1.4.2精確多邊形截面
對于直徑相對較大且截面不規(guī)則的根單元,為了使根模型更加精細(xì),這里使用截面圖形來提取截面信息。圖5為棉花主根的截面圖像,圖像預(yù)處理為背景顏色與截面顏色不同的JPG格式,當(dāng)不方便區(qū)分前景、背景顏色時,可以使用背景色透明的PNG格式。
從中心開始利用平分周邊Segment(默認(rèn)24個方向,每個偏移15°),采用類似計算機(jī)圖形學(xué)中的DDA畫線算法[20],每次判斷當(dāng)前點的顏色找到通道為0的點(邊界)則選取存入頂點集合。
等分多邊形探測邊界算法如下:
(1)初始化當(dāng)前角currentAngle=0及步長角deltaAngle=360/segment。
(2)從當(dāng)前射線currentAngle方向開始向外探測循環(huán)。
(3)初始化中心坐標(biāo)cx,cy為圖像中心(寬高一半像素值)。
(4)新建子物體curObj,取當(dāng)前角正弦sinA和余弦值cosA。
(5)從cx,cy中心位置開始取當(dāng)前像素顏色。
(6)若當(dāng)前顏色不是背景色,前進(jìn)當(dāng)前位置cx+=cosA,cy+=sinA。
(7)若當(dāng)前顏色是背景色,則將curObj定位當(dāng)前位置,累加currentAngle+=deltaAngle,返回c。
(8)按順序連接所有子物體位置顯示參考線(調(diào)用OnDrawGizmos模塊)。
(9)返回所有子物體位置到截面對象。
上面的算法可以快速得到截面數(shù)據(jù),對精度要求不高的模型比較適合,但如果截面不規(guī)則變化較大,且精度要求較高的模型,會出現(xiàn)一定的偏差,這里采用子物體存儲位置的方法可以較好地解決這一問題,如圖5(b),可以使用手動調(diào)整子物體得到精準(zhǔn)截面邊界,利用37個頂點,通過手工調(diào)整得到精確邊界頂點。
根據(jù)前面的設(shè)計,如圖6所示,設(shè)每個根單元含有n個控制點,依次為P0,P1,…,Pn-1。參數(shù)絕對化計算后,每個控制點都已經(jīng)確定自己的出生時間、生長粗細(xì)等信息。在確定的系統(tǒng)時鐘下,每個根單元可以分為三種狀態(tài):出生、正在生長、生長完畢。首先要確認(rèn)哪些節(jié)點已經(jīng)出生,然后根據(jù)出生節(jié)點的位置及半徑縮放建立模型。
圖6 根單元控制點
算法流程如圖7所示,其中Pi為第i個控制點,Ti為第i個控制點出生時間,Stime為系統(tǒng)時鐘。
圖7 控制點生成流程圖
這里相對復(fù)雜的是只有部分控制點出生的情況,為保證生長仿真的連續(xù)性,在末尾已經(jīng)出生和將要出生的兩個控制點之間,利用線性插值的方法建立臨時控制點,便于后期模型生成算法的統(tǒng)一。
在1.4中得到的粗糙和精確兩種截面數(shù)據(jù),可以作為參數(shù)利用Vector3類型數(shù)組傳遞到根單元的模型生成算法中。但這些數(shù)據(jù)只是在同一平面內(nèi)(默認(rèn)XOY平面)的多個頂點坐標(biāo),在場景中使用時,要與控制點位置相匹配。需要使用空間變換矩陣來實現(xiàn)。為保證模型過渡平滑不出現(xiàn)缺口,這里將截面變換到每個頂點與其前后兩個頂點連線的角分面。
如圖8所示,以第i個控制點Pi為例,前后兩個頂點分別為Pi-1和Pi+1。
圖8 截面法線計算
Unity系統(tǒng)采用空間坐標(biāo)系為左手系,計算下一個頂點Pi處理截面方法:Ni標(biāo)準(zhǔn)化后得到控制點Pi處的截面法線。對于首尾控制點的法線,可以直接用P0-P1,Pn-2-Pn-1來表示,截面平面圖形頂點存儲在XZ水平面上,法線為Y軸,即(0,1,0)。
法線變換矩陣的確定,根據(jù)原來和新的法線可以計算得到變換矩陣,這在計算機(jī)圖形學(xué)中已是標(biāo)準(zhǔn)算法,Unity中可以使用Matrix4x4.TRS標(biāo)準(zhǔn)函數(shù)來得到,形如:
其中TRS函數(shù)的第一個和第三個函數(shù)為平移和縮放變換,此處為需要平移,使用零向量??s放參數(shù)中的scale是前后兩個控制點的相對縮放比例。有了這個變換矩陣,可以很方便地根據(jù)前一個截面計算后一個截面各個頂點的位置。
得到了根單元各個截面的頂點數(shù)據(jù),可以利用生成面域的算法,來生成根單元的側(cè)面和端面。
利用Mesh三角化算法,生成側(cè)面網(wǎng)格模型,如圖9所示,首先將前面得到的各個控制點的截面頂點信息保存到Mesh頂點數(shù)據(jù)中,再利用左手系法線規(guī)則加入三角平面,△(Vi_0,Vi_1,Vi+1_0),△(Vi_1,Vi+1_1,Vi+1_0),……,最后一組三角面循環(huán)到第一個頂點。依此類推,生成模型所有三角面,最后使用類似扇形的椎體結(jié)構(gòu),建立末端封口。
圖9 Mesh三角平面構(gòu)成及根單元三維網(wǎng)格模型
在一些植物的根須表面,有很多細(xì)小的根毛,要表現(xiàn)這些特征利用簡單的紋理貼圖是無法實現(xiàn)的。根毛非常微小而且數(shù)量特別巨大,用真實模型建模對目前的一般計算機(jī)資源難以完成,無法做到在移動設(shè)備上實時渲染。這里參考一些大型虛擬現(xiàn)實場景中常用到的Shader Lab技術(shù),使用Shader著色器編程利用GPU來完成這些海量計算。
通過觀察可以發(fā)現(xiàn),一些細(xì)小的根毛一般底層較密集,外層較為稀疏。當(dāng)從側(cè)面觀察時比較清晰,而正面看比較模糊。根據(jù)這些特點,在根須外部擴(kuò)展出若干層,利用分層著色的辦法實現(xiàn),如圖10所示。
圖10 分層著色
使用多層圖像表面渲染技術(shù),分層顯示根毛細(xì)節(jié),每一個Pass通道表示一層,通過控制每一層的alpha值來實現(xiàn)根毛從根部到尖部逐漸變小,每一層只渲染alpha大于0的頂點,多層疊加,并根據(jù)噪聲像素圖計算Alpha通道,實現(xiàn)根毛的視覺效果。
關(guān)鍵Shader腳本如下:
當(dāng)渲染每一層時,往法線方向?qū)㈨旤c位置“擠出”模型表面,則對應(yīng)的像素點位置的公式:
RootFURSTEP表示當(dāng)前層數(shù)/總層數(shù),增加層數(shù)可以創(chuàng)造更精細(xì)毛發(fā)。這里RootFURSTEP從0.1到1.00,步長為0.1,共10層Pass通道,效果如圖11所示。
圖11 根毛視覺效果
在前面設(shè)計中,為了便于根單元的參數(shù)標(biāo)定,每個根單元的空間與時間參數(shù)都是以上級根單元為參考,設(shè)置的直徑大小為前一個節(jié)點的相對比例值,生長時間也是本段的生長周期值。這樣設(shè)計的好處是便于參數(shù)修改和后期局部復(fù)制后的自動調(diào)整,但這種相對參數(shù)在生長仿真中需要進(jìn)行統(tǒng)一的累加調(diào)整。
本文在建立的根物體上建立RootSystem模塊,進(jìn)行統(tǒng)一的數(shù)據(jù)校準(zhǔn)。首先從根物體出發(fā),按層迭代遍歷所有下級根單元,算法使用遞歸子函數(shù)完成數(shù)據(jù)傳導(dǎo),計算每個根單元的每個控制子節(jié)點的空間位置與絕對生長時間。在RootSystem中利用靜態(tài)全局變量growTime建立統(tǒng)一根生長虛擬時間,在設(shè)計編輯和仿真運行兩種情況中實現(xiàn)每幀時間震蕩傳導(dǎo)。每個根單元與統(tǒng)一的growTime值進(jìn)行匹配,來確認(rèn)每個部分的生長狀態(tài),從而得到哪些節(jié)點已經(jīng)產(chǎn)生,并計算已經(jīng)產(chǎn)生的節(jié)點直徑大小。
在生長仿真中,由于植物根系的自相似性,可以復(fù)制其它部分到新的節(jié)點上。本文通過設(shè)計點克隆的方式來實現(xiàn),cloneSource參數(shù)為克隆源,對該參數(shù)提供的子樹進(jìn)行復(fù)制,得到的新的根系根據(jù)父頂點相關(guān)參數(shù)實現(xiàn)位置、直徑大小、生長時間自動一致。cloneCount是復(fù)制子根數(shù)量,為實現(xiàn)逼真效果,加入三個軸向角度,uAngle為子根起始垂直偏移角、vAngle為子根基與父根基垂直夾角、wAangle為子根基自身旋轉(zhuǎn)角。offsetDistance為子根基與父節(jié)點位置距離的參數(shù)偏移。具體實現(xiàn)效果如圖12所示。
圖12 克隆根系
前面實現(xiàn)的根單元建模是基于子節(jié)點和截面而生成的,只要提供的子節(jié)點足夠多,理論上可以逼真地實現(xiàn)各種根模型效果。但在實際的一些根系中,一些比較細(xì)小的須狀根很多,用細(xì)分節(jié)點的辦法實現(xiàn)起來工作量相當(dāng)大。這類根須形狀接近一些細(xì)線,很難找到合適的單一數(shù)學(xué)公式進(jìn)行描述。使用計算機(jī)圖形學(xué)中的樣條擬合方法是一個比較好的解決方案。
使用節(jié)點的子物體作為控制頂點,利用Hermite樣條曲線進(jìn)行擬合[21-22],將子物體控制點之間的參考球直徑作為參數(shù)輸入,如StartNo?deScale為開始結(jié)點的尺寸,EndNodescale為結(jié)束結(jié)點的尺寸,nodeDistance為子節(jié)點的距離參數(shù),多個樣條控制點之間的平滑曲線使用分段插值的方法生成,生成比較逼真的平滑根須模型,如圖13所示。
圖13 樣條曲線生成根須
根系的原始數(shù)據(jù)來源有三種:使用專用的設(shè)備進(jìn)行測量、虛擬植物的仿真生長計算、專家觀察人工指定。在設(shè)計過程中為便于后期管理,RootSystem中加入了規(guī)范節(jié)點名稱Normali?zeName算法實現(xiàn)按層級對根單元及控制子節(jié)點進(jìn)行統(tǒng)一規(guī)范命名。為了方便參數(shù)管理,這里提供了標(biāo)準(zhǔn)XML文檔形式存儲,導(dǎo)入相關(guān)參數(shù)文件,生成根系模型,對模型進(jìn)行調(diào)整后可導(dǎo)出最終的模型和參數(shù)文件,便于在其他可視化平臺運用。XML文檔格式如下:
基于上述根系仿真及可視化生長參數(shù)系統(tǒng),為驗證該系統(tǒng)的可行性,文章選用了黑龍江八一農(nóng)墾大學(xué)實驗田中的蒲公英根系加以驗證。將專家觀測獲取的部分生長參數(shù)轉(zhuǎn)換為系統(tǒng)模擬所需的幾何參數(shù)導(dǎo)入,生成蒲公英根系三維仿真模型。但由于一些細(xì)小的側(cè)根難以通過觀測得出數(shù)據(jù),為了實現(xiàn)更加逼真的仿真模型,故按照上述樣條擬合的方式生成部分根須,再通過點克隆完成大量根須的生成,效果如圖14所示。
圖14 蒲公英根系實體與仿真模型
最后,為了實時模擬出根系生長的動態(tài)過程,如圖15所示,為蒲公英根系按照相應(yīng)的生長規(guī)則,在虛擬時間5、15、25、35、45、55實現(xiàn)根系的動態(tài)生長的效果,并獲得根系不同時期的三維結(jié)構(gòu)以及完整的生長參數(shù)輸出。
圖15 虛擬時間內(nèi)蒲公英根系生長過程
利用虛擬現(xiàn)實引擎Unity3D實現(xiàn)了植物根系仿真及可視化生長參數(shù)設(shè)計的通用方法,打通了一般根系研究人員在計算機(jī)圖形學(xué)上的技術(shù)壁壘,對研究植物根系在不同生長時間三維形態(tài)結(jié)構(gòu)及生長參數(shù)提供了有力的抓手,對其它植物仿真算法具有較好的推廣價值,為實際農(nóng)業(yè)生產(chǎn)研究及生物教學(xué)提供了可靠的技術(shù)支持。