





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