摘要:提出了利用導(dǎo)入農(nóng)場地形輪廓、合理規(guī)劃地形高度圖的方法建立可動態(tài)更新的統(tǒng)一數(shù)據(jù)地形,并通過合理設(shè)計地形紋理,使紋理貼圖與地形有機結(jié)合,實現(xiàn)了逼真的地表效果。在農(nóng)場地貌設(shè)計中,為了解決虛擬農(nóng)場中無法實現(xiàn)按農(nóng)藝要求種植植物的問題,提出了在虛擬場景編輯模式下建立自定義插件,完成批量精確定位種植植物的方法,實現(xiàn)了虛擬環(huán)境下種植農(nóng)作物的自動化、精確化。以上方法建立的地形及地形上的植物可動態(tài)實時更新,為后期進一步開發(fā)農(nóng)場仿真操作提供了技術(shù)保障。
關(guān)鍵詞:虛擬農(nóng)場;地形地貌;植物建模;Unity3D
中圖分類號:TP391 文獻(xiàn)標(biāo)識碼:A 文章編號:0439-8114(2015)07-1726-05
近年來,虛擬現(xiàn)實技術(shù)在農(nóng)業(yè)虛擬仿真、農(nóng)業(yè)生態(tài)旅游等方面應(yīng)用越來越廣泛。利用虛擬植物、虛擬農(nóng)田等模型,建立虛擬農(nóng)場使人們在計算機上種植虛擬作物并進行虛擬農(nóng)場管理,可以從任意角度甚至在作物冠層內(nèi)漫游觀察作物生長狀況的動態(tài)過程,還可以通過改變環(huán)境條件和栽培措施,直觀地觀察作物生長過程[1]。在虛擬農(nóng)場設(shè)計過程中,農(nóng)場的地形建模是真實世界模擬的一個重要組成部分,目前地形的建模研究已經(jīng)很廣泛,其中包括快速生成大規(guī)模的地形高度數(shù)據(jù)、地形地貌的細(xì)分優(yōu)化、地表泥土的模擬等[2]。
通過對目前流行的虛擬現(xiàn)實軟件進行比較,選用Unity3D作為虛擬農(nóng)場的開發(fā)環(huán)境[3]。利用Unity3D建立的Terrain地形,可以存儲和動態(tài)設(shè)置地形上各個網(wǎng)格點高度坐標(biāo),靈活地動態(tài)實現(xiàn)各種復(fù)雜地形。同時支持用戶在地形上交互式增加和刪除三維植物,這是大多三維虛擬軟件所不具備的。由于使用了植物模型優(yōu)化和動態(tài)修改功能,為后期虛擬農(nóng)場操作提供了保障。
常規(guī)的地形建模一般都是利用Unity3D下的Terrain地形建立山脈、湖泊等大體結(jié)構(gòu),其他如建筑、公路、田垅等細(xì)節(jié)都是利用第三方建模工具單獨建模后進行導(dǎo)入[4],這樣做的缺點是地形上的元素不能保持一致,對后期的仿真帶來不便。鑒于農(nóng)場仿真操作大都是在野外條件下進行,而且一般都會涉及到農(nóng)作物的操作,所以在此除單體的建筑物外,其他的道路、溝渠、田垅等細(xì)節(jié)采用統(tǒng)一的地形建模。地形的生成分為地形的輪廓導(dǎo)入及地形細(xì)節(jié)設(shè)計兩個步驟,地形的原始數(shù)據(jù)來源于Google Earth,導(dǎo)入到Unity3D虛擬現(xiàn)實場景中,生成了農(nóng)場地形的輪廓。地形細(xì)節(jié)利用高度圖手工繪制,最后在地形上添加地貌紋理、河流、植被等對象。這種方法建立的地形在保證整體上與實際地形一致的同時,在細(xì)節(jié)設(shè)計上保留了較大的自由度。建立的地形支持高度自由變換、隨機栽種植物、地表紋理繪制等功能,為后期虛擬農(nóng)場的仿真操作提供了技術(shù)保障。
1 地形輪廓的生成
1.1 Mesh網(wǎng)格地形下載
要建立虛擬農(nóng)場中的地形,首先要有地形DEM的原始數(shù)據(jù),由于SketchUp與Google Earth三維地理信息系統(tǒng)的完美結(jié)合,可以下載全球任一地區(qū)的真實地形數(shù)據(jù)(這個數(shù)據(jù)精度不是太大,但基本能夠滿足虛擬農(nóng)場需要)。首先在SketchUp中利用“插入地形”工具得到小塊地形,由于Google Earth每次插入的地形大小有限,如果要實現(xiàn)大面積的地形效果,需要多次插入小面積的地塊,然后經(jīng)過“解鎖、炸開、合并”等操作建立一個完整地塊[5]。最后將地形通過3DS格式導(dǎo)出到3DSMax中進行后期處理。其中主要包括地形的規(guī)格化、頂點焊接、修補漏洞、更新軸心點、重新命名等操作。最后通過FBX格式將Mesh網(wǎng)格地形導(dǎo)入到Unity3D中(圖1),其中圖1a為在Google Earth中選擇單個小地形圖,圖1b為將多個小地形在SketchUp中進行拼接,圖1c為在3DSMax中進行后期處理,圖1d為將地形導(dǎo)入到Unity3D中。
這里得到的地形數(shù)據(jù)可以作為虛擬農(nóng)場的周邊背景,但由于是外部導(dǎo)入的三維物體,在Unity3D中無法根據(jù)平面坐標(biāo)取得或改變地形上每個點的海拔高度,不能滿足虛擬農(nóng)場后期仿真的需要,故需要將Mesh地形轉(zhuǎn)化為Unity3D下內(nèi)置的Terrain對象。
1.2 地形輪廓的導(dǎo)入
Terrain對象是Unity3D內(nèi)置對象,只能對該對象進行設(shè)計,而不能通過其他三維模型轉(zhuǎn)換得到。在這里設(shè)計算法實現(xiàn)了將Mesh地形的高度值導(dǎo)入到Terrain地形上。算法的主要原理是利用了Unity3D內(nèi)置物理引擎中的光線投射功能(Ray Cast),在Mesh地形的上方進行光線掃描,逐行逐列地向下發(fā)射光線,當(dāng)光線遇到Mesh地形時會記錄光線的長度,再用Terrain對象的Height高度屬性值減去光線長度,從而得到Mesh地形在這一點的高度值,再將該值映射到Terrain對象上,最后Terrain對象具有與Mesh地形完全一樣的地形高度效果(圖2),其中圖2a為利用光線投擲算法測量地形各個點的高程,圖2b為將高程導(dǎo)入到Terrain地形上的最終效果。
主要算法如下:
2 地形細(xì)節(jié)制作
2.1 常規(guī)地形細(xì)節(jié)建模存在的問題
由于Google Earth地形精度的原因,前面導(dǎo)入的地形只是農(nóng)場環(huán)境地勢的大體輪廓,一些細(xì)節(jié)還要手工進行設(shè)計。Unity3D提供了利用筆刷工具改變地形的高低,但這只能進行一些粗略的繪制,無法實現(xiàn)精確的設(shè)計。
值得一提的是,一些已有的虛擬場景設(shè)計中使用第三方三維建模工具(如3DSMax)建立公路等地形物體,再加入到場景中覆蓋在地形上。也有一些開發(fā)人員利用Unity3D中制作公路的專用插件來建立公路模型。經(jīng)過實踐驗證,發(fā)現(xiàn)這兩種方法都存在以下3個共同的問題:①為了使公路與周圍地形較好地連接,公路與地形距離較近,這會使后期漫游繪制場景中產(chǎn)生閃爍現(xiàn)象(從高空俯瞰地形時更加明顯);②公路周圍的綠化效果不方便實現(xiàn),由于公路是單獨的模型,不能在上面直接繪制植物,給后期場景制作帶來不便;③公路的修改不方便,一旦模型建立完畢,在場景中幾乎無法修改,這不符合后期仿真的要求[6]。
2.2 利用高度圖繪制統(tǒng)一地形
經(jīng)過實踐探索,采用高度圖建立地形,通過對高度圖的詳細(xì)繪制,實現(xiàn)了農(nóng)場中地形的一致性。即除了一些建筑物單獨建模,其他的細(xì)節(jié)都利用地形高度變化來實現(xiàn),如公路、水溝、河床、田埂、田垅、水壩等。這種方法大大提高了場景的建模效率,節(jié)約了模型資源,同時為后期的農(nóng)場仿真操作提供了更多的可能。原因在于地形細(xì)節(jié)是由統(tǒng)一的地形對象實現(xiàn),可以通過程序適時進行調(diào)整,例如田垅的起伏、公路的長短等都可以通過程序來動態(tài)調(diào)整。
這種方法帶來的問題就是對地形高度圖的設(shè)計以及地表的紋理貼圖要求較高,必須進行專門的處理。利用高度圖進行地形細(xì)節(jié)的繪制,其原理是利用Unity3D導(dǎo)入導(dǎo)出高度圖的功能來實現(xiàn)的,在此之前要求對地形細(xì)節(jié)的常用高度有一個明確的規(guī)劃。在Unity3D中支持8位和16位兩種高度圖,其中16位對電腦的性能要求較高,一般采用8位的灰度圖,共256個高度級別(0~255)[7]。
該設(shè)計實現(xiàn)的場景中高度共分為11個等級,為了保證農(nóng)場場景中地形細(xì)節(jié)設(shè)計的精度,最小高度差為0.25 m(田埂高度),這樣地形的最高點可以達(dá)到256×0.25=64 m。具體高度值及灰度值如表1。
根據(jù)表1中的規(guī)劃,利用Photoshop等圖形處理工具,建立如圖3a所示的地形效果,最后存儲為RAW格式,導(dǎo)入到Unity3D中生成地形,如圖3b。利用圖形處理工具對高度圖進行處理,比直接在Unity3D中使用筆刷直接繪制地形要方便得多,可以滿足地形細(xì)節(jié)設(shè)計的需要[8]。
3 地貌制作
農(nóng)場地貌一般比較簡單,除一般的旱田、水田外,還包括公路、山地、荒丘、河流、湖泊等。這些地表外觀大都可以使用貼圖來實現(xiàn),而河流、湖泊等水系可以使用Unity3D內(nèi)部的水模型來實現(xiàn)。在此重點討論地表紋理及植物的建模方法。
3.1 地表紋理繪制
農(nóng)場的地表貼圖可以分為土地、山地、山石、公路、草地、石材鋪裝等,這些紋理圖片不僅要求是可以用于實現(xiàn)平鋪效果的無縫貼圖,還要求紋理的大小與邊界進行特別處理[9]。由于Unity3D中的地形貼圖原理,各個不同的貼圖之間會存在一個過渡區(qū),為了使這部分區(qū)域很好地銜接,要對貼圖邊緣進行模型處理。另外,由于貼圖的UV映射效果,當(dāng)?shù)匦蔚男逼缕露容^大時,不同方向的斜坡紋理要單獨進行處理,使其達(dá)到正常的貼圖大小。如圖4所示,為了公路與路邊排水溝之間的連接處過渡自然,應(yīng)當(dāng)將公路紋理的邊界處理成與排水溝磚塊接近的顏色。而排水溝兩個不同方向斜面上的磚塊貼圖要分別進行水平和垂直方向上的縮放處理,使其投影后顯示為正常的磚塊大小。另外,由于貼圖是從地形起點開始平鋪的,公路的位置再進行適當(dāng)調(diào)整,使其地形與紋理同步。只需注意以上幾個問題,就可以利用Terrain實現(xiàn)各種復(fù)雜的地形細(xì)節(jié)。
3.2 農(nóng)作物建模
Unity3D支持“樹”和“草”兩種植物形式,這兩種植物具有隨風(fēng)擺動的效果,自動支持LOD技術(shù)(Levels of Detail)[10]。其實在實際應(yīng)用中并不一定是真的“樹”和“草”,可以是其他任何植物,比如各種農(nóng)作物。兩種方案的不同點在于“樹”是真正的三維模型,而“草”只是一個實時正對相機的圖片,用戶可以根據(jù)需要進行選擇。一般體積較大、仿真中離相機較近的植物使用“樹”,其他的使用“草”。除非特殊需要,否則“樹”的建模要盡量精減,畢竟一般農(nóng)作物數(shù)量較多,太多的面數(shù)會增加顯卡的負(fù)擔(dān)。圖5a為玉米,是三維模型,圖5b為水稻,是十字交叉模型。
3.3 批量精準(zhǔn)種植作物
Unity3D內(nèi)置了不同的筆刷形狀,如果場景中只有少量對位置精度要求不高的植物,可以使用Unity3D內(nèi)置的刷樹和刷草功能來實現(xiàn)。但這種方法無法實現(xiàn)植物在地形上的精確定位和布局,而這種精確定位在農(nóng)作物的種植仿真中尤為重要。例如,農(nóng)田中玉米的株距和行距在農(nóng)藝上都有明確的要求,利用Unity3D內(nèi)置的功能無法快速完成這一操作。如果不使用Unity3D內(nèi)置的“樹”而使用自定義模型的方法,直接將“樹”放入到場景中,可以利用對象的位置實現(xiàn)各個植物的精確定位,但這意味著放棄了Unity3D內(nèi)置“樹”的風(fēng)吹和優(yōu)化效果。為此,有必要研發(fā)Unity3D內(nèi)置“樹”的批量精準(zhǔn)定位算法。通過分析Unity3D的內(nèi)部技術(shù)文檔,定義了如下的幾個類來實現(xiàn)這個算法,其ER圖如圖6。
算法共包含兩個應(yīng)用程序類PlantScript和AttachedPlantScript,二者都運行于編輯模型下,分別對應(yīng)兩個編輯器界面類PlantEditor和AttachedPlantEditor,為其提供編輯器外觀。PlantScript為主應(yīng)用類,將其附加給Terrain對象即可,當(dāng)激活“New Plant”按鍵時,將生成“Plant”對象,其下自動附加AttachedPlantScript代碼。Plant對象在編輯模式下會自動繪制種植參考線,參考線表示所要種植地塊的大小和植株行列間距,用戶可以在“Inspector”面板上通過AttachedPlantEditor編輯器類提供的界面實時可視修改。滿意后單擊“FinalizePlant”按鈕,激活FinalizePlant()方法實現(xiàn)批量種植。圖7a為利用自定義插件在設(shè)計環(huán)境下種植玉米,圖7b為水稻種植的最終運行效果。
4 小結(jié)
通過導(dǎo)入地形輪廓和設(shè)計高度圖的方法,可以快速建立虛擬農(nóng)場地形,但必須配合設(shè)計合適的紋理圖片才能使地形達(dá)到較好的仿真效果,特別是結(jié)合凹凸著色器設(shè)計,可以使效果更加逼真。紋理圖片要注意選擇合適的解析度,避免圖片象素過高造成資源浪費。地形的解析度大小應(yīng)當(dāng)根據(jù)仿真要求合理進行選擇,解析度過小地形的起伏不夠平滑,過大會占用資源太多使仿真不夠流暢。對于不同區(qū)域細(xì)節(jié)要求差別較大的場景,可以選擇不同解析度的多塊地形來拼接實現(xiàn)。編寫實用的植物批量精準(zhǔn)定位種植算法可以提高植物建模效率,這個算法可以進一步擴展,例如允許用戶自定義區(qū)域形狀,使種植區(qū)域的設(shè)計更加靈活。
參考文獻(xiàn):
[1] 顧祝軍,曾志遠(yuǎn).虛擬現(xiàn)實技術(shù)在我國農(nóng)業(yè)現(xiàn)代化中的應(yīng)用[J].農(nóng)機化研究,2005(1):12-15.
[2] 王旭明,劉 循.大規(guī)模地形建模的研究[J].計算機與數(shù)字工程, 2011,39(6):1-4.
[3] 邱建松.基于Unity3d的實時虛擬仿真系統(tǒng)的研究與實現(xiàn)[J]. 電子制作,2012(12):11-13.
[4] 陳 洪,馬 欽,朱德海.基于unity3d的交互式虛擬農(nóng)業(yè)仿真平臺研究[J].農(nóng)機化研究,2012(3):184-186.
[5] 丁 斌,祖家奎.三維可視化中的地形建模與實現(xiàn)技術(shù)研究[J].計算機仿真,2008,25(12):212-215.
[6] 楊忠偉,康瑞存,謝 青.虛擬現(xiàn)實技術(shù)的研究[J].測繪與空間地理信息,2009,32(2):161-163.
[7] 尹華飛,鄭昌文,胡曉惠.交互式數(shù)字地形合成算法[J].計算機輔助設(shè)計與圖形學(xué)學(xué)報,2012,24(7):909-917.
[8] 潘炯波.三角網(wǎng)格的自適應(yīng)細(xì)分研究[J].計算機工程與應(yīng)用, 2011,47(18):186-187.
[9] 王 旭,楊 新,王志銘.在GPU上實現(xiàn)地形渲染的自適應(yīng)算法[J].計算機輔助設(shè)計與圖形學(xué)學(xué)報,2010,22(10):1741-1749.
[10] 李白云,趙春霞.GPU實時構(gòu)建四叉樹的快速地形渲染算法[J].計算機輔助設(shè)計與圖形學(xué)學(xué)報,2010,22(12):2259-2264.