虚拟城市开发
长期以来,城市规划人员的一个重要的工作就是进行各种设计或规划图的绘制,但是这些图纸并不能给
人们提供一个直观的、富有真实感的场景。后来,人们虽然也使用纸板或木料来制作三维模型,以实现
城市景观的三维可视化。但其制作的工作量巨大、费用昂贵、须具备较高的制作技巧,而且仅能从外围
观看,无法进入,修改也很困难。鉴于以上原因,在计算机上建立三维虚拟城市成为必然。虚拟城市的
建立能够全方位地、直观地给人们提供有关城市的各种具有真实感的场景信息,并可以以第一人称的身
份进入城市,感受到与实地观察相似的真实感。虚拟城市的各种模型易于修改,而且可以实现城市信息
的查询与分析功能。这些都是传统的方法所无法比拟的。本文用制作实例的方式探讨了虚拟城市的开发
技术。
1.虚拟城市开发的基本原理
要建立虚拟城市,首先要建立三维城市模型。三维城市空间中的典型实体对象一般具有以下几种:城市
中的各种建筑物、街道、绿地、公共场所、城市地形、树木等。除此以外,还有一些辅助性的设施,如
消防栓、变电站、喷泉、公园的长椅等。这些模型的制作可以采用编程的方法或者现有的三维模型制作
软件来完成。所谓编程的方法是在程序中利用三维空间中的坐标点和图形绘制函数来实现模型的建立,
由于城市模型的造型十分复杂,因而很难确定模型的具体几何数据,此方法多用来制作地形模型,对于
其他模型的制作则很少采用。制作城市模型的最好的方法是使用现有的成熟的三维设计软件,如:
3dsmax、truespace等。
虚拟城市除了能实现城市信息的三维可视化外,其另一个重要的功能就是能实现城市专题信息的查询功
能,甚至实现一定的分析功能。可以将虚拟城市定义为以下公式:
虚拟城市=三维城市模型+专题信息+查询功能+分析功能
要实现一个虚拟城市系统可考虑以下两种方案:
一种方案是利用高级语言和三维图形开发库的方法,常用的开发语言是 c++,常用的图形开发库是
opengl3d或者 directx3d。此方法的特点是开发的灵活性强、能实现功能复杂的应用系统。其缺点是开
发者须熟练掌握编程技术,并且具备较高的计算机图形学知识。另外,还要学习 opengl3d或者
directx3d的复杂开发技术。此方案的实现难度大,一般用户根本无法胜任。其实现的应用系统也很难
满足网上使用的要求。
第二种方案是使用专用的三维虚拟开发工具,目前广泛使用的是 vrml语言。vrml(虚拟现实造型语
言)是一种描述交互式三维世界和对象的文件格式。vrml允许描述对象并把对象组合到虚拟场景中,
可以实现仿真系统,可模拟动画、具有动力学特性的物体。vrml能构造一个全交互的世界,其中的对
象能对外部事件做出响应,并可在其中任意穿行。另外,其重要特性是支持虚拟场景的网上发布,并可
实现多用户的实时参与。vrml比高级语言容易掌握,并且无须再去了解 opengl3d或者 directx3d之类
的三维图形开发库,这对于普通用户来说无疑是一个福音。若配以 java程序的支持,也可实现功能较
强大的系统。
综合以上两种方法,对于功能不太复杂的应用,采用后一种方法较为合适。下面我们将就后一种方案详
细介绍虚拟城市开发的技术细节。
2.虚拟城市的开发技术
2.1.三维城市模型的建立
虚拟场景的建立和建筑 cad中的场景的建立有着很大的区别,它首先强调的是模型的简单化,这是由虚
拟现实的实时性要求决定的。在响应速度和场景的真实性发生冲突时,应牺牲一定的真实性,只要能在
视觉上达到基本真实即可。因此,常用一些简单的框架来代替复杂模型,但为了保证一定的真实性,可
采用贴图的方式来弥补视觉上的不足。贴图有以下两种制作方法:一种是使用绘画软件进行手工绘制、
另一种是对建筑物的各个观察面进行拍照,然后用扫描仪扫描成相关贴图材质。第一种方法的颜色可限
定在 256色内,其压缩的比例较大,贴图文件较小,生成的场景文件也较小,适合网上传递和实时性的
要求。后一种方法视觉效果好,但文件的压缩比例较小,贴图文件较大,生成的场景大,在网上传递和
实时性方面不如前一种方法好。无论用哪一种方法都需考虑贴图的分辨率和尺寸,为了便于下载和渲
染,在质量和大小允许的情况下,一幅贴图限为 320*240(或 240*320)像素、分辨率为 72dpi,用
jpeg压缩(采用最高压缩比)后约为 20k字节。
根据以上所述的贴图制作方法,虚拟场景中的对象模型可分为以下几类:
(a)由简单几何体组成的简单模型:该类模型常用作远处建筑物的替身,在 lod方法中采用;
(b)赋予手绘贴图的模型;
(c)赋予照片材质的模型;
(d)赋予手绘和照片混合材质的模型;
(e)具有全部细节的精致模型;
2.1.虚拟城市交互查询功能的建立
为虚拟城市模型加入交互和查询功能可采用两种方法:通过编程加入相应的交互和查询功能、利用
vrml的辅助工具来完成交互和查询功能的加入。后一种方法比较适合普通的用户。
kinetix制作了特殊的 vrml输出嵌入程序,可以输出场景,包括几何、材质、动画制作等,嵌入程序
也可制作特殊的 vrml辅助工具来规定场景的交互元素。运行 vrml嵌入程序 即可安装
vrml嵌入程序。
通过 vrml嵌入程序,可设置以下辅助工具:
anchor:可将某一实体作为热点,当被点击时,取出网上所指定的文件。若为 vrml场景文件,则该场景
被下载显示。若为其他类型文件,由浏览器决定如何处理;
touchsensor:对从指定设备的输入产生相应的事件,这些事件表示用户是否指向特定几何体,同时也表
示用户何时何处按下定位设备的按钮;
proxsensor:接近感知器,指定当用户进入、离开或在立方体的区域内移动时产生的事件;
timesensor:在时间变化是发出事件,可用来控制动画,也可用于某一时刻进行某项活动,或于某一时
间间隔中产生事件;
navinfo:描述有关观察者和观察模式的物理特性;
background:设定场景的背景;
fog:设置雾化的效果;
sound:设定声音片段的有效范围,以产生随距离改变的音响效果;
billboard:是某一对象随用户一起旋转,以使之始终面向用户;
lod:允许浏览器在物体表示的不同层次细节间自动切换;
inline:可在文件中引入外部文件的场景,避免重复制作。
通过以上辅助工具,就可制作出虚拟城市场景及其交互和查询功能。
2.3.若干开发技巧介绍
减少文件大小的方法
(1)使用实例:对于在场景中多次使用的对象,可在该对象首次使用时用 def给物体命名,以后仅需通
过名字即可引用该物体。
(2)使用原型:原型物体是指那些使用频繁且改动不大的物体。使用它可减少文件的大小。由于使用了
def/use方法,物体一旦定义,只要指定发生变化的公共接口即可。另外,原型显示出场景层次中哪一
部分可修改,浏览器可自由地优化那些不修改的部分。
(3)压缩文件:在发布文件前,使用 gzip工具压缩 vrml文件和相关的 html文件,大约可是文件减小
10~100倍。
提高渲染速度的技巧
(1)简化场景:简化场景有以下方法:
・减少多边形的数目,这可极大地提高执行的性能;
・使用纹理代替多边形造型,既可美化场景又可提高性能;
・使用灰度图的纹理;
・尽量少用光源,这将有效地提高渲染的速度;
・使用布告板节点,此节点允许在场景中使用二维图象来模拟三维造型并旋转,从而始终面对观察者。
此法既减小了文件又不影响真实效果,可用来制作树木、电线杆、路牌、消防栓等辅助性对象;
(2)场景分割:将大的场景分为多个相对独立的小场景,通过 anchor节点为场景中逻辑上分离的部分建
立连接关系;
(3)自适应 lod节点:若在 lod的 range域中未明确指定具体值,浏览器会在给定时刻决定哪一层物体
需要显示。该节点允许根据硬件平台的能力调整场景的细节程度。在建立一条街道时,由于街道两边有
许多精细的建筑物,要对它们进行实时渲染是不可能的,但又不能不可见,仅需让用户能以一定的速度
前进即可。在此,可为每个建筑物建立两个 lod节点,一个是没有明确范围的外部 lod,另一个是具有
near和 far范围的内部 lod节点。内部节点能按建筑物与摄像机的距离调整层次,外部"自适应 lod"节
点允许浏览器调整必要的多个建筑物以赶上场景的动态变化。
(4)碰撞检测要花费大量的处理时间,为提高对复杂物体的碰撞检测速度,可在 collision节点的
proxy(替身)域指定某一更为简单的几何体作为该形体的替身,它与被替代的原形体占用大致相同的
空间。这样,可大大减少检测时间。
3.结束语
以上介绍了虚拟城市的基本原理和制作技巧,对于进行其他领域的虚拟现实应用制作同样有效,仅为场
景中实体的不同。用 vrml制作虚拟现实入门容易,但要达到很高的视觉效果和运行速度并非易事,须
对 vrml和图形学进行深入了解才可胜任。我们用它制作了虚拟校园,其运行效果较为满意。可以相
信,随着 vrml的不断发展,我们将可用它制作出功能更加强大的虚拟现实应用。