论文部分内容阅读
二维GIS开始于上个世纪60年代,当时是为了机助制图,发展到现在已经广泛应用到土地管理、电力、电信、城市管网、水利、消防、交通以及城市规划等各行各业,也出现了很多重要的分支,如组件GIS(Component GIS,ComGIS)是GIS同组件技术结合的产物,由于组件技术的出现和发展,整个软件产业都发生巨大的变化,不可避免地会影响到GIS的发展。ComGIS成为GIS的另一个发展方向,为开发以GIS为核心的数字化成图系统提供了一种新的开发手段和开发思路,我们正是采用COMGIS这种开发模式来实现GIS应用系统;GIS同网络技术的结合形成了WebGIS,GIS通过WWW功能得以扩展,真正成为一种大众化使用的工具,从WWW的任意一个节点,网络用户可以浏览WebGIS站点中的空间数据、制作专题图,以及进行各种空间检索和空间分析;但通常的二维GIS存在着自身难以克服的缺陷,本质上是基于抽象符号的系统,在进行基本的电子地图浏览的时候只能看到某一个点或面的具体位置、名字等平面信息,不能给人以客观自然的本原感受[1],使GIS缺乏“真实感”和“临界感” ,这样GIS同虚拟现实技术的结合出现了VRGIS(虚拟现实地理信息系统),利用虚拟现实技术对局部场景完全的三维再现,并且能够对场景进行交互式观察和分析,大大提高了GIS对局部场景的处理能力。我们在本文里的主要工作是设计和实现一个虚拟现实中的3D引擎,并将它与GIS结合起来形成VRGIS。在实现VRGIS中,我们是完全独立地分别设计和实现3D引擎与GIS系统,最后将它们进行无缝连接。作为一个3D引擎可以简单的理解为读取制作好的3D数据文件,然后根据数据文件提供的空间几何信息重建场景模型同时进行纹理渲染和光照设定来提高场景的真实感,重要的是还能允许用户在三维场景中自由运动,多角度的观察。我们实现的3D引擎主要包括三方面的内容:3D数据文件的读取,三维场景的重建,视点在场景中的运动。我们所使用的数据文件是id software公司提出的标准地图文件(*.map),还有与地图文件相关的纹理文件(*.wad)。其中map文件存放3D模型数据,主要是场景的多边形数据以及同它相关的纹理和静态光照映射,还包括一些定点光源的指定。wad文件是一种公开的数据格式,用来存放各种纹理贴图,我们可以手动将自己喜爱的图片放在wad文件中,在地图文件制作中使用。要想正确地绘制一个三维场景,最重要的就是确定可见面,计算机图形学发展的初期,可见面算法被称为隐藏线、隐藏面算法。因为三维场景投影到屏幕上之后,必定会出现三维场景中的两个甚至多个多边形面投影到屏幕的同一个区域上的情况,然而在这个区域上一帧内只能显示一个面,<WP=65>这样就需要我们自己来判定哪个面在这一帧内是可见,这就是可见面算法的由来。我们在系统实现中采用的BSP(二叉空间分割)树算法,它是由Schumacker最早提出的,后经Sutherland和Fuchs的不断改进形成现在的版本。它的主要思想就是将整个三维场景用一个二叉树来表示,其中树的叶节点是一个凸集多边形集合,它们之间没有交集,所有叶节点的并集构成了整个场景;内节点是场景的一个多边形面,它的左子树都是在这个面的后边,右子树位于这个面的前边,这样我们只要按照中根遍历的顺序绘制整个树就可以做到从后往前绘制三维场景,保证后面的多边形会被前面的多边形覆盖掉,达到了正确绘制复杂场景的目的。但是BSP树算法只是确定可见面的算法,为了提高渲染效率,我们使用PVS算法删除那些不可见面,让真正需要渲染的多边形越少越好,利用之前构造好的BSP树,为树的每一个叶节点保留一个PVS值用来表示从这个叶节点可以看到的其他叶节点,这样我们在绘制BSP树的时候只需要绘制视点所在的叶节点以及它的PVS值所指定的叶节点就可以了。重建完三维场景模型之后,就要考虑视点在场景中的运动,我们是用鼠标来控制视角的方向,用键盘来控制运动方向,即然是运动就要考虑到碰撞检测和碰撞处理,总不能让人们的视点从墙面上穿过去。碰撞检测本来对于很多3D引擎的设计来说是一个很头疼的问题,因为要将视点和场景中所有多边形进行碰撞检测判断是很耗时的。但是对于我们来说之前已经运用BSP树算法将整个场景构造成一个二叉树,根据BSP树的构造方法我们可知位于三维场景中的视点一定唯一地落在树的一个叶节点中,这样碰撞检测的时候我们只需将视点和这个叶节点中的多边形进行碰撞检测,省去了和大量多边形判断碰撞的操作,很好地提高了引擎的效率。而且BSP树的叶节点是一个凸集,这样在进行碰撞检测的时候无需对节点中的多边形做预排序。正是这些优点使得很多不用BSP树算法作为可见面算法的引擎系统也都为自己构造一个BSP树来加快碰撞检测。最后,我们还和市场上同类的3D引擎产品进行了比较,分析了我们的优缺点。