以下是三维电子地图引擎设计的介绍,主要把整个三维电子地图引擎的创建过程描述了一遍,并没有对程序代码进行详述;它着重于三维地图的设计方法的介绍,对于开发制作三维地图系统还是很有参考价值的。
(Ps:若要转载请注明出处)
三维校园电子地图
Arky
关键词:三维建模;三维校园;地图引擎;DirectX
3DCampusElectronicMap
Abstract:3DcampuselectronicmapisanavigationalsystemdevelopedbaseonManagedDirectXSDK.Withsimulativemodeling,thesystemcollectivelyincludesvariousgeographicalinformationofthecampussuchascoordinatesandlandscape,thenitcanbuildthefull3Dmodelsaccordingthecoordinatesofthecampus'building,itanofferanintelligentplatformtoplanningtheconstructionofthecampus,helpingthevisitor,andpropagandizingtheschool,itgiveslotsofconveniencetoallthesystemusers.Thesystemalsobyusingreallyimagesofthecampustoconstructthe3Dsimulationenvironmentinordertopresentthe3Dvirtualnavigationsystemintheelectronicmap.
Keywords:3DModeling;3DCampus;MapEngine;DirectX
1引言
近几年来,随着计算机技术,特别是计算机图形学、三维仿真技术以及虚拟现实技术的飞速发展,传统的二维电子地图被注入了新的活力,三维电子地图正成为电子地图发展的一个重要方向。传统的二维电子地图只能以图形和符号的方式来描述一张地图,这种方式往往不能直观清晰的表示出目标所处位置的地理环境;采用三维电子地图的方式,通过建立场景的仿真模型,把现实场景进行虚拟再现,则具有真实、互动、身临其境的特点,这也是虚拟现实技术独特的魅力所在。
2三维地图引擎设计
构建三维校园电子地图引擎需要按照以下几个关键步骤来进行开发:
(3)三维模型建立:建立校园场景中的建筑模型、场景小品模型、天空环境模型和地形模型等;
(4)三维引擎构建:使用程序来实现模型导入、三维场景的漫游、导航功能。
系统总体设计框架如图1所示。
图1系统总体设计框架
三维校园电子地图漫游导航引擎作为该系统的核心部分,它主要实现的目标是:实现将3dsMax建立的模型导入引擎,把所有模型组合成一个校园整体,导入音乐,加载天空、地形以及环境小品等对象,构建成一个集音乐与用户交互的三维校园互动系统。
校园建筑的模型比例数据、贴图数据、布局位置全部是通过实地取材得来,由于学校东区面积比较大,建筑复杂多样,所以使用数码相机在校园各景点获取数码照片作为参照数据是最方便快捷的方式。在校区内采集数码照片近2000张,将校园所有景观囊括在内,力争最大限度的呈现真实校园。建筑轮廓基本是从高层楼顶拍摄,然后通过照片的对比和组合得到建筑的实际外形和轮廓数据,通过互联网的Google卫星图获取建筑之间的比例数据以及平面布局数据,通过照片的剪切获取景物的纹理贴图数据。
校园二维平面图的制作在三维校园电子地图的开发过程中是相当重要的一个环节,二维平面图制作的好坏直接影响到三维立体图的效果。因为三维地图的建模是完全基于二维平面图而建立的,如果二维平面图的比例不正确,就不可能制作出精确的三维地图。制作二维平面图图的另外一个作用就是生成导航引擎程序的小地图导航地图功能。由此可见二维平面图的制作对整个三维地图的准确性具有重要的意义。
(a)Google卫星图(b)CAD平面图
图2Google卫星图与CAD平面图
底图是通过Google卫星照片拼接而成,首先在电脑上安装Google_Earth_BZXV.exe。在搜索框中输入桂林电子科技大学的位置:25°17'5.05"N,110°19'53.89"E以获取校园的卫星照片。为了得到清晰的底图,获取图片是采取分次获取,然后使用Photoshop合并成一张完整的桂电东区校园底图。
获得了校园的平面底图GuetMap.jpg以后,将它导入进AutoCAD作为外部参照的地图,用CAD的直线和曲线绘制工具按照底图建筑的轮廓绘制出外形,然后使用延伸和裁减工具将模型修整完整。
为了使得建筑轮廓与其他物体区分开,在绘制建筑轮廓是单独创建一个building图层,用于绘制建筑,设定线条颜色为黄色。
绘制运动场平面框图的方法跟绘制建筑平面图一样,新建一个ground图层,以卫星照片为底图绘制出所有运动场的边框,然后再绘制出场地边界线。
根据卫星图的路径显示,在绘制校园道路是创建了一个以背景线条色为蓝色的path图层,专门用于绘制道路。将所有的元素绘制完成后,就得到一张CAD导出平面图guet.dwg文件。该文件的最终效果如图3所示:
图3校园平面图
有了这张平面地图,就能够使用3dsMax导入*.dwg文件作为底图参照,然后绘制出等比例的校园3D模型。
校园虚拟环境建模具体实施起来,可以按以下几个方面来进行:
(1)建筑模型
由于在学校的大多数建筑物,一般都是由正方体的形状构成,因此使用多边形来建立模型是最适合的。在建立模型之前首先观察建筑的形态,再建立出大概的轮廓,最后再使用多边形的修改命令来完善模型。在建筑物上会有许多凸起部分,本系统不能全部使用模型来实现它,使用贴图效果来充当凸起部分的面是三维程序惯用的手法,这样也能是一个平面看起来更加富有立体感。下面就以学校的图书馆为例子,介绍三维模型的建立过程。
1首先打开3dsMax导入先前已经完成的CAD底图guet.dwg,用于约束模型的比例和作为建立模型的参照,然后在顶视图的窗口建立出建筑物的大概轮廓。
2有了底图作为参照,按照图书馆数码相片的取材估算出图书馆的每层楼的大概高度,然后建立出组成图书馆的多边形组合。图书馆的主体主要是一个长方体,然后通过3Dmax的多边形修改器的cut命令在长方体上切割出分割线,再选择面工具的挤压(Extrude)命令来制作出突起面,如图4所示。
图4由长方体挤压出的图书馆主体
3在图书馆的主体中,有突出面也有塌陷的面,这里我使用到布尔运算的修改面板来制作出模型的塌陷面。
如果想用布尔运算在一扇墙上开窗户或门,最好把所有的窗户或门连接成一个对象,然后只用一次布尔运算来实现开窗户或门的操作;在对样条曲线进行布尔运算前,要确保所有的样条都被结合到了一起,否则它们是不会进行布尔运算的。
图书馆的背面有两处塌陷的位置,这时首先建立两个与凹陷位置大小相同的两个几何体,再把几何体放到需要减去的位置,最后使用相减的命令将这片区域给去除掉。
4制作完图书馆的主体以后,再使用正方形建模工具在主体的旁边建立出突起部分,再使用多边行修改工具挤压出楼梯、柱子、花坛等辅助模型,最后完成的图书馆三维模型如图5所示。
图5图书馆的3D模型
5在完成模型的建立以后,要检查模型是否有多余的面和不可见的面,这些面必须得全部删除,以确保模型的面达到最少,以减少程序导入三维模型的负荷。
(2)地形模型
桂林电子科技大学整个东区校园的地形样式比较丰富,由山坡、河流、以及高低不同的坡面,这个地形的模型制作加大了难度。在校园东区地形的创作中,我把整个学校当作一个区域,按照CAD地图建立一个大平面,然后在这个大平面上切割出64个小面,再通过多边形修改器来分区修改这些小面,得出高低不同的坡面以及河流等模型。图6是在全局底图的基础切割好的64个小平面。
图6地形模型1
在地形中,比较矮小的坡度(如:路边沿等)则不进行3D建模,而是使用贴图取而代之,这样将会最大程度上减小程序的开销。最终完成的地形图如图7所示。
图7地形模型2
(3)环境小品模型
建立模型之后的工作就是给模型赋予材质和贴图。在3dsMax中材质就是模型的灵魂,一个好的材质会使模型有生气。3dsMax中最简单的是Bitmap贴图。除此之外还有多种贴图形式。在三维校园图的制作中,位图是较为常用的一种二维贴图。在三维场景制作中大部分模型的表面贴图都需要与现实中的实体相吻合,而这一点通过其它程序贴图是很难实现的,也许通过一些程序贴图可以模拟出一些纹理,但这也与真实的纹理有一定差距。所以选择以数码相机拍摄手段获取的位图作为校园立体图对象的贴图。
制作过程如下:
从实地拍摄的数码相片中选取合适角度的照片在Photoshop中进行拉伸扭曲得到所需贴图单元,保存为JPG格式。在3dsMax中,调用经过处理过的图片进行贴图,初步贴上的图在建筑物上是很不规则的,所以需要运用修改工具中的UVW贴图坐标。贴上实地采集的相片使得所得图像与实际建筑物很接近如图。
对于材质中的二维贴图,物体就必须具有贴图坐标。这个坐标就是确定二维的贴图以何种方式映射在物体上。它不同于场景中的XYZ坐标系,而是使用的UV或UVW坐标系。
因为学校模型大多数建筑都是呈矩形,因此使用box与planar两种方式比较常用,比如说体育场馆的墙面就是用box方式来贴图的,在使用box与planar通常是用在重复的无缝贴图上面,比如说三教的窗口,就是使用一层楼的窗口重复贴图而完成整栋楼的窗口的。而Cylindrical贴图方式则常用在圆柱面的贴图上,比如说水池的贴图就是使用Cylindrical贴图方式来实现的。如图8所示。
(a)box贴图方式(b)Cylindrical贴图方式
图8模型贴图
UnwrapUVW贴图
使用UnwrapUVW贴图方式一般用于较复杂的模型贴图,因为它能够自定义UVW坐标的位置,所以它能够把几图片都集成在一张贴图上面,这样能省下不少资源。在校园建模过程中,东园餐厅就是以这样的建模方式建立的。
虚拟校园中有许多复杂结构模型。如果模型数据库中多边形数目超过系统的计算能力,在虚拟场景中漫游时,帧处理将无法及时完成,场景变换的平滑性会受到破坏。
为了提高运行系统的实时性,必须对模型进行简化处理,以减少数据库的多边形开销。我从下面几个方面对模型进行了简化:
(1)使用多细节层次(LevelsofDetail,LOD)表达复杂结构模型。虚拟校园中有许多复杂模型必须用LOD来表达,以使运行系统中的多边形数控制在预算之内,有利于提高运行系统的实时性。
(2)用纹理代替多边形表达结构细节。纹理映射能够在不增加多边形数目的前提下提高场景表达的详实程度。
(3)移除多边形的背面。虚拟校园环境中组成绝大多数模型的多边形都是单面可见,3dsMax能自动剔除多边形的背面而仅显示其前面。
通过一系列优化处理,得到建筑3D模型如图9所示。
图93dsMax模型
文中实现的三维漫游导航引擎主要具备以下功能:
(1)能对整个校园模型进行全局俯视以及任意视角的观察,以便让用户更加全面的了解校园每一处的地理信息;
(2)能够让用户自定义选择所需要加载的三维模型,以便适应显卡配置较低的用户,通过读写XML文件来保存用户的配置信息;
(3)能够设置不同的分辨率,以满足用户的需求;
(4)采用弗洛伊德(Floyd)算法计算校园每两个景点的最短路径,实现校园景点之间的智能导航功能;
(5)在导航模式中,实现小地图标示位置的功能;
(6)实现用户控制摄影机的移动功能,并且能控制移动的速度;
(7)实现三维漫游场景的音乐导入,使三维校园程序效果更加丰富;
(8)实现光照效果,使得场景模型更加富有层次感。
层级在三维电子地图执行的各个阶段中,包含了这个阶段所特有的元素和逻辑的对象。本引擎一共使用了四个层级:菜单层级、Loading层级、设置层级和主程序层级。每个层级往往有自己特定的更新和渲染函数。
在整个程序中,主要创建了以下几个层级:
图10层级的继承关系
在三维校园地图引擎中,需要导入由3dsMax创建的模型,而这些模型都是在创建以后导出为*.X文件格式,这种格式的文件是能够支持DirectX的模型文件,它记录了模型的所有顶点位置、贴图的纹理路径以及模型在世界坐标系中的坐标等信息。引擎中包含的MeshLoader类用于加载使用3dsMax导出的*.X模型文件,它将X文件中的模型数据抽取出来,为3D程序渲染物体提供所需要的资源。
为了丰富三维校园程序,在程序运行时,会加入背景音乐,以更好的渲染出环境的气氛;而加载音乐是通过Music.cs文件中的Music类来实现。该类包含了音乐的加载、播放、停止和暂停的控制函数,用于实现背景音乐的播放功能。
智能导航在三维电子地图程序中是难点部分,它将自动的寻找出用户所需到达的目的地的最短路径,并且进行跟踪导航。为了实现最短路径的搜索功能,本引擎采取基于结点的最短路径算法——弗洛伊德(Floyd)算法。
Floyd算法核心代码如下所示:
三维校园电子地图的场景中,除了有地形和建筑物还需要有周围天空环境的烘托,这样才能使得三维环境更加的真实。本系统采用的是天空盒技术制作场景的环境,天空盒是一个长方体,它是由六个面构成一个天空盒,贴上云彩和山水图片,就可以实现一个矩形面的天空。天空盒是由六张无逢贴图实现的一个盒子模型体,本系统使用的环境贴图如图11所示,1:顶面、2:左侧面、3:背面、4:右侧面、5:正面、6:底面。
图11天空盒贴图
在3dsMax里面,给天空盒模型贴图时要注意的是贴图贴在长方体的内,所以建立模型时要将长方体的六个面进行一次flip操作,使得图片贴在盒子的内部。建立好天空盒模型以后,同样是导出X文件,在程序中,创建天空盒必须得使用SkyObj类来实例化天空模型对象,因为天空环境跟普通模型不一样,它永远是跟随着摄像机移动的,但是它不会随着摄像机的旋转而转动。所以在场景中,摄影机永远无法移动到天空尽头,这样就能创建出一个无边界的广阔环境。
在渲染天空的时候,不能像普通模型那样去渲染天空,因为场景中添加了光照,直接渲染的话,会出现明显的边界线,对比图如图12所示。因此,在渲染天空模型的时候必须关闭光照,待渲染完毕以后,再将灯光开启。渲染时,还需要开启贴图的延展模式,否则在天空盒的接缝处同样会出现边沿线。天空盒的渲染代码如下:
(a)有光照渲染(b)无光照渲染
图12有无光照渲染天空的对比
3效果
三维校园电子地图采用桂林电子科技大学东区校园为实例,建立了三维校园电子地图智能导航程序。该程序实现了桂林电子科技大学的(东区)的三维校园电子地图的功能。除此之外,在可视化的基础上实现了一些虚拟现实的交互操作和空间分析,如:校园景物的查看、校园路径导航、三维动态漫游校园等。本程序建立的实体模型比例精确、仿真度高、三维效果逼真场景、场景内容丰富;给需要了解桂林电子科技大学校园用户提供了极大的便利。系统运行效果如图13所示。
图13系统运行效果
4结论
本文从从整个三维校园电子地图项目的设计总体流程,程序结构框架,主要功能模块的设计等几个方面详细介绍了整个项目的开发流程以及核心功能的实现。
在三维校园电子地图程序中,引入DirectX3D技术,使得程序执行效率大副提升,操作更加简单,三维场景内容更加丰富,整体效果更加完美。最终实现了仿真度极高、兼备智能导航和虚拟漫游功能的三维校园电子地图系统。
Postscript:
看到这么多博友的留言我很开心。很多博友提出把安装文件放上来,其实我很想把程序的安装包上传上来,只是无奈程序的安装文件过大,无法上传到这里,我正在想别的方式上传。
还有就是源代码的问题,由于这个程序是给学校做的,所以三维地图程序的源码也不好公开,请谅解;
现在ManagedDirectX已经被XNA替代,如果还有朋友想去学ManagedDirectX可以去看看BeginningC#GameProgramming和ManagedDirectX_SamsKickStart-GraphicsAndGameProgramming这两本书,还有学习微软官方的游戏开发教程,有了这些知识开发这个程序不成问题。
开发DirectX的3D程序我还是比较推荐用C++开发的,Introductionto3DGameProgrammingwithDirectX9.0是一本入门级的好书,非常简单易学,网上都可以下载到电子版。