Unity3D支持的DEM地形三维可视化表达技术实现
2018-02-01陈淑姝甘淑
陈淑姝+甘淑
摘要:近年來,三维地形可视化、三维空间分析已经成为三维地理信息系统领域的前沿问题。为改正传统GIS中面三维将高程坐标仅仅作为附属坐标而导致无法构建地形真三维模型,同时也无法提供地下信息的缺点,基于Unity3D游戏引擎和ArcGIS平台,采用任意地形灰度图为数据源,将灰度图转化ASCII栅格文件读入Unity3D中,最终利用Gameobject中Cube元素,实现了DEM中规则格网模型的真三维展示,利用Gameobject的Mesh元素,采用顺时针索引数组实现了DEM中TIN的真三维展示,由于U3D引擎具有独立的Y坐标(在U3D中高程坐标以Y轴表示)特性,使其能够创建真正意义的真三维模型,同时可以在摄像头上添加镜头旋转脚本以实现模型的360度浏览。
关键词:地理信息系统;三维;真三维;DEM;Unity3D
DOIDOI:10.11907/rjdk.172439
中图分类号:TP317.4
文献标识码:A文章编号文章编号:1672-7800(2018)001-0208-04
Abstract:In recent years, 3D terrain visualization and 3D spatial analysis have become the front problem of GIS. For solving the disadvantages in traditional GIS that elevation coordinates just as subsidiary coordinates. This causes the true 3D model of terrain can not be constructed and could not retrieve the information of underground. The DEM model is generated by Unity 3D and ArcGIS platform, turning random gray scale map into ASCII raster file then import it into Unity3D. The Grid of DEM is generated by the Cube of Gameobject and the mesh of Gameobject employs clockwise index array to create the TIN of DEM, due to Y coordinates in Unity 3D is independent (elevation coordinates are represent by the Y axis), the true 3D model can be constructed at the same time adds the camera rotation script to main camera can see the model 360 degree.
Key Words:GIS; 3D; true 3D; DEM; Unity3D
0引言
随着计算机技术、空间技术和现代信息基础设施的发展,地理信息系统已拓展到测绘、土地、环境、交通等各个领域,发挥着日益重要的作用[1]。地形作为重要的自然景物,拥有数据结构复杂、数据量庞大的特点,地形的应用在GIS中占有重要地位。随着GIS应用的不断深入,作为第三维的高程信息显得越来越重要[2]。一些二维GIS和图象处理系统在处理高程信息时并未将高程变量作为单独变量,而是将其作为附属变量处理,这种做法虽然满足了地表地形信息的表达要求但是造成了地下信息的缺失,因此它们在国际国内也被俗称为2.5维的系统[3]。出于严密性考虑可将此称之为“地形面三维”或简称面三维。面三维的GIS实质上是二维GIS系统[4]。在真三维中,一个空间物体是通过X、Y、Z三个坐标轴加以定义的,Z值将不再是附属,而是一个完全独立的变量。真三维的优点是具有连续的数据结构和与之相应的分析功能,由此带来的好处是可以更直观地展现模型并且从空间角度对其进行相应分析[5]。
Unity3D作为一个近年来大热的三维游戏引擎,具有兼容操作系统、跨平台发布并部署、开发简单易上手、人机交互功能强大、三维效果逼真、内置网络功能的特点,被广泛运用于游戏开发和虚拟现实[6,7]。U3D本身自带地形建模功能,可以通过画笔或者导入高度图的方式生成地形,本文将U3D运用到系统仿真的同时把ArcGIS与Unity3D结合,以一种新的方式构建相关真实地形,实现DEM的真三维显示。
1方案建立
空间数据模型是对现实世界一种抽象、归类及简化的描述[8]。三维空间数据模型是研究三维空间几何对象的数据组织、操作方法以及规则约束条件等内容的集合[9]。三维模型的开发需要注意三方面问题:①明确要模拟的对象;②数据存储与数据之间的逻辑关系;③模型显示。本文以ASCII栅格文件为描述对象建立相关DEM模型,建立流程如图1所示。
2数据预处理
将DEM数据(见图2)加载到ArcGIS中,打开工具箱使用重采样工具将其导出为100×100的DEM数据,再使用工具箱中的数据转换(栅格转ASCII)将导出后的数据保存为txt格式,并命名为Grid.txt(见图3)。
3Grid模型生成
生成Grid模型核心思想是利用StreamReader读入文件,再用Split()函数将每个元素依次读出,把每个象元值当作高程,以100×100的规模利用Cube构建出DEM(见图4)。
生成DEM的主要代码为:
list=ReadFile(Application.dataPath+"/Resources","Grid.txt");endprint
for (int i=0; i { position=list[i].ToString().Split(new Char[]{' '}); for (int j=0; j { cube=GameObject.CreatePrimitive(PrimitiveType.Cube); cube.transform.position=new Vector3(i, float.Parse(position[j])/20, j); cube.transform.localScale=new Vector3(1, float.Parse(position[j])/10,1); cube.GetComponent } } 为了使其更有层次感,设置getcolor函数返回不同高度立方体的颜色,代码如下: private Color getcolor(float value) { if (value>0&&value<50) {return c1;} else if (value>50 && value<100) { return Color.blue; } else if (value>100 && value<150) { return Color.yellow; } else if (value>150 && value<200) { return Color.green; } else { return Color.white; } } 4TIN生成 TIN的建立思路是利用mesh生成TIN,依此遍历ASCII文本的每个像元值,作为每个顶点的Y坐标,核心代码为: list=ReadFile(Application.dataPath+"/Resources","Grid.txt"); for (int i=0; i { position=list[i].ToString().Split(new char[]{' '}); for (int j=0; j { ver[index]=new Vector3(i, float.Parse(position[j])/10, j); index++; } } 确定了顶点以后,需要将顶点按照一定的次序排列进组[10],索引数组存储mesh顶点的索引值如图5所示。 每个矩形由2个三角形构成,按顺时针顺序构造三角形,核心代码为: for (int c=0; c<99; c++) { for (int d=0; d<99; d++) {//三角形1 tri[dex++]=c*100+d; tri[dex++]=(c+1)*100+d; tri[dex++]=(c+1)*100+d+1; //三角形2 tri[dex++]=c*100+d; tri[dex++]=(c+1)*100+d+1; tri[dex++]=c*100+d+1; } } 其中tri[]為索引数组,将tri的值赋给mesh.Triangles即可,之后添加一个Button,程序运行时单击Button即可看到TIN(见图6)。 DEM生成后,为了方便360度无死角观察模型,还应该添加一个镜头旋转脚本[11],主要代码为: void LateUpdate() { if (Input.GetAxis("Mouse ScrollWheel") !=0) { Distance-=Input.GetAxis("Mouse ScrollWheel")*mouseWheelSentive; } if (Input.GetMouseButton(0) { if (target) { AngleX+=Input.GetAxis("Mouse X")*xSpeed*0.02f; AngleY-=Input.GetAxis("Mouse Y")*ySpeed*0.02f; } } else { if (Input.GetKey(KeyCode.W)) { AngleY-=0.5f; } else if (Input.GetKey(KeyCode.S)) {
AngleY+=0.5f;
}
if (Input.GetKey(KeyCode.D))
{
AngleX+=0.5f;
}
else if (Input.GetKey(KeyCode.A))
{
AngleX-=0.5f;
}
}
Rotation=Quaternion.Euler(angleY, angleX, 0);
Camera.transform.rotation=rotation;
Position=rotation*new Vector3(0.0f,0.0f,-distance)+target.transform.position; Camera.transform.position=position;
}
脚本编写完毕之后,將其挂在Main Camera之上便可以360度浏览模型,对Scene进行发布,选择相应存储位置,便可由任意用户进行浏览,如图7和图8所示。
5结语
地形构建运用十分广泛,例如可以根据某一区域的历史数据演变规律,结合GIS空间特性,进行灾害模拟,为政府和有关机构提供及时有效、准确可靠的决策信息,使减灾、防灾、救灾等有更充分的科学依据;同时地形构建可用于军事领域,如结合地形进行可视域分析;地形构建同样也可应用于游戏中。基于Unity平台建立DEM将Unity3D和ArcGIS做了很好的结合,且将U3D引擎运用到计算机仿真中,利用Cube实现了格网DEM的真三维展示,利用Mesh实现了TIN的真三维展示模型,笔者下一步将在地形模型基础上进一步研究流团模型构建算法,以此模拟泥石流运动规律。
参考文献:
[1]黄应全.浅谈地理信息系统在测绘领域的扩展应用[J].企业技术开发,2013,32(11):53-54.
[2]师向东.基于场景图的GIS三维可视化技术研究与实现[D].沈阳:东北大学,2008.
[3]房玉龙.可视化技术在地下管线信息系统中的应用[D].南京:南京大学,2005.
[4]肖乐斌,钟耳顺,刘纪远,等.三维GIS的基本问题探讨[J].中国图象图形学报,2001,6(9):842-848.
[5]姜小轶,孙运生,王安.三维地理信息系统(3D-GIS)的发展现状及趋势[J].世界地质,1988,17(4):58-62.
[6]马龚丽,杨敏,支雄飞,等.基于Unity3D的三维海底地形建模[J].安徽电子信息职业技术学院学报,2013,12(69):24.
[7]赵艳坤.基于Unity3D的栾川三维城市地理信息系统研究[D].郑州:郑州大学,2016.
[8]玉秀琴.VR-GIS技术在城市房产信息查询系统中的应用研究——以兰州市七里河区西部欢乐园地区为例[D].兰州:兰州大学,2005.
[9]梁鹏飞.基于GPS/3DGIS技术的车辆定位监控系统研究[D].福建:福建师范大学,2009.
[10]离火之灵.Unity3D Mesh创建中三角索引的算法[EB/OL].http://blog.csdn.net/lihuozhiling0101/article/details/43453435.com.
[11]日久生情.Unity3D脚本:RPG的镜头跟随脚本[EB/OL].http://www.manew.com.
(责任编辑:何丽)endprint