刘桂阳,李媛媛,张园园
(黑龙江八一农垦大学信息技术学院,黑龙江 大庆 163319)
摘要:提出了利用导入农场地形轮廓、合理规划地形高度图的方法建立可动态更新的统一数据地形,并通过合理设计地形纹理,使纹理贴图与地形有机结合,实现了逼真的地表效果。在农场地貌设计中,为了解决虚拟农场中无法实现按农艺要求种植植物的问题,提出了在虚拟场景编辑模式下建立自定义插件,完成批量精确定位种植植物的方法,实现了虚拟环境下种植农作物的自动化、精确化。以上方法建立的地形及地形上的植物可动态实时更新,为后期进一步开发农场仿真操作提供了技术保障。
教育期刊网 http://www.jyqkw.com
关键词 :虚拟农场;地形地貌;植物建模;Unity3D
中图分类号:TP391 文献标识码:A 文章编号:0439-8114(2015)07-1726-05
DOI:10.14088/j.cnki.issn0439-8114.2015.07.050
近年来,虚拟现实技术在农业虚拟仿真、农业生态旅游等方面应用越来越广泛。利用虚拟植物、虚拟农田等模型,建立虚拟农场使人们在计算机上种植虚拟作物并进行虚拟农场管理,可以从任意角度甚至在作物冠层内漫游观察作物生长状况的动态过程,还可以通过改变环境条件和栽培措施,直观地观察作物生长过程[1]。在虚拟农场设计过程中,农场的地形建模是真实世界模拟的一个重要组成部分,目前地形的建模研究已经很广泛,其中包括快速生成大规模的地形高度数据、地形地貌的细分优化、地表泥土的模拟等[2]。
通过对目前流行的虚拟现实软件进行比较,选用Unity3D作为虚拟农场的开发环境[3]。利用Unity3D建立的Terrain地形,可以存储和动态设置地形上各个网格点高度坐标,灵活地动态实现各种复杂地形。同时支持用户在地形上交互式增加和删除三维植物,这是大多三维虚拟软件所不具备的。由于使用了植物模型优化和动态修改功能,为后期虚拟农场操作提供了保障。
常规的地形建模一般都是利用Unity3D下的Terrain地形建立山脉、湖泊等大体结构,其他如建筑、公路、田垅等细节都是利用第三方建模工具单独建模后进行导入[4],这样做的缺点是地形上的元素不能保持一致,对后期的仿真带来不便。鉴于农场仿真操作大都是在野外条件下进行,而且一般都会涉及到农作物的操作,所以在此除单体的建筑物外,其他的道路、沟渠、田垅等细节采用统一的地形建模。地形的生成分为地形的轮廓导入及地形细节设计两个步骤,地形的原始数据来源于Google Earth,导入到Unity3D虚拟现实场景中,生成了农场地形的轮廓。地形细节利用高度图手工绘制,最后在地形上添加地貌纹理、河流、植被等对象。这种方法建立的地形在保证整体上与实际地形一致的同时,在细节设计上保留了较大的自由度。建立的地形支持高度自由变换、随机栽种植物、地表纹理绘制等功能,为后期虚拟农场的仿真操作提供了技术保障。
1 地形轮廓的生成
1.1 Mesh网格地形下载
要建立虚拟农场中的地形,首先要有地形DEM的原始数据,由于SketchUp与Google Earth三维地理信息系统的完美结合,可以下载全球任一地区的真实地形数据(这个数据精度不是太大,但基本能够满足虚拟农场需要)。首先在SketchUp中利用“插入地形”工具得到小块地形,由于Google Earth每次插入的地形大小有限,如果要实现大面积的地形效果,需要多次插入小面积的地块,然后经过“解锁、炸开、合并”等操作建立一个完整地块[5]。最后将地形通过3DS格式导出到3DSMax中进行后期处理。其中主要包括地形的规格化、顶点焊接、修补漏洞、更新轴心点、重新命名等操作。最后通过FBX格式将Mesh网格地形导入到Unity3D中(图1),其中图1a为在Google Earth中选择单个小地形图,图1b为将多个小地形在SketchUp中进行拼接,图1c为在3DSMax中进行后期处理,图1d为将地形导入到Unity3D中。
这里得到的地形数据可以作为虚拟农场的周边背景,但由于是外部导入的三维物体,在Unity3D中无法根据平面坐标取得或改变地形上每个点的海拔高度,不能满足虚拟农场后期仿真的需要,故需要将Mesh地形转化为Unity3D下内置的Terrain对象。
1.2 地形轮廓的导入
Terrain对象是Unity3D内置对象,只能对该对象进行设计,而不能通过其他三维模型转换得到。在这里设计算法实现了将Mesh地形的高度值导入到Terrain地形上。算法的主要原理是利用了Unity3D内置物理引擎中的光线投射功能(Ray Cast),在Mesh地形的上方进行光线扫描,逐行逐列地向下发射光线,当光线遇到Mesh地形时会记录光线的长度,再用Terrain对象的Height高度属性值减去光线长度,从而得到Mesh地形在这一点的高度值,再将该值映射到Terrain对象上,最后Terrain对象具有与Mesh地形完全一样的地形高度效果(图2),其中图2a为利用光线投掷算法测量地形各个点的高程,图2b为将高程导入到Terrain地形上的最终效果。
主要算法如下:
2 地形细节制作
2.1 常规地形细节建模存在的问题
由于Google Earth地形精度的原因,前面导入的地形只是农场环境地势的大体轮廓,一些细节还要手工进行设计。Unity3D提供了利用笔刷工具改变地形的高低,但这只能进行一些粗略的绘制,无法实现精确的设计。
值得一提的是,一些已有的虚拟场景设计中使用第三方三维建模工具(如3DSMax)建立公路等地形物体,再加入到场景中覆盖在地形上。也有一些开发人员利用Unity3D中制作公路的专用插件来建立公路模型。经过实践验证,发现这两种方法都存在以下3个共同的问题:①为了使公路与周围地形较好地连接,公路与地形距离较近,这会使后期漫游绘制场景中产生闪烁现象(从高空俯瞰地形时更加明显);②公路周围的绿化效果不方便实现,由于公路是单独的模型,不能在上面直接绘制植物,给后期场景制作带来不便;③公路的修改不方便,一旦模型建立完毕,在场景中几乎无法修改,这不符合后期仿真的要求[6]。
2.2 利用高度图绘制统一地形
经过实践探索,采用高度图建立地形,通过对高度图的详细绘制,实现了农场中地形的一致性。即除了一些建筑物单独建模,其他的细节都利用地形高度变化来实现,如公路、水沟、河床、田埂、田垅、水坝等。这种方法大大提高了场景的建模效率,节约了模型资源,同时为后期的农场仿真操作提供了更多的可能。原因在于地形细节是由统一的地形对象实现,可以通过程序适时进行调整,例如田垅的起伏、公路的长短等都可以通过程序来动态调整。
这种方法带来的问题就是对地形高度图的设计以及地表的纹理贴图要求较高,必须进行专门的处理。利用高度图进行地形细节的绘制,其原理是利用Unity3D导入导出高度图的功能来实现的,在此之前要求对地形细节的常用高度有一个明确的规划。在Unity3D中支持8位和16位两种高度图,其中16位对电脑的性能要求较高,一般采用8位的灰度图,共256个高度级别(0~255)[7]。
该设计实现的场景中高度共分为11个等级,为了保证农场场景中地形细节设计的精度,最小高度差为0.25 m(田埂高度),这样地形的最高点可以达到256×0.25=64 m。具体高度值及灰度值如表1。
根据表1中的规划,利用Photoshop等图形处理工具,建立如图3a所示的地形效果,最后存储为RAW格式,导入到Unity3D中生成地形,如图3b。利用图形处理工具对高度图进行处理,比直接在Unity3D中使用笔刷直接绘制地形要方便得多,可以满足地形细节设计的需要[8]。
3 地貌制作
农场地貌一般比较简单,除一般的旱田、水田外,还包括公路、山地、荒丘、河流、湖泊等。这些地表外观大都可以使用贴图来实现,而河流、湖泊等水系可以使用Unity3D内部的水模型来实现。在此重点讨论地表纹理及植物的建模方法。
3.1 地表纹理绘制
农场的地表贴图可以分为土地、山地、山石、公路、草地、石材铺装等,这些纹理图片不仅要求是可以用于实现平铺效果的无缝贴图,还要求纹理的大小与边界进行特别处理[9]。由于Unity3D中的地形贴图原理,各个不同的贴图之间会存在一个过渡区,为了使这部分区域很好地衔接,要对贴图边缘进行模型处理。另外,由于贴图的UV映射效果,当地形的斜坡坡度较大时,不同方向的斜坡纹理要单独进行处理,使其达到正常的贴图大小。如图4所示,为了公路与路边排水沟之间的连接处过渡自然,应当将公路纹理的边界处理成与排水沟砖块接近的颜色。而排水沟两个不同方向斜面上的砖块贴图要分别进行水平和垂直方向上的缩放处理,使其投影后显示为正常的砖块大小。另外,由于贴图是从地形起点开始平铺的,公路的位置再进行适当调整,使其地形与纹理同步。只需注意以上几个问题,就可以利用Terrain实现各种复杂的地形细节。
3.2 农作物建模
Unity3D支持“树”和“草”两种植物形式,这两种植物具有随风摆动的效果,自动支持LOD技术(Levels of Detail)[10]。其实在实际应用中并不一定是真的“树”和“草”,可以是其他任何植物,比如各种农作物。两种方案的不同点在于“树”是真正的三维模型,而“草”只是一个实时正对相机的图片,用户可以根据需要进行选择。一般体积较大、仿真中离相机较近的植物使用“树”,其他的使用“草”。除非特殊需要,否则“树”的建模要尽量精减,毕竟一般农作物数量较多,太多的面数会增加显卡的负担。图5a为玉米,是三维模型,图5b为水稻,是十字交叉模型。
3.3 批量精准种植作物
Unity3D内置了不同的笔刷形状,如果场景中只有少量对位置精度要求不高的植物,可以使用Unity3D内置的刷树和刷草功能来实现。但这种方法无法实现植物在地形上的精确定位和布局,而这种精确定位在农作物的种植仿真中尤为重要。例如,农田中玉米的株距和行距在农艺上都有明确的要求,利用Unity3D内置的功能无法快速完成这一操作。如果不使用Unity3D内置的“树”而使用自定义模型的方法,直接将“树”放入到场景中,可以利用对象的位置实现各个植物的精确定位,但这意味着放弃了Unity3D内置“树”的风吹和优化效果。为此,有必要研发Unity3D内置“树”的批量精准定位算法。通过分析Unity3D的内部技术文档,定义了如下的几个类来实现这个算法,其ER图如图6。
算法共包含两个应用程序类PlantScript和AttachedPlantScript,二者都运行于编辑模型下,分别对应两个编辑器界面类PlantEditor和AttachedPlantEditor,为其提供编辑器外观。PlantScript为主应用类,将其附加给Terrain对象即可,当激活“New Plant”按键时,将生成“Plant”对象,其下自动附加AttachedPlantScript代码。Plant对象在编辑模式下会自动绘制种植参考线,参考线表示所要种植地块的大小和植株行列间距,用户可以在“Inspector”面板上通过AttachedPlantEditor编辑器类提供的界面实时可视修改。满意后单击“FinalizePlant”按钮,激活FinalizePlant()方法实现批量种植。图7a为利用自定义插件在设计环境下种植玉米,图7b为水稻种植的最终运行效果。
4 小结
通过导入地形轮廓和设计高度图的方法,可以快速建立虚拟农场地形,但必须配合设计合适的纹理图片才能使地形达到较好的仿真效果,特别是结合凹凸着色器设计,可以使效果更加逼真。纹理图片要注意选择合适的解析度,避免图片象素过高造成资源浪费。地形的解析度大小应当根据仿真要求合理进行选择,解析度过小地形的起伏不够平滑,过大会占用资源太多使仿真不够流畅。对于不同区域细节要求差别较大的场景,可以选择不同解析度的多块地形来拼接实现。编写实用的植物批量精准定位种植算法可以提高植物建模效率,这个算法可以进一步扩展,例如允许用户自定义区域形状,使种植区域的设计更加灵活。
教育期刊网 http://www.jyqkw.com
参考文献:
[1] 顾祝军,曾志远.虚拟现实技术在我国农业现代化中的应用[J].农机化研究,2005(1):12-15.
[2] 王旭明,刘 循.大规模地形建模的研究[J].计算机与数字工程, 2011,39(6):1-4.
[3] 邱建松.基于Unity3d的实时虚拟仿真系统的研究与实现[J]. 电子制作,2012(12):11-13.
[4] 陈 洪,马 钦,朱德海.基于unity3d的交互式虚拟农业仿真平台研究[J].农机化研究,2012(3):184-186.
[5] 丁 斌,祖家奎.三维可视化中的地形建模与实现技术研究[J].计算机仿真,2008,25(12):212-215.
[6] 杨忠伟,康瑞存,谢 青.虚拟现实技术的研究[J].测绘与空间地理信息,2009,32(2):161-163.
[7] 尹华飞,郑昌文,胡晓惠.交互式数字地形合成算法[J].计算机辅助设计与图形学学报,2012,24(7):909-917.
[8] 潘炯波.三角网格的自适应细分研究[J].计算机工程与应用, 2011,47(18):186-187.
[9] 王 旭,杨 新,王志铭.在GPU上实现地形渲染的自适应算法[J].计算机辅助设计与图形学学报,2010,22(10):1741-1749.
[10] 李白云,赵春霞.GPU实时构建四叉树的快速地形渲染算法[J].计算机辅助设计与图形学学报,2010,22(12):2259-2264.