三维校园电子地图设计
三维校园电子地图是我在大学的时候为学校设计三维校园导航系统,采用C#语言和Managed DirectX 2.0技术开发的三维地图引擎。可是就目前来看,微软并不打算进一步对Managed DirectX发展,取而代之的则是XNA(微软力推的游戏开发平台,多用于开发XBOX的游戏),同时也在进一步的拓展DirectX(C++)的功能。本着C#语言的强大性和简易性,我相信在不久的将来XNA开发队伍会越来越壮大。目前我是踏着C++和C#双向路线来学习和研究DirectX的相关技术。
在学校开发三维校园电子地图引擎的时候我把大量的时间花在了校园地理数据采集、模型设计和地图引擎框架设计方面,所以在三维校园电子地图引擎中并没有很深入的运用到DirectX三维图形编程技术,在Terrain方面也做得不够好,但是它重点在于功能和运用方面的开发,以达到一个智能化三维电子地图的平台。从实现的效果上来看我还是非常满意的,而且当时作品还获得了毕业设计全校第一名,稍微自豪一下 :)。我打算用DirectX技术把三维电子地图引擎用C++重写一遍,在其中加入地形、平截头体选择、场景管理、智能摄像机、碰撞检测、骨骼动画、模型层次细节优化等技术,使得地图引擎更加逼真完美。
以下是三维电子地图引擎设计的介绍,主要把整个三维电子地图引擎的创建过程描述了一遍,并没有对程序代码进行详述;它着重于三维地图的设计方法的介绍,对于开发制作三维地图系统还是很有参考价值的。
(Ps:若要转载请注明出处)
三维校园电子地图
Arky
摘 要:三维校园电子地图是基于Managed DirectX的相关技术开发的三维校园地图导航系统。系统对校园实景进行仿真建模,将学校的各种地理信息都收集、整理、归纳,然后按照学校建筑的地理坐标建立完整的三维模型,它为校园规划建设、游客观光导航、学校对外宣传等方面提供了一个智能化的平台,为广大系统用户提供了极大的便利。本系统还通过对校区真实场景转换到三维虚拟场景的引擎构建,实现三维校园的虚拟漫游和智能导航功能。
关键词:三维建模;三维校园;地图引擎;DirectX
3D Campus Electronic Map
Arky
Abstract: 3D campus electronic map is a navigational system developed base on Managed DirectX SDK. With simulative modeling, the system collectively includes various geographical information of the campus such as coordinates and landscape, then it can build the full 3D models according the coordinates of the campus' building,it an offer an intelligent platform to planning the construction of the campus, helping the visitor, and propagandizing the school, it gives lots of convenience to all the system users. The system also by using really images of the campus to construct the 3D simulation environment in order to present the 3D virtual navigation system in the electronic map.
Key words: 3D Modeling;3D Campus;Map Engine;DirectX
1 引言
近几年来,随着计算机技术,特别是计算机图形学、三维仿真技术以及虚拟现实技术的飞速发展,传统的二维电子地图被注入了新的活力,三维电子地图正成为电子地图发展的一个重要方向。传统的二维电子地图只能以图形和符号的方式来描述一张地图,这种方式往往不能直观清晰的表示出目标所处位置的地理环境;采用三维电子地图的方式,通过建立场景的仿真模型,把现实场景进行虚拟再现,则具有真实、互动、身临其境的特点,这也是虚拟现实技术独特的魅力所在。
如何设计一个仿真度高,并且具备虚拟漫游和智能导航的三维地图引擎,成为三维电子地图研究领域的一个热点问题。本文研究的设计的三维电子地图引擎系统,设计了模型动态加载接口,并具备智能导航和虚拟漫游引擎,实现了三维校园仿真电子地图。因此,开展虚拟校园三维地图仿真引擎系统及相关课题的研究适应了信息社会发展的趋势,同时也具有重大的理论价值和现实意义。
2 三维地图引擎设计
2.1 系统总体设计
构建三维校园电子地图引擎需要按照以下几个关键步骤来进行开发:
(1) 数据采集:获取校园的相关建筑数据以及地理环境信息;
(2) 平面图制作:从获取的相关数据中提取有用信息,建立校园二维平面图;
(3) 三维模型建立:建立校园场景中的建筑模型、场景小品模型、天空环境模型和地形模型等;
(4) 三维引擎构建:使用程序来实现模型导入、三维场景的漫游、导航功能。
系统总体设计框架如图1所示。
图1 系统总体设计框架
三维校园电子地图漫游导航引擎作为该系统的核心部分,它主要实现的目标是:实现将3ds Max建立的模型导入引擎,把所有模型组合成一个校园整体,导入音乐,加载天空、地形以及环境小品等对象,构建成一个集音乐与用户交互的三维校园互动系统。
2.2 数据的采集
校园建筑的模型比例数据、贴图数据、布局位置全部是通过实地取材得来,由于学校东区面积比较大,建筑复杂多样,所以使用数码相机在校园各景点获取数码照片作为参照数据是最方便快捷的方式。在校区内采集数码照片近2000张,将校园所有景观囊括在内,力争最大限度的呈现真实校园。建筑轮廓基本是从高层楼顶拍摄,然后通过照片的对比和组合得到建筑的实际外形和轮廓数据,通过互联网的Google卫星图获取建筑之间的比例数据以及平面布局数据,通过照片的剪切获取景物的纹理贴图数据。
2.3 平面图制作
校园二维平面图的制作在三维校园电子地图的开发过程中是相当重要的一个环节,二维平面图制作的好坏直接影响到三维立体图的效果。因为三维地图的建模是完全基于二维平面图而建立的,如果二维平面图的比例不正确,就不可能制作出精确的三维地图。制作二维平面图图的另外一个作用就是生成导航引擎程序的小地图导航地图功能。由此可见二维平面图的制作对整个三维地图的准确性具有重要的意义。
为了增强二维平面图的比例和相关建筑位置的精确度,本文采用了Google卫星照片来做底图作为二维平面图的绘制参考,然后使用AutoCAD绘制地图轮廓,从而达到精确绘制平面图的目的。本校的Google卫星图与CAD平面图如图2所示。
(a) Google卫星图 (b) CAD平面图
图2 Google卫星图与CAD平面图
2.3.1底图的制作
底图是通过Google卫星照片拼接而成,首先在电脑上安装Google_Earth_BZXV.exe。在搜索框中输入桂林电子科技大学的位置:25°17'5.05"N,110°19'53.89"E以获取校园的卫星照片。为了得到清晰的底图,获取图片是采取分次获取,然后使用Photoshop合并成一张完整的桂电东区校园底图。
2.3.2建筑平面框图
获得了校园的平面底图GuetMap.jpg以后,将它导入进AutoCAD作为外部参照的地图,用CAD的直线和曲线绘制工具按照底图建筑的轮廓绘制出外形,然后使用延伸和裁减工具将模型修整完整。
为了使得建筑轮廓与其他物体区分开,在绘制建筑轮廓是单独创建一个building图层,用于绘制建筑,设定线条颜色为黄色。
2.3.3运动场平面框图
绘制运动场平面框图的方法跟绘制建筑平面图一样,新建一个ground图层,以卫星照片为底图绘制出所有运动场的边框,然后再绘制出场地边界线。
2.3.4道路平面框图
根据卫星图的路径显示,在绘制校园道路是创建了一个以背景线条色为蓝色的path图层,专门用于绘制道路。将所有的元素绘制完成后,就得到一张CAD导出平面图guet.dwg文件。该文件的最终效果如图3所示:
图3 校园平面图
有了这张平面地图,就能够使用3ds Max导入*.dwg文件作为底图参照,然后绘制出等比例的校园3D模型。
2.4 三维模型建立
在三维校园电子地图程序建设中最为烦琐的就是虚拟环境的建模问题。三维场景的建模在整个环节中工作量最大、需要投入大量的时间与精力去完成。本系统所有的三维模型全部都是使用3ds Max 建立完成。在建模过程中,应该依据不同的事物区别对待。在一般的游戏场景中,大多数模型全部都是以低模的形式存在,本三维校园电子地图程序同样是要导入程序进行交互的,所以采取的最佳建模方式就是使用多边型建模方式来建立校园模型。模型贴图根据模型的情况采用UnwrapUVW方式和UVW maping方式进行贴图。
校园虚拟环境建模具体实施起来,可以按以下几个方面来进行:
(1) 建筑模型
由于在学校的大多数建筑物,一般都是由正方体的形状构成,因此使用多边形来建立模型是最适合的。在建立模型之前首先观察建筑的形态,再建立出大概的轮廓,最后再使用多边形的修改命令来完善模型。在建筑物上会有许多凸起部分,本系统不能全部使用模型来实现它,使用贴图效果来充当凸起部分的面是三维程序惯用的手法,这样也能是一个平面看起来更加富有立体感。下面就以学校的图书馆为例子,介绍三维模型的建立过程。
1 首先打开3ds Max导入先前已经完成的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) 环境小品模型
在虚拟系统中,最常用的模型当数各种环境小品了。例如树木、电话亭、垃圾箱、车辆、路灯等等都有一些共同的特点,重复性高。在实时虚拟系统中,它们应该使用尽可能少的面,获得尽可能少的面的方法是在建立模型时使用合适的方式,当把贴图赋给实时模型时,也应该使用最少的面。所以这类模型在建立时主要用二维的模型结合透明贴图来创造出三维的模型效果,即用贴图来代替细节模型。
2.5材质与贴图的处理
建立模型之后的工作就是给模型赋予材质和贴图。在3ds Max中材质就是模型的灵魂,一个好的材质会使模型有生气。3ds Max中最简单的是Bitmap贴图。除此之外还有多种贴图形式。在三维校园图的制作中,位图是较为常用的一种二维贴图。在三维场景制作中大部分模型的表面贴图都需要与现实中的实体相吻合,而这一点通过其它程序贴图是很难实现的,也许通过一些程序贴图可以模拟出一些纹理,但这也与真实的纹理有一定差距。所以选择以数码相机拍摄手段获取的位图作为校园立体图对象的贴图。
制作过程如下:
从实地拍摄的数码相片中选取合适角度的照片在Photoshop中进行拉伸扭曲得到所需贴图单元,保存为JPG格式。在3ds Max中,调用经过处理过的图片进行贴图,初步贴上的图在建筑物上是很不规则的,所以需要运用修改工具中的UVW贴图坐标。贴上实地采集的相片使得所得图像与实际建筑物很接近如图。
对于材质中的二维贴图,物体就必须具有贴图坐标。这个坐标就是确定二维的贴图以何种方式映射在物体上。它不同于场景中的XYZ坐标系,而是使用的UV 或UVW坐标系。
因为学校模型大多数建筑都是呈矩形,因此使用box与planar两种方式比较常用,比如说体育场馆的墙面就是用box方式来贴图的,在使用box与planar通常是用在重复的无缝贴图上面,比如说三教的窗口,就是使用一层楼的窗口重复贴图而完成整栋楼的窗口的。而Cylindrical贴图方式则常用在圆柱面的贴图上,比如说水池的贴图就是使用Cylindrical贴图方式来实现的。如图8所示。
(a) box贴图方式 (b)Cylindrical贴图方式
图8 模型贴图
UnwrapUVW贴图
使用UnwrapUVW贴图方式一般用于较复杂的模型贴图,因为它能够自定义UVW坐标的位置,所以它能够把几图片都集成在一张贴图上面,这样能省下不少资源。在校园建模过程中,东园餐厅就是以这样的建模方式建立的。
2.6建模优化处理
虚拟校园中有许多复杂结构模型。如果模型数据库中多边形数目超过系统的计算能力,在虚拟场景中漫游时,帧处理将无法及时完成,场景变换的平滑性会受到破坏。
为了提高运行系统的实时性,必须对模型进行简化处理,以减少数据库的多边形开销。我从下面几个方面对模型进行了简化:
(1) 使用多细节层次(Levels of Detail, LOD)表达复杂结构模型。虚拟校园中有许多复杂模型必须用LOD来表达,以使运行系统中的多边形数控制在预算之内,有利于提高运行系统的实时性。
(2) 用纹理代替多边形表达结构细节。 纹理映射能够在不增加多边形数目的前提下提高场景表达的详实程度。
(3) 移除多边形的背面。虚拟校园环境中组成绝大多数模型的多边形都是单面可见,3dsMax能自动剔除多边形的背面而仅显示其前面。
通过一系列优化处理,得到建筑3D模型如图9所示。
图9 3ds Max模型
2.7 三维引擎的构建
三维校园电子地图引擎提供了动态三维模型加载的技术,为迅速构建一个新的三维地图场景提供了相关接口。该引擎还为用户提供了三种漫游模式:环绕观光模式、智能导航模式和自由视角模式;除此以外,三维地图引擎还应用了光照技术、天空盒技术、多纹理贴图等DirectX3D的相关技术,为三维场景添加了光照、环境效果、音乐等元素,使得三维引擎渲染的场景效果更加丰富、逼真。
2.7.1三维引擎功能
文中实现的三维漫游导航引擎主要具备以下功能:
(1) 能对整个校园模型进行全局俯视以及任意视角的观察,以便让用户更加全面的了解校园每一处的地理信息;
(2) 能够让用户自定义选择所需要加载的三维模型,以便适应显卡配置较低的用户,通过读写XML文件来保存用户的配置信息;
(3) 能够设置不同的分辨率,以满足用户的需求;
(4) 采用弗洛伊德(Floyd)算法计算校园每两个景点的最短路径,实现校园景点之间的智能导航功能;
(5) 在导航模式中,实现小地图标示位置的功能;
(6) 实现用户控制摄影机的移动功能,并且能控制移动的速度;
(7) 实现三维漫游场景的音乐导入,使三维校园程序效果更加丰富;
(8) 实现光照效果,使得场景模型更加富有层次感。
2.7.2引擎的层级
层级在三维电子地图执行的各个阶段中,包含了这个阶段所特有的元素和逻辑的对象。本引擎一共使用了四个层级:菜单层级、Loading层级、设置层级和主程序层级。每个层级往往有自己特定的更新和渲染函数。
在整个程序中,主要创建了以下几个层级:
图10 层级的继承关系
2.7.3引擎的模型读取
在三维校园地图引擎中,需要导入由3ds Max创建的模型,而这些模型都是在创建以后导出为*.X文件格式,这种格式的文件是能够支持DirectX的模型文件,它记录了模型的所有顶点位置、贴图的纹理路径以及模型在世界坐标系中的坐标等信息。引擎中包含的MeshLoader类用于加载使用3ds Max导出的*.X模型文件,它将X文件中的模型数据抽取出来,为3D程序渲染物体提供所需要的资源。
2.7.4引擎的音乐
为了丰富三维校园程序,在程序运行时,会加入背景音乐,以更好的渲染出环境的气氛;而加载音乐是通过Music.cs文件中的Music类来实现。该类包含了音乐的加载、播放、停止和暂停的控制函数,用于实现背景音乐的播放功能。
2.7.5 智能导航设计
智能导航在三维电子地图程序中是难点部分,它将自动的寻找出用户所需到达的目的地的最短路径,并且进行跟踪导航。为了实现最短路径的搜索功能,本引擎采取基于结点的最短路径算法——弗洛伊德(Floyd)算法。
Floyd算法是通过邻接矩阵来实现的,因此首先要给每个景点排序,按照校园建筑的分布与坐标,将校园定义了149个结点。然后使用相关的函数求出每两个点之间的距离后,就能使用Floyd算法求出最短路径的结点序列。
Floyd算法核心代码如下所示:
2 {
3 for (w = 0; w < X; w++)
4 {
5 g[v, w] = cost[v, w];
6 for (u = 0; u < X; u++)
7 {
8 p[v, w, u] = false;
9 if (g[v, w] < INFINITY)
10 p[v, w, w] = true; p[v, w, v] = true;
11 }
12 }
13 }
14 for (u = 0; u < X; u++)
15 {
16 for (v = 0; v < X; v++)
17 {
18 for (w = 0; w < X; w++)
19 {
20 if (g[v, u] + g[u, w] < g[v, w])
21 {
22 g[v, w] = g[v, u] + g[u, w];
23 for (i = 0; i < X; i++)
24 p[v, w, i] = p[v, u, i] || p[u, w, i];
25 }
26 }
27 }
28 }
三维校园电子地图的场景中,除了有地形和建筑物还需要有周围天空环境的烘托,这样才能使得三维环境更加的真实。本系统采用的是天空盒技术制作场景的环境,天空盒是一个长方体,它是由六个面构成一个天空盒,贴上云彩和山水图片,就可以实现一个矩形面的天空。天空盒是由六张无逢贴图实现的一个盒子模型体,本系统使用的环境贴图如图11所示,1:顶面、2:左侧面、3:背面、4:右侧面、5:正面、6:底面。
图11 天空盒贴图
在3ds Max里面,给天空盒模型贴图时要注意的是贴图贴在长方体的内,所以建立模型时要将长方体的六个面进行一次flip操作,使得图片贴在盒子的内部。建立好天空盒模型以后,同样是导出X文件,在程序中,创建天空盒必须得使用SkyObj类来实例化天空模型对象,因为天空环境跟普通模型不一样,它永远是跟随着摄像机移动的,但是它不会随着摄像机的旋转而转动。所以在场景中,摄影机永远无法移动到天空尽头,这样就能创建出一个无边界的广阔环境。
在渲染天空的时候,不能像普通模型那样去渲染天空,因为场景中添加了光照,直接渲染的话,会出现明显的边界线,对比图如图12所示。因此,在渲染天空模型的时候必须关闭光照,待渲染完毕以后,再将灯光开启。渲染时,还需要开启贴图的延展模式,否则在天空盒的接缝处同样会出现边沿线。天空盒的渲染代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
(a) 有光照渲染 (b) 无光照渲染
图12 有无光照渲染天空的对比
3 效果
三维校园电子地图采用桂林电子科技大学东区校园为实例,建立了三维校园电子地图智能导航程序。该程序实现了桂林电子科技大学的(东区)的三维校园电子地图的功能。除此之外,在可视化的基础上实现了一些虚拟现实的交互操作和空间分析,如:校园景物的查看、校园路径导航、三维动态漫游校园等。本程序建立的实体模型比例精确、仿真度高、三维效果逼真场景、场景内容丰富;给需要了解桂林电子科技大学校园用户提供了极大的便利。系统运行效果如图13所示。
图13 系统运行效果
4 结论
本文从从整个三维校园电子地图项目的设计总体流程,程序结构框架,主要功能模块的设计等几个方面详细介绍了整个项目的开发流程以及核心功能的实现。
在三维校园电子地图程序中,引入DirectX3D技术,使得程序执行效率大副提升,操作更加简单,三维场景内容更加丰富,整体效果更加完美。最终实现了仿真度极高、兼备智能导航和虚拟漫游功能的三维校园电子地图系统。
总体来说,我在这次毕业设计中,又学到了很多新知识。特别是电脑艺术设计方面,掌握了不少设计软件在软件项目开发过程中的应用。特别是像开发这种集虚拟仿真技术与程序开发于一体的综合项目,让我体会到作为一个程序员,光是会编写程序代码是远远不能满足现代项目开发的需求的。我们除了编程,还须学习相关方面的艺术设计知识,掌握各种设计软件(如:Photoshop、3ds Max、AutoCAD等)在程序设计中的使用。这样,我们才有能力开发出既美观而又实用的综合性大型软件。
Postscript:
看到这么多博友的留言我很开心。很多博友提出把安装文件放上来,其实我很想把程序的安装包上传上来,只是无奈程序的安装文件过大,无法上传到这里,我正在想别的方式上传。
还有就是源代码的问题,由于这个程序是给学校做的,所以三维地图程序的源码也不好公开,请谅解;
还有朋友说想了解程序代码部分,如果大家感兴趣,我可以根据需求,将特定的功能点的代码整理出来跟大家分享;但这也需要时间,最近的工作似乎又开始忙碌起来了:( ...... 一旦有时间我还会继续更新我的博客,写些程序方面的实现。
现在Managed DirectX已经被XNA替代,如果还有朋友想去学Managed DirectX可以去看看Beginning C# Game Programming和Managed DirectX_Sams Kick Start - Graphics And Game Programming这两本书,还有学习微软官方的游戏开发教程,有了这些知识开发这个程序不成问题。
开发DirectX的3D程序我还是比较推荐用C++开发的,Introduction to 3D Game Programming with DirectX 9.0是一本入门级的好书,非常简单易学,网上都可以下载到电子版。