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

2023-05-16

 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; / / 定义 GUI

     var cam1 : Camera; / / 定义相机

     var cam2 : Camera;

     function OnGUI() { / / 调用函数 GUI

       GUI. 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 触摸屏与usb鼠标同时支持

    最近 xff0c 做系统移植 xff0c 根文件系统自己做的 xff0c 移植好tslib xff0c 也可以触摸屏校准 xff0c 触摸屏也可以正常使用 xff0c 但是插上usb鼠标时 xff0c 系统能枚举出usb的信息 xff0c
  • 内核裁剪和部分选项的意义

    嵌入式驱动开发 xff0c 内核开发 xff0c 都避免不了的和Linux打交道 xff0c 尤其是做系统移植 xff0c 在编译内核的时候 xff0c 我们都需要把没用的内核模块给删除掉 xff0c 以减少内核的文件大小 xff0c 这当
  • printk打印级别输出

    内核的打印函数和用户空间的打印函数是相同的 xff0c 只是关键字不太一样 xff0c 内核是printk xff0c 而用户空间则是printf 在内核空间只不过有一个打印级别的设置 xff0c 所谓的打印级别不过是几个宏定义 print
  • 结构体,联合的位域定义方法,以及结构体大小的计算

    结构体有一种定义方式叫做位域定义方式 xff0c 如下 struct ctl register int a 16 char c 4 这种定义方法 xff0c 一般常用在嵌入式开发的内核层的代码中经常出现 int a 16 代表a只占int的
  • c语言中__attribute__的意义

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 我们在进行定义数据结构计算数据结构大小的时候 xff0c 或者进行网络通讯的socket发送数据的时候 xff0c 都会遇到一个共同的问题 xff1a 数据对齐问题 这个问题是
  • linux播放音乐,录音命令-----arecord,aplay

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 用了这么长时间的Linux系统 xff0c 是不是还没有用Linux听过音乐 xff0c 一般使用Linux系统的人都是纯属办公需要或者自己对软件开发玩的 xff0c 很少是做
  • Unix或Linux中&、jobs、fg、bg等命令的使用方法

    fg bg jobs amp ctrl 43 z都是跟系统任务有关的 xff0c 虽然现在基本上不怎么需要用到这些命令 xff0c 但学会了也是很实用的 一 amp 最经常被用到 这个用在一个命令的最后 xff0c 可以把这个命令放到后台执
  • linux tftp服务器搭建与测试

    1 安装tftp服务器 sudo apt get install tftp hpa tftpd hpa tftp hpa是客户端 tftpd hpa是服务器端 2 配置tftp服务器 sudo vim etc default tftpd h
  • FreeRTOS基础知识

    FreeRTOS任务特性 xff1a 简单 xff1b 没有使用限制 xff1b 支持抢占 xff1b 支持优先级 xff1b 每个任务都有堆栈 xff0c 但也导致了RAM使用量增大 xff1b 如果使用强化在哪的话必须仔细考虑重入的问题
  • makeinfo 安装

    环境 ubuntu sudo apt get install texinfo 就OK 今天在打包的时候有个包需要 makeinfo 当时就各种搜结果就没有 makeinfo 这个软件包 xff0c 最后看到有人说其实就是 texinfo 这
  • 通过MCU实现Altera FPGA在线升级

    一 xff0e 问题背景 在实际工程应用中 xff0c 我们时常会遇到为解决某个老产品的BUG xff0c 需要在工程现场更新设备的FPGA代码 xff0c 或者参加电信测试时需要现场升级设备FPGA程序以便于调试 公司现阶段所用的Alte
  • ubuntu linux zip和unzip类命令详解

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 1 zip zip r myfile zip 将当前目录下的所有文件和文件夹全部压缩成myfile zip文件 xff0d r表示递归压缩子目录下所有文件 2 unzip un
  • ubuntu运行sh脚本sudo自动输入密码

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 示例 xff1a sudo apt get update 第一种方法 xff1a 使用管道 xff08 上一个命令的 stdout 接到下一个命令的 stdin xff09 b
  • 基本命令+环境变量+正则表达式 --- shell脚本编程教程之一

    vim 单纯的使用vi查看文件 shell 编程常见的命令 xff1a alias 别名 给一长命令起别名 例如 xff1a alias myssh 61 34 ssh root 64 192 168 1 158 34 myssh 相当于
  • 基本的shell编程格式+简单的脚本实例 --- shell脚本编程教程之二

    温习shell编程基础的要点 xff1a 正则表达式的要点 xff1a 39 39 a 39 39 a 61 61 a aa aaa 39 43 39 grep E 39 a 43 39 61 61 grep 39 a 43 39 39 3
  • shell if条件分支编程 --- shell脚本编程教程之三

    数学运算 xff1a vim math sh a 61 1 b 61 2 c 61 a 43 2 或者 c 61 a 43 b echo c 条件判断 xff1a 格式1 if 条件 then 条件为真执行的任务 fi 格式2 fi 条件
  • VIM 常用快捷键

    转载 xff1a https www cnblogs com markleaf p 7808817 html 一 移动光标 h j k l 上 xff0c 下 xff0c 左 xff0c 右 ctrl e 移动页面 ctrl f 上翻一页
  • Qt5 对xml文件常用的操作(读写,增删改查)

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 项目配置 pro文件里面添加QT 43 61 xml include lt QtXml gt xff0c 也可以include lt QDomDocument gt 项目文件
  • Shell分支语句case···esac语法

    Shell编程 xff1a case esac多分支选择编程 也多常用于菜单选择 语法 xff1a case 值 in 模式1 command1 command2 command3 模式2 xff09 command1 command2 c
  • Ubuntu使用iptables配置防火墙提示:unrecognized service(Ubuntu配置iptables防火墙)

    Ubuntu默认安装是没有开启任何防火墙的 当使用service iptables status时发现提示iptables unrecoginzed service 意思是无法识别的服务 以下方法来自http blog csdn net l

随机推荐

  • CMake使用问题汇总

    cmake 指定编译类型 主要用在vs这种支持多配置的集成开发环境中 xff0c 可以在CMakeLists txt中指定 xff0c 也可以在CLI中指定 测试的时候发现在CMakeLists txt定义时不能使用自定义类型 xff0c
  • Shell编程,shift参数操作

    shift参数操作 xff0c 是将参数从左到右逐个移动 比如 xff1a 现在有 1 2 3 4 5 几个参数 shift操作后 xff0c 1被处理过之后 xff0c 2变为 1 3变为 2 4变为 3 5变为 4 就这样依次变动 sh
  • Java入门总览

    Java入门总览 1 JDK的安装 可以去官网下载 xff0c 有各种平台和各种版本的软件 目前常用的 xff0c 网上介绍多的大都是jdk1 8 0 211此版本 Linux系统和Windows系统安装起来都很方便 2 环境变量的配置 配
  • 示例:Linux应用程序遍历当前系统的PCI设备

    使用应用程序遍历设备上的所有PCI设备 xff0c 通过遍历这些设备 xff0c 可以获取到每个设备对应的bus号 xff0c dev号 xff0c func号 xff0c 以及每个PCI设备的额vendorID和deviceID 示例程序
  • 示例:Linux设备属性节点驱动,以及cat, echo操作

    在写Linux字符驱动的时候 xff0c 经常涉及到一些驱动需要在 sys目录或子目录下创建 xff0c 一个属性节点 xff0c 以便与 xff0c 不用查看驱动的版本信息 xff0c 时间等等一些属性信息 xff0c 以判断驱动程序加载
  • 一个双非学校的本科生的春招经历

    截止到目前各大公司的校招也已经基本进入尾声 xff0c 在这场春招中我也试着投递了几家公司 xff0c 但是效果不是太好 先说我投递的第一家 腾讯 xff0c 参加腾讯的笔试之前根本没有参加过任何相关的公司招聘的线上笔试 xff0c 这是我
  • C++多态的实例

    1 1 多态的概念 简单理解 xff1a 同一个接口 xff0c 多种实现方式 xff0c 让不同类的的对象对同一件事情可以采用不同方法去做 1 2 多态的作用 xff08 1 xff09 应用程序可以不必为一个派生类编写功能调用 xff0
  • Linux下的多进程编程——fork(),exec()等函数的使用

    Linux下的多进程编程初步 1 引言 对于没有接触过Unix Linux操作系统的人来说 xff0c fork是最难理解的概念之一 xff1a 它执行一次却返回两个值 fork函数是Unix系统最杰出的成就 之一 xff0c 它是七十年代
  • APM学习--Skywalking安装(5.0.0版本)

    Requirements JDK 6 43 xff08 instruments application can run in jdk6 xff09 JDK8 SkyWalking collector and SkyWalking WebUI
  • FreeRTOS消息队列

    FreeRTOS消息队列 队列又称消息队列 xff0c 是一种常用于任务间通信的数据结构 xff0c 队列可以在任务与任务间 中断和任务间传递信息 xff0c 实现了任务接收来自其他任务或中断的不固定长度的消息 xff0c 任务能够从队列里
  • 嵌入式前景怎么样

    现在物联网的发展也把之前大家没有注意过的嵌入式给带动起来了 xff0c 其实想去学习嵌入式的人还真不少 xff0c 不过这其中也会有人担心自己的发展前景 xff0c 下面可以一起先来了解下嵌入式前景怎么样 目前 xff0c 嵌入式开发人才需
  • datax同步数据:数据源:mongo,目标源:hdfs

    一 配置文件mongo hdfs json 34 job 34 34 setting 34 34 speed 34 34 channel 34 2 34 content 34 34 reader 34 34 name 34 34 mongo
  • 做程序媛这几年,感受?体验?

    首先 感受 和男程序员一个样 真不是废话 BUG是修不完的 但是不能放过它 因为你的内心会遭受煎熬 直接进入体验 就不用重复的文字去啰嗦了 直接上图哈 以下的这几种情况 在我的生活中 是真的不断出现 连样式都没变过 first 修电脑AND
  • 天猫精灵与oauth的认证接入流程(AliGenie智能家居接入流程)

    写在前面的叨叨 xff1a 对于天猫精灵的对接网上的教程也是颇少的 xff0c 所以希望我的记录过程也能对他人学习有所帮助 xff0c 要想学一样新的技术必须得找到相关技术文章好好专研了 xff0c 在学习的路上孜孜不倦 xff0c 偶遇难
  • 致敬2016年我的每一次选择。

    2016年 对我来说 是不平凡的 不是因为经历了什么永生难忘的经历也不是因为我做了什么伟大的事情 只是因为毕业了 我毕业了 多么开心却又悲伤的故事 我开心在我终于可以做自己想做的事情 悲伤的是当同学们的父母都陆续为他们铺好以后的路的时候 我
  • 打开计算机的管理需要在控制面板中创建关联

    今天在工作中发现当我选择计算机 管理时提示我需要在控制面板中创建关联 xff0c 如下图所示 xff1a 于是 xff0c 我便上百度搜索了一下 xff0c 答案是这样的 xff1a 修改 span style font family no
  • ftp身份认证时登录框反复弹出以及ftp常用配置

    1 若我们想访问一个人的ftp站点 xff0c 直接通过浏览器直接访问就可以了 xff08 ftp 要访问主机A的IP地址 xff09 如果对方开启了基本身份认证的话 xff0c 我们就需要输入正确的用户名及密码才可正常访问 xff0c 即
  • Linux下挂载U盘、ISO、光盘、rpm

    1 挂载U盘 1 xff09 将U盘连接到虚拟机后 xff0c 使用fdisk l xff08 注意 xff0c 这是list单词的首字母l xff09 命令查看当前U盘的设备符号 2 xff09 创建目录 mnt usb xff0c 以备
  • unity 3D学习日记:创建一个小场景并编写简单C#移动脚本

    学习Unity 3D第一周 xff0c 完成的目标一是创建一个小场景 xff0c 用角色控制器在场景里行走 xff1b 二是编写一个简单的移动脚本 一 创建一个小场景 xff0c 用角色控制器在场景里行走 1 先安装Unity 3D 5 3
  • 基于Unity3D平台的三维虚拟城市研究与应用

    0 引 言 随着现代城市的不断拓展延伸 城市空间多层次 立体模式管理逐渐成为城市规划管理的发展趋势 1 实现城市空间信息管理模式从二维到三维的转变 三维虚拟城市技术 已经成为人们关注和研究的热点 2 三维虚拟系统具有多维信息处理 表达和分析