石祥龍,劉桂陽
(黑龍江八一農墾大學信息與電氣工程學院,大慶 163319)
為了便于觀察位于地下的植物根系,通過建立虛擬植物根系模型,以可視化的方式定量而系統地描述植物生長發育、器官建成和產量形成等生理生態過程與環境之間的數量關系,對指導農業科研生產和教學具有重要意義[1-5]。
目前研究中建立植物根系模型的成果較多,但大都是通過實際植物根系生長測量或虛擬植物生長模擬得到三維空間拓撲結構數據,形態仿真上大都是在大體結構上對某一種特定植物進行簡單模擬,結果實現的三維模型拓撲結構相對簡單,模型形態材質粗糙,與實物差別較大[6-9]。還有一些研究中使用了參數化的建模方法,使根系模型具有較多的可控性,但一般都是數學上的簡單描述,實驗中的涉及到計算機圖形學上的面片建模與材質生成算法都沒有實現,一般根系專業研究人員無法直接使用[10-16]。
本文通過對一般植物根系三維數據進行參數提取,利用實時可視化的方法定制生成指定的根系模型,并實現了按時間信息生成的模擬仿真算法。該方案以Unity3D為研發平臺,為根系研究人員提供自動化根系的生成工具插件,可以根據觀測或虛擬仿真數據直觀地生成根系模型,并提供方便的手動調整功能。
植物根系是由大量根個體組成的一個復雜系統。為了有效地描述根系的各組成部分,通常采用類似于植株地上部分的節元概念[17]。通過觀察圖1可以發現,植物的根系可以劃分為較小的樹形結構,每個較小的樹形結構可以進一步細分更小的樹型結構,繼續下去,直到劃分為多條位置和粗細都不規則的折線段。我們可以將整個根系定義為由多條不同級別的折線段來組成,這些折線段是構成根系的基礎。這里將每條折線段定義為根單元[18]。如圖2所示,根單元是多個端點首尾順序連接、直徑大小連續變化的多個柱狀結構體。一個根單元的節點處可以派生出新的根單元,多個層級的根單元組成一個小型的根系,多個小型根系層級連接組成整個根模型。

圖1 群體組織結構模型

圖2 根系構成
通過以上分析可以看出,一個完整的植物根系系統就是由多個層級連接的根單元組成的集合。
在描述植物根系的拓撲結構時,采用圖論中一個倒向放置的軸向樹來進行分析[19]。根系統是一個具有多級樹型的拓撲結構,在Unity3D系統中,使用父子物體來實現,每個GameOb?ject物體上存在相關的插件來實現根單元之間生長消息的傳遞。圖3分別為根系的抽象拓撲結構、對應的Unity層次對象和仿真模型。

圖3 抽象拓撲結構、Unity層次對象和仿真模型
一個根單元可以直接位于根系統下,也可以位于其它根單元的單元控制子節點下,與上級根單元形成父子關系。上下級的根單元之間存在空間和時間上的約束關系,作為子物體,下級根單元從屬于上級根單元的控制子節點。
如圖4所示,一個根單元模型可以看成根據n(n≥2)個單元控制子節點(node)位置及相關參數生成的平滑柱體。柱體的面數由截面邊數(seg?ment)確定,其中每個根單元含有截面形狀、直徑大小、生長時間等參數,主要參數如表1所示。

表1 根單元的主要控制參數

圖4 根單元抽象模型
由于植物生長特性,控制點的生長時間及粗度與上一個控制點有直接關聯,所以采用相對累加的參數化進行設置,便于控制模型的生長,即在每個控制點上設置的相對于上一個控制點的粗度和時間變化值。表2列出了各子節點的主要參數。

表2 根單元控制子節點的主要參數
一個根單元的不同控制點之間,生長時間存在偏差,離根部越近的節點開始生長時間越早,為便于數據標定,使用startGrowTime表示前后兩個節點之間的時間差,growPeriod則表示生長開始到結束的整個時間差。
控制子節點用來表示根單元的路徑位置,每個節點處還需要有橫截面信息才能實現根單元的三維模型,定義為Section類,其主要字段和方法見表3。

表3 根單元控制子節點的主要參數
根據實際需要的不同,截面分為三種級別:正多邊形模擬的粗糙圓形、一般圖像邊界頂點多邊形、手動調整的精確多邊形。
1.4.1 粗糙類圓截面
對于一些比較細小、根枝截面接近圓形的根單元,可以使用正多邊形來表示,生成正多邊形的算法比較容易實現。如圖5(a)所示,角度步進值deltaAngle=360/segment,currentAngle每次累加步進值即可,截面頂點坐標取正弦和余弦的一半是為了保證多邊形的外接圓直徑為1,這樣再存儲截面的縮放比例直接表示直徑長度。

圖5 根單元截面類型
1.4.2精確多邊形截面
對于直徑相對較大且截面不規則的根單元,為了使根模型更加精細,這里使用截面圖形來提取截面信息。圖5為棉花主根的截面圖像,圖像預處理為背景顏色與截面顏色不同的JPG格式,當不方便區分前景、背景顏色時,可以使用背景色透明的PNG格式。
從中心開始利用平分周邊Segment(默認24個方向,每個偏移15°),采用類似計算機圖形學中的DDA畫線算法[20],每次判斷當前點的顏色找到通道為0的點(邊界)則選取存入頂點集合。
等分多邊形探測邊界算法如下:
(1)初始化當前角currentAngle=0及步長角deltaAngle=360/segment。
(2)從當前射線currentAngle方向開始向外探測循環。
(3)初始化中心坐標cx,cy為圖像中心(寬高一半像素值)。
(4)新建子物體curObj,取當前角正弦sinA和余弦值cosA。
(5)從cx,cy中心位置開始取當前像素顏色。
(6)若當前顏色不是背景色,前進當前位置cx+=cosA,cy+=sinA。
(7)若當前顏色是背景色,則將curObj定位當前位置,累加currentAngle+=deltaAngle,返回c。
(8)按順序連接所有子物體位置顯示參考線(調用OnDrawGizmos模塊)。
(9)返回所有子物體位置到截面對象。
上面的算法可以快速得到截面數據,對精度要求不高的模型比較適合,但如果截面不規則變化較大,且精度要求較高的模型,會出現一定的偏差,這里采用子物體存儲位置的方法可以較好地解決這一問題,如圖5(b),可以使用手動調整子物體得到精準截面邊界,利用37個頂點,通過手工調整得到精確邊界頂點。
根據前面的設計,如圖6所示,設每個根單元含有n個控制點,依次為P0,P1,…,Pn-1。參數絕對化計算后,每個控制點都已經確定自己的出生時間、生長粗細等信息。在確定的系統時鐘下,每個根單元可以分為三種狀態:出生、正在生長、生長完畢。首先要確認哪些節點已經出生,然后根據出生節點的位置及半徑縮放建立模型。

圖6 根單元控制點
算法流程如圖7所示,其中Pi為第i個控制點,Ti為第i個控制點出生時間,Stime為系統時鐘。

圖7 控制點生成流程圖
這里相對復雜的是只有部分控制點出生的情況,為保證生長仿真的連續性,在末尾已經出生和將要出生的兩個控制點之間,利用線性插值的方法建立臨時控制點,便于后期模型生成算法的統一。
在1.4中得到的粗糙和精確兩種截面數據,可以作為參數利用Vector3類型數組傳遞到根單元的模型生成算法中。但這些數據只是在同一平面內(默認XOY平面)的多個頂點坐標,在場景中使用時,要與控制點位置相匹配。需要使用空間變換矩陣來實現。為保證模型過渡平滑不出現缺口,這里將截面變換到每個頂點與其前后兩個頂點連線的角分面。
如圖8所示,以第i個控制點Pi為例,前后兩個頂點分別為Pi-1和Pi+1。

圖8 截面法線計算

Unity系統采用空間坐標系為左手系,計算下一個頂點Pi處理截面方法:Ni標準化后得到控制點Pi處的截面法線。對于首尾控制點的法線,可以直接用P0-P1,Pn-2-Pn-1來表示,截面平面圖形頂點存儲在XZ水平面上,法線為Y軸,即(0,1,0)。
法線變換矩陣的確定,根據原來和新的法線可以計算得到變換矩陣,這在計算機圖形學中已是標準算法,Unity中可以使用Matrix4x4.TRS標準函數來得到,形如:

其中TRS函數的第一個和第三個函數為平移和縮放變換,此處為需要平移,使用零向量。縮放參數中的scale是前后兩個控制點的相對縮放比例。有了這個變換矩陣,可以很方便地根據前一個截面計算后一個截面各個頂點的位置。
得到了根單元各個截面的頂點數據,可以利用生成面域的算法,來生成根單元的側面和端面。
利用Mesh三角化算法,生成側面網格模型,如圖9所示,首先將前面得到的各個控制點的截面頂點信息保存到Mesh頂點數據中,再利用左手系法線規則加入三角平面,△(Vi_0,Vi_1,Vi+1_0),△(Vi_1,Vi+1_1,Vi+1_0),……,最后一組三角面循環到第一個頂點。依此類推,生成模型所有三角面,最后使用類似扇形的椎體結構,建立末端封口。

圖9 Mesh三角平面構成及根單元三維網格模型
在一些植物的根須表面,有很多細小的根毛,要表現這些特征利用簡單的紋理貼圖是無法實現的。根毛非常微小而且數量特別巨大,用真實模型建模對目前的一般計算機資源難以完成,無法做到在移動設備上實時渲染。這里參考一些大型虛擬現實場景中常用到的Shader Lab技術,使用Shader著色器編程利用GPU來完成這些海量計算。
通過觀察可以發現,一些細小的根毛一般底層較密集,外層較為稀疏。當從側面觀察時比較清晰,而正面看比較模糊。根據這些特點,在根須外部擴展出若干層,利用分層著色的辦法實現,如圖10所示。

圖10 分層著色
使用多層圖像表面渲染技術,分層顯示根毛細節,每一個Pass通道表示一層,通過控制每一層的alpha值來實現根毛從根部到尖部逐漸變小,每一層只渲染alpha大于0的頂點,多層疊加,并根據噪聲像素圖計算Alpha通道,實現根毛的視覺效果。
關鍵Shader腳本如下:
當渲染每一層時,往法線方向將頂點位置“擠出”模型表面,則對應的像素點位置的公式:

RootFURSTEP表示當前層數/總層數,增加層數可以創造更精細毛發。這里RootFURSTEP從0.1到1.00,步長為0.1,共10層Pass通道,效果如圖11所示。

圖11 根毛視覺效果
在前面設計中,為了便于根單元的參數標定,每個根單元的空間與時間參數都是以上級根單元為參考,設置的直徑大小為前一個節點的相對比例值,生長時間也是本段的生長周期值。這樣設計的好處是便于參數修改和后期局部復制后的自動調整,但這種相對參數在生長仿真中需要進行統一的累加調整。
本文在建立的根物體上建立RootSystem模塊,進行統一的數據校準。首先從根物體出發,按層迭代遍歷所有下級根單元,算法使用遞歸子函數完成數據傳導,計算每個根單元的每個控制子節點的空間位置與絕對生長時間。在RootSystem中利用靜態全局變量growTime建立統一根生長虛擬時間,在設計編輯和仿真運行兩種情況中實現每幀時間震蕩傳導。每個根單元與統一的growTime值進行匹配,來確認每個部分的生長狀態,從而得到哪些節點已經產生,并計算已經產生的節點直徑大小。
在生長仿真中,由于植物根系的自相似性,可以復制其它部分到新的節點上。本文通過設計點克隆的方式來實現,cloneSource參數為克隆源,對該參數提供的子樹進行復制,得到的新的根系根據父頂點相關參數實現位置、直徑大小、生長時間自動一致。cloneCount是復制子根數量,為實現逼真效果,加入三個軸向角度,uAngle為子根起始垂直偏移角、vAngle為子根基與父根基垂直夾角、wAangle為子根基自身旋轉角。offsetDistance為子根基與父節點位置距離的參數偏移。具體實現效果如圖12所示。

圖12 克隆根系
前面實現的根單元建模是基于子節點和截面而生成的,只要提供的子節點足夠多,理論上可以逼真地實現各種根模型效果。但在實際的一些根系中,一些比較細小的須狀根很多,用細分節點的辦法實現起來工作量相當大。這類根須形狀接近一些細線,很難找到合適的單一數學公式進行描述。使用計算機圖形學中的樣條擬合方法是一個比較好的解決方案。
使用節點的子物體作為控制頂點,利用Hermite樣條曲線進行擬合[21-22],將子物體控制點之間的參考球直徑作為參數輸入,如StartNo?deScale為開始結點的尺寸,EndNodescale為結束結點的尺寸,nodeDistance為子節點的距離參數,多個樣條控制點之間的平滑曲線使用分段插值的方法生成,生成比較逼真的平滑根須模型,如圖13所示。

圖13 樣條曲線生成根須
根系的原始數據來源有三種:使用專用的設備進行測量、虛擬植物的仿真生長計算、專家觀察人工指定。在設計過程中為便于后期管理,RootSystem中加入了規范節點名稱Normali?zeName算法實現按層級對根單元及控制子節點進行統一規范命名。為了方便參數管理,這里提供了標準XML文檔形式存儲,導入相關參數文件,生成根系模型,對模型進行調整后可導出最終的模型和參數文件,便于在其他可視化平臺運用。XML文檔格式如下:

基于上述根系仿真及可視化生長參數系統,為驗證該系統的可行性,文章選用了黑龍江八一農墾大學實驗田中的蒲公英根系加以驗證。將專家觀測獲取的部分生長參數轉換為系統模擬所需的幾何參數導入,生成蒲公英根系三維仿真模型。但由于一些細小的側根難以通過觀測得出數據,為了實現更加逼真的仿真模型,故按照上述樣條擬合的方式生成部分根須,再通過點克隆完成大量根須的生成,效果如圖14所示。

圖14 蒲公英根系實體與仿真模型
最后,為了實時模擬出根系生長的動態過程,如圖15所示,為蒲公英根系按照相應的生長規則,在虛擬時間5、15、25、35、45、55實現根系的動態生長的效果,并獲得根系不同時期的三維結構以及完整的生長參數輸出。

圖15 虛擬時間內蒲公英根系生長過程
利用虛擬現實引擎Unity3D實現了植物根系仿真及可視化生長參數設計的通用方法,打通了一般根系研究人員在計算機圖形學上的技術壁壘,對研究植物根系在不同生長時間三維形態結構及生長參數提供了有力的抓手,對其它植物仿真算法具有較好的推廣價值,為實際農業生產研究及生物教學提供了可靠的技術支持。