基于Unity 3D的虚拟楼盘漫游和碰撞检测研究
2016-08-18韩蕾
韩蕾
摘要:为了应用虚拟现实技术将楼盘销售从传统的图纸宣传方式变成三维空间漫游方式,该文重点对虚拟三维空间漫游常用的漫游技术和碰撞检测方法进行研究,并对漫游和碰撞检测在Unity3d平台的实现过程做了介绍。
关键词:虚拟现实;场景漫游;自动寻路;碰撞检测
中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2016)19-0194-02
Research of the Virtual Community Cruise and Collision Detection Based on Unity3d
HAN Lei
(Qingdao Harbor Vocational and Technical College, Qingdao 266400, China)
Abstract: In order to use virtual reality technology to real estate sales from the traditional way into cruise mode based on three-dimension, this article studied the roaming technology and collision detection methods based on the virtual three-dimensional space , and the collision detection and roaming platform in Unity3d the implementation process is introduced.
key words: virtual reality; cruise; automatic pathfinding; collision detection
虚拟现实技术的发展给房地产销售方式带来革命性的变化,楼盘营销手段从平面图纸宣传转换成了基于虚拟现实技术的虚拟楼盘漫游,极大的增强了客户对楼盘认知的真实感,从而增强了客户进一步关注楼盘的愿望,虚拟楼盘漫游系统得到广泛的开发应用。虚拟漫游技术主要包括场景建模、场景漫游、碰撞检测三大技术,本文就基于Unity3d开发平台开发虚拟楼盘漫游系统所需要的场景漫游技术和碰撞检测技术进行研究。
1 虚拟现实技术及Unity3d开发平台
虚拟现实技术是以计算机技术为核心,综合集成计算机图形、计算机仿真、人工智能、传感技术、显示技术、网络并行处理等技术的一种高技术模拟系统。它生成一种让人从视觉、听觉、触觉等多方面感到“真实”的三维虚拟环境,支持人通过语言、手势、动作等多种与真实情况一致的方式与虚拟环境进行交互,给人一种身临其境的感觉。由于虚拟现实技术对真实环境的强大的虚拟功能和其给用户带来的强烈的沉浸感和自然真实的交互性,虚拟现实技术被广泛应用于医学、游戏、建筑设计、房产开发、航空航天、工业仿真、应急演练等多个领域[1]。
Unity3d是一款三维游戏开发平台,使用Unity3d用户可以轻松的完成三维视频游戏、建筑可视化、实时三维动画等三维虚拟环境的交互内容。Unity3d编辑器在Windows 和Mac OS X下运行,并支持Windows、iphone、Android等多种发布平台。由于其可视化的开发界面、多发布平台、多开发平台,以及支持大家熟悉的C#语言作为脚本开发语言,Unity3d被广泛的应用于三维虚拟漫游系统开发。
2 虚拟场景漫游技术及在Unity3d中的实现
一个楼盘虚拟漫游功能至少要提供用户进行自主“游览”的交互漫游功能和可以为用户进行全方位导航的自动漫游功能,这样的楼盘漫游系统才可以满足用户的基本需要。
2.1 交互漫游技术及在Unity3d中的实现
虚拟楼盘漫游系统中交互漫游功能提供用户通过键盘、鼠标以及触摸方式控制漫游角色按照操作者的意志进行浏览的功能,Unity3d中提供第一人称角色漫游和第三人称角色漫游两种漫游方式。对于虚拟楼盘漫游,我们通常采用第一人称漫游,以增强用户的沉浸感、真实感。
虚拟场景漫游的实现原理是仿照真实环境中摄像机的作用和操作方式,相当于给在虚拟环境中的浏览者加上了一架摄像机,浏览者通过摄像机浏览环境。因此在虚拟漫游在系统中首先要架设摄像机(系统组件)在合适的位置,接下来通过交互设备(大多数情况下用键盘、鼠标)和脚本程序实现对摄像机的上下左右、远近视点位置的控制功能,配合三维场景画面的动态切换载入模拟出在观察者在真实环境中随位置、方向、视线变化所看到的场景的变化,从而实现虚拟环境下漫游的功能。三维场景模型制作完成后,在Unity3d中可以轻松的实现交互漫游。Unity3d中的实现过程如下:
将建好的场景模型分类导入到Unity3d中,做相应三维场景效果参数设置。接着创建一个第一人称控制器First Person Controller,调整First Person Controller的位置和高度,这一步相当于把一个第一视角的摄像机架设在一个透明的胶囊体漫游角色上,系统中出现了一个漫游者——系统操作者。接下来要做的是对该控制器的Character Controller组件设置属性值、添加、改写漫游脚本。通过属性值设置使漫游者在漫游过程应具备现实用人在环境中游览的特点,如,爬坡能力、过间隙的能力等等。编写脚本控制漫游角色相应操作者的指使进行漫游,脚本中通过Update函数响应键盘、鼠标的移动输入信号;通过Move函数控制第一人称控制器的移动。同时,在移动过程中要进行碰撞检测,一旦检测到碰撞立即做出碰撞响应——停止漫游,消息提示,等待调整漫游方向。漫游方向调整通过编写脚本由键盘的W、A、S、D按键来控制摄像机的移动,通过鼠标控制视角和朝向。
2.2 自动寻路漫游技术及在Unity3d中的实现
对购房者来说,楼盘本身以及周边的环境是购房者所关注的,因此对于一个良好的虚拟楼盘漫游系统,能满足用户充分了解楼盘和楼盘周边环境的功能。一个陌生的楼盘让用户通过交互漫游,往往会给人一种“不识庐山真面目”的感觉,因此虚拟楼盘漫游系统在提供交互漫游选项的同时也支持自动寻路漫游,允许用户输入起点、目的地,系统根据用户输入的起始点和目的地自动寻找一条可行的路径引领用户漫游,使用户轻轻松松漫游楼盘及周边环境。
自动寻路漫游的关键是路径规划。虚拟场景的路径规划来源于机器人学的路径规划,路径规划又分为全局路径规划和局部路径规划。全局路径规划,即在漫游前知道漫游场景的所有信息,根据已知的信息,借助路径搜索算法,找出起点到终点的路线,开始漫游。局部路径规划,即对场景的信息局部或完全未知,在漫游过程中需要借助某些特殊设备探知场景的信息,根据探知的信息确定漫游的方向、路径[2]。对于虚拟楼盘漫游系统,整个楼盘的场景建模在漫游前已完成,可供漫游的路径信息已知,因此,虚拟楼盘漫游系统的自动寻路采用全局路径规划。
Unity3d支持静态寻路和动态寻路两种寻路方式,静态寻路要求漫游路径在漫游前规划完成,漫游过程沿着规划的路线进行;动态寻路在漫游过程中一旦遇到障碍,需要从停止点到目标之间重新进行路径规划,选择最佳路径。虚拟楼盘漫游场景中的障碍物是固定的,可选路径固定,因此对于楼盘漫游系统的选择静态寻路简单实用。在Unity3d中由NavMesh组件完成寻路开发。NavMesh的寻路算法的核心是用三角形代替传统的寻路算法中的网格,用计算拐点优化寻路路径。NavMesh寻路算法实现分为以下几步:
第一步:建立MESH三角形网格:
首先,画出一个范围可行走范围。再在可行走范围中去不可行走的范围。第三步用多个多边形Polygon代替以上的范围,然后再由这些多边形的各个顶点来生成三角形网格,三角形网格的生成算法如下:
Step 1:用可行走Polygon的任意一条边作为起点,将其推入堆栈列表。到Step2.
Step 2:从堆栈中推出一条边,在所有三角形中计算出边的DT点,构成约束Delaunay三角形,到Step3。如果没有DT点就重复做Step2,直到堆栈为空就结束整个程序。
Step 3:将所构成的三角形,另两边做如下处理:检查堆栈中是否已存在,如果存在就删除该边,如果不存在就加入到堆栈中。
第二步:用NavMesh算法寻路
首先计算起点到各邻接三角形中心的距离,选取F值(距离赋值)最小的三角形,计算G(起点到个邻接三角形中心的距离)值,如果比以前的G值小则更新父三角及G值,最终得到一条三角形连接线路。
对于虚拟楼盘漫游系统的建筑物,由于目标范围太大,导致路径规划复杂,处理的方法是在每个作为寻路目标的建筑物入口处设置一个较小的替代目标。
3 三维碰撞检测技术及在Unity3d中的实现
虚拟楼盘场景有假山、楼体、树木、花坛等,那么在交互漫游过程中,漫游角色在与这些物体发生碰撞时,系统必须能及时检测到碰撞并立即做出处理响应,这样才能避免出现“穿墙”现象,给用户一个逼真的漫游体验。碰撞检测是虚拟楼盘漫游中影响漫游“真实感”的重要因素。
目前,常用的碰撞检测方法主要有层次包围盒法和空间分割法。空间分割法是把三维虚拟空间分割成大小相等的单元格,然后对占有同一个单元或者相邻单元格的对象进行相交检测。在环境物体分布稀疏的场景中,空间分割法可以快速的找出相交单元格,进行碰撞检测。但是复杂的场景中,空间分割法由于不容易准确确定分割尺寸,经常造成存储空间浪费过大,检测效率低。所以空间分割法较少使用。层次包围盒法通过规则的立体几何图形将虚拟场景的对象包围起来,使规则几何体的特性与虚拟对象的特性接近一致,当判断两个被层次包围盒包围的虚拟对象是否碰撞时,首先从包围盒相交检测开始,如果包围盒未相交,说明两个虚拟对象没有发生碰撞,不需要进行两个虚拟对象的相交测试,因此层次包围盒法效率较空间分割法要高的多,再加上其检测方法简单的优点,层次包围盒法是三维虚拟场景漫游中应用广泛的碰撞检测算法。根据包围盒的几何体不同,层次包围盒碰撞检测算法又分为:包围球法、AABB包围盒法、OBB包围盒法[4]。
Unity3d开发平台内置了基于层次包围盒的碰撞检测算法,为了减轻开发人员的工作负担,Unity3d开发平台中基于层次包围盒的各种碰撞检测算法开发完成了多种碰撞器,开发人员在开发过程中直接添加相应的碰撞器完成碰撞检测,而不需要编写碰撞检测算法,大大节省了开发时间。Unity3d提供的碰撞器主要包括Box Collider(盒子碰撞器)、Sphere Collider(球形碰撞器)、Capsule Collider(胶囊碰撞器)、Wheel Collider(轮子碰撞器)、Mesh Collider(网格碰撞器)、Terrain Collider(地形碰撞器)等。基于Unity3d做楼盘漫游系统,其碰撞检测主要用于漫游角色与墙体、树木、花坛、草地之间的碰撞,以不出现“穿墙”现象和及时做出碰撞响应为目的,因此该漫游系统碰撞器应以盒子、球形、胶囊等原型碰撞器为主,复杂物体的碰撞器用原型碰撞器进行组合,比如,树可以给树头和树干分别用盒形碰撞器,让他们组合起来作为单个碰撞器使用。
楼盘漫游系统中,对楼体、树木、假山这些静止不动的环境模型添加Static Collider 静态碰撞器。对漫游角色添加Rigidbody Collider 刚体碰撞器,碰撞信息处理由脚本组件通过OnCollisionEnter(当进入碰撞器)、 OnCollisionExit(当退出碰撞器)、OnCollisionStay(当逗留碰撞器)函数实现。
4 结束语
虚拟楼盘漫游系统中的关键技术是路径规划和碰撞检测方法,本文首先对基于Unity3d进行虚拟楼盘漫游系统开发中用到的交互漫游和自动寻路漫游的路径规划、以及漫游过程中的碰撞检测方法进行了研究。接下来对漫游和碰撞检测在Unity3d平台的实现过程进行介绍。
参考文献:
[1] 洪炳镕, 蔡则苏, 唐好选. 虚拟现实及其应用[M]. 北京: 国防工业出版社, 2005:2,90-107.
[2] 罗景馨. 与三维场景漫游相关的部分技术研究[D]. 长沙: 中南大学, 2009:44-48.
[3] 郝彩虹. 虚拟漫游系统场景管理与路径规划的研究[D]. 大连: 大连理工大学, 2010:29-31.
[4] 张明明. 基于Unity3D虚拟校园漫游的研究与实现[D]. 昆明: 昆明大学, 2014:17-18.