0 引 言
随着现代城市的不断拓展延伸,城市空间多层次、立体模式管理逐渐成为城市规划管理的发展趋势[1],实现城市空间信息管理模式从二维到三维的转变,三维虚拟城市技术,已经成为人们关注和研究的热点[2]。
三维虚拟系统具有多维信息处理、表达和分析的特点,在空间信息的社会化服务中,三维虚拟城市的应用有着越来越明显的优越性和不可替代性[3]。
文中采用了一种新的模式进行三维虚拟城市的设计,采用三维算法初步建模,Photoshop 进行贴图加工,3DMAX 进行图形的渲染,三维引擎 Unity3D 技术实现三维虚拟城市。 该方式制作过程简洁,三维引擎技术编程难度低,能高效率、高质量完成三维虚拟城市的建设。 整个建设过程包括地理信息数据采集、三维算法建模、3DMAX 后期渲染以及三维引擎技术编程[4]。
    1 三维虚拟城市实现设计
首先,获取地理信息数据。 包括数字高程数据、建筑物类型(如草地、水域、道路等)的矢量数据、数字遥感影像图数据以及地理坐标等[5]。
其次,使用三维建模算法,生成三维数字模型,包括不规则三角网 TIN(顾及地性线)、规则格网 DEM等[6。
第三,进行精细处理,包括建筑物点投影变换和裁剪处理、光照模型选择、建筑物要素叠加、点坐标变换、消隐与纹理映射等[7]。
第四,三维模型制作,使用 3DMAX 和 Photoshop工具,对粗糙模型进行加工和渲染,得到高逼真的三维模型。
最后,三维模型的导入,将三维模型根据地理坐标依次导入到 Unity3D 中,进行虚拟技术的开发。具体系统实现设计如图 1 所示。
图 1 系统实现结构图
    2 数据采集与处理
数据的收集与处理,主要包括基础数据准备、实地采集和后期处理。
基础数据准备主要是收集整理乐山某区域的1: 2000 地形图和高程点,以及最新的航空影像。 通过地形图与影像图的对比和实地考察,划分区域分布图和编号图,用于指导实地数据采集和三维模型建设[8]。
区域分布图分为基础模型、标准模型和精细模型三个级别,编号图主要是依据道路和景点的分布划分编号,作为模型和纹理命名的依据。需要对前期准备和实地采集的数据进行处理[9],如照片的整理、纹理的收集、属性的汇编,然后建立分片景区照片库、通用纹理库、属性记录表等。 例如树的采集,按照树的种类建立照片库,对照片进行处理后,按照树的种类建立通用纹理库[10]。
地形模型建模采用高精度数字高程模型( DEM)和高分辫率数字正射影像(DOM),制作高精度地形模型[11]。 根据划定的建模范围,将 DEM 裁切出来,同时结合航空影像,通过 GIS 软件将 DEM 和 DOM 转换到统一坐标系,保证两者坐标一致,将 DEM 和 DOM 数据导入专业软件中,自动生成地形模型,将生成的地形模型转换为三维建模软件(如 3DSMAX)兼容的格式,进行纹理映射,生成高精度地形模型。 这种建模方式的主要特点是建模快速、高程精确、模型真实。
对于细节要求高的地形实体,如植被、景观路等,主要是根据地形图等高线、高程点以及特征点线,通过三维建模软件,可采用两种方式建模。 一是以 1: 2000 地形图和航空影像作为参考,先勾勒出整个建模范围的道路,以道路作为控制,建立每个景点或者街坊,通过点的高度来表现地形的起伏;也可通过地形图,先在 CAD 勾勒出道路、建筑或人工湖、花坛等封闭的线,参考高程点,在 CAD 调节线中点的高度,然后导入 3DSMAX 中形成面,后者更方便,更准确。 主要特点是表现细腻、色彩美观协调,能够细致表现对象变化细节。
    3 三维模型建立
模型的建立是整个虚拟系统的重要部分,因此在该过程中工作量较大,工作较繁琐。 主要实现过程:建筑物形状分析、建筑物分类和纹理贴图处理[12]。
    3. 1 建筑物形状分析
建筑模型屋顶建模难度较大,因为屋顶的形状各有不同,都是由一些简单的几何体组成,因此可总结出该区域建筑物屋顶的大体几何体模型如图 2 所示。
图2 屋顶几何模型
3. 2 三维模型分类
为了便于系统模型和场景的建立,对场景和建筑物进行了分区,在建模过程中可以方便建筑物与场景地形坐标进行对应,同时也方便多场景的集成。 具体分区如图 3 所示。

图 3 三维模型分类
    3. 3 纹理贴图处理
为了保证模型的高精度和高质量,在建模之前必须要确定各模型的材质,因此首先用相机拍摄一系列的照片来提取材质,建模过程中进行纹理贴图和实体对比[13]。 具体流程如图 4 所示。
图 4 纹理贴图处理过程
4 实现方法
本系统的业务逻辑处理用 C#、Javascript 技术实现,使用 Unity3D 引擎开发平台进行开发。 实现中最主要的技术是:场景漫游技术、物理效应仿真技术和场景切换技术[14]。

    4. 1 场景漫游技术
场景漫游技术主要包括键盘控制和鼠标控制,能让用户在虚拟城市系统中前后左右任意方向行走。 同时能控制运动的速度。 内容描述如下:

var MoveSpeed = 5;var RotateSpeed = 20;function Update (){if(Input. GetKey(KeyCode. W)){this. Translate(forward*deltaTime*MoveSpeed);}else if(Input. GetKey(KeyCode. S)){this. Translate(forward*deltaTime*-MoveSpeed);}else if(Input. GetKey(KeyCode. A)){this. Rotate(up*Time. deltaTime*-RotateSpeed);}else if(Input. GetKey(KeyCode. D)){this. Rotate(up*Time. deltaTime*RotateSpeed);}}
该段代码实现的功能就是按键盘上面的 W、S、A、D 键 能 实 现 前 后 左 右 的 移 动。 先 定 义 两 个 变 量MoveSpeed(移动速度)和 RotateSpeed(旋转速度),接下来进入函数入口 Update,如果按 W 键时程序就回运行 forward*deltaTime*MoveSpeed;也就是摄像机向前移动 MoveSpeed,因为 MoveSpeed 的初始值为 5,所以移动的速度为 5,以此类推,当按下 S 键的时候,程序运行 forward*deltaTime*-MoveSpeed,这时运动的方向为一个负值所以表现出来的就是往后退。 速度也为5;当按下 A 键时程 序运行 up * deltaTime * - RotateSpeed 此时摄像机会往左边旋转,其旋转速度为20;当按下 D 键时程序运行 up * deltaTime * RotateSpeed 此时摄像机会往右边旋转,其旋转速度为20。
    4. 2 物理效应仿真技术
本系统中物理效应仿真技术主要是实现动画场景的仿真,动画仿真技术包括水池波浪仿真、重力仿真等。 内容描述如下(对水池波浪仿真的描述):
 Vector4 waveSpeed = mat. GetVector( "WaveSpeed" );float waveScale = mat. GetFloat( " _WaveScale" );float t = Time. time / 20. 0f;Vector4 offset4 = waveSpeed * (t * waveScale);Vector4 Clamp =new Vector4(Mathf. Repeat(offset4. x,1. 0f), Mathf. Repeat( offset4. y,1. 0f), Mathf. Repeat( offset4. z,1. 0f),Mathf. Repeat(offset4. w,1. 0f));mat. SetVector( " _WaveOffset" , offsetClamped );Vector3 scale = new Vector3( 1. 0f/ waveScale, 1. 0f/ waveScale, 1 );Matrix4x4 Matrix = Matrix4x4. TRS ( new Vector3 ( Clamp. x,Clamped. y,0), Quaternion. identity, scale );mat. SetMatrix( " _WaveMatrix" , scrollMatrix );Matrix = Matrix4x4. TRS ( new Vector3 ( Clamp. z, Clamp. w,0), Quaternion. identity, scale * 0. 45f );mat. SetMatrix( " _WaveMatrix2" , scrollMatrix );
该代码调用了 Unity3D 引擎中的一些动态函数功能进行实现,Vector3、 Vector4、Matrix4x4 为 Unity3D 中提供的一些类型,用于实现实体效果。 设置水波的移动速度随着时间的变化随机变换公式 float t = Time.time / 20. 0f,通过多次实验,设置成 20,水面产生流动和波浪效果使得更生动真实。
    4. 3 场景切换技术
虚拟现实技术的主要目标之一是允许用户以尽可能自然的方式与虚拟世界物体直接交互。 若要实现自然、精确的人机交互,就必须解决碰撞等问题,相机加入碰撞能更好地解决模型的穿插问题。 本系统中采用了相机切换技术实现了多个不同场景间的切换。
内容描述如下:
var guiskin : GUISkin; / / 定义 GUIvar cam1 : Camera; / / 定义相机var cam2 : Camera;function OnGUI() { / / 调用函数 GUIGUI. skin = guiskin;if(GUI. Button(Rect(20,0,100,50)," CAM1" ," button1" )){cam1. enabled = true;cam2. enabled = false; / / 按钮事件,点击按钮进入相机一}else if ( GUI. Button ( Rect ( 120, 0, 100, 50 )," CAM2 " ,"button9" )){cam1. enabled = false;cam2. enabled = true; / / 点击按钮进入相机二}else if ( GUI. Button ( Rect ( 120, 0, 100, 50 )," CAM3 " ,"button9" )){cam1. enabled = false;cam2. enabled = true; / / 点击按钮进入相机三}
该段代码主要实现了场景切换的功能,主要利用javascript 脚本编写。 一个场景中设定两个相机这样才不显得那么单调,先建两个 button,一个 button 控制相机一,另一个控制相机二,依次类推所有场景中都要建立两个 button 和两个摄像机,一个摄像机自由浏览场景,另一个相机控制路径浏览模式。
  文章原地址:http://www.d3dweb.com/Documents/201510/20151023927847182.html

基于Unity3D平台的三维虚拟城市研究与应用相关推荐

  1. android绘制论文,基于Android平台的三维地形绘制研究与实现

    摘要: 地形是一种常见的三维场景,也是三维场景的重要组成部分,地形数据的实时绘制在PC端已经有大量研究,但如何实现移动端大规模地形的实时绘制是一个新问题.目前,移动端设备硬件性能发展迅速,但在移动端地 ...

  2. 基于Android平台的三维实时全景地图设计与实现(二)

    2 三维全景地图系统的设计实现 2.1基于百度地图API的手机地图应用开发 在使用百度地图SDK所提供的各种LBS能力之前,需要获取百度地图移动版的开发密钥,该密钥与开发者的百度账户相关联.如图2所示 ...

  3. android智能识别技术,基于Android平台的OCR识别技术研究与实现

    摘要: 随着智能手机市场的迅猛发展和普及,Android成为所占市场份额最高的手机操作系统,与此同时,人们希望在手机终端享受更丰富舒适的应用功能.将OCR和Android智能终端相结合,依托光学字符识 ...

  4. 基于体感的三维虚拟试衣

    由于最近一直在忙毕业的事,所以没有时间整理博客资料,今天把我的三维虚拟试衣的实验视频传到网上,供大家参考. http://v.youku.com/v_show/id_XNDExNjY1Njg4.htm ...

  5. 海上平台作业三维虚拟仿真

    随着海上平台设备自动化程度的逐步提升,设备故障诊断以及运营维护的难度也在逐步提升.海上平台设备故障诊断工作效率直接关系到平台的正常运营和海上油气的开发生产.图扑软件针对现阶段海上平台运维能力弱等现实问 ...

  6. android 人脸识别 方法研究,基于Android平台的人脸识别技术研究

    摘要: 在计算机视觉与模式识别领域中,人脸检测与识别技术是一个非常热门的研究课题,同时也具备非常广阔的商业价值.在诸多的目标检测算法中,基于AdaBoost算法的目标检测方法具有检测速度快,检测效果好 ...

  7. 基于AcrGIS平台实现三维场景下的积水效果动态模拟

    文章目录 1.前言 2.环境准备 3.开发过程 3.1 软件安装 3.2 共享(发布)场景服务 3.3 积水区三维可视化 3.4 动态模拟 4. 完整代码 5. 效果图 6. 在线演示 1.前言 现有 ...

  8. 基于超算平台气象预警并行计算架构研究

    作者简介:武汉小牛专注于GIS大数据应用.微服务.WEBGIS [应用场景/主要解决问题] 将来气象预警的精度要求越来越高,不仅追求气象采点的密度增加,还要求预报服务产品更加细化,信息发布更加快捷.利 ...

  9. 基于android平台unity3d游戏设计与实现,Unity3D微信小游戏平台的设计与实现毕业设计(论文)开题报告及工作计划书...

    四.主要参考文献 (8-10篇) [1]  朱玉.基于Unity3D漫游系统的设计与研究[J].信息安全与技术,2014,12:78-81 [2]  蒋元,蔡胜军,何绍勇,祁玮.基于Unity3D的虚 ...

最新文章

  1. 初入职场的我怎么就成了个打杂的,我是这样破局的 No.146
  2. 初探可编程网关 Pipy
  3. 渗透测试工作流程渗透测试类型法律边界
  4. centos6.8安装node
  5. 搭建基于spring MVC框架 + RESTful架构风格技术总结
  6. WinCE中,环境变量的添加,删除和查询
  7. c语言输出后面空格,新人提问:如何将输出时每行最后一个空格删除
  8. 阿里云超算异构Spot集群,助力深势科技30%成本驱动MDaaS海量算力
  9. 怎么在Word中插入歌曲
  10. STM32学习之TFTLCD
  11. Dubbo(二) Dubbo管理控制台dubbo-admin搭建
  12. oracle查询空的时间,ORACLE 查看用户密码修改时间
  13. [LeetCode]Count and Say
  14. tracepro杂散光分析例子_cSensor E2000系列气体光谱分析仪
  15. Unity UGUI 屏幕适配
  16. 手机如何将图片缩小到20k?怎么指定压缩图片大小?
  17. ​力扣解法汇总904.水果成篮
  18. POJ - Nice Milk(半平面交)
  19. [codeforces 1293A] ConneR and the A.R.C. Markland-N
  20. matlab数据归一化与反归一化处理

热门文章

  1. 任意文件——固定到“开始“屏幕
  2. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)
  3. 系统选Linux还是mac,如何选择一款适合自己操作系统、Windows、Mac还是Linux?
  4. Paddle实践:手写数字识别
  5. 微信小程序反编译wxss文件缺失_微信小程序反编译~2020年
  6. 【精选】JAVA算法题(二十三)
  7. Elasticsearch源码解析:环境搭建
  8. 关于doc、docx、PPT等文件图标显示与打开不正常的问题
  9. 计算机魅力沈阳一日游教案,魅力辽宁教案六年.doc
  10. 服务器虚拟p4交换机,p4 运行虚拟交换机(simple_switch)