基于Unity3D虚拟仿真博物馆漫游系统的研究设计
2022-09-07李晶
李 晶
(广东轻工职业技术学院 广东 广州 510300)
0 引言
随着虚拟现实技术在各个行业的快速普及与发展,其在空间与时间上的技术突破对人们的工作、生活、娱乐都产生了不同程度的影响[1]。本文结合虚拟现实技术特点,将其应用于博物馆场景的虚拟展示和交互中,设计与实现了一个基于Unity3D的虚拟仿真博物馆漫游系统,打破了时间与空间的限制,为用户提供了逼真的博物馆游览体验,并针对技术应用过程中以下3点问题提出了针对性的解决策略。
问题1:三维场景的构建与资源优化问题。虚拟现实技术必须应用在三维场景中,而三维场景在图形处理、渲染等方面需要占用大量的计算资源,容易造成系统运行效率低下、响应延时等问题[2],继而影响用户体验。因此在保证虚拟场景显示效果同时还需对场景结构进行优化和对场景资源进行有效调度,以保证系统的运行效率。
问题2:场景交互的触发精度问题。用户在虚拟场景中漫游,会通过各类触发条件与场景进行交互,在触发点较多,且场景空间较小的情况下,触发点的边界设置过大容易产生相互遮挡或边界重合,导致响应错误;边界设置过小,又难以被精准触发,也会影响用户体验效果,因此需要对场景交互的触发精度做进一步的优化处理。
问题3:场景漫游的视角问题。场景漫游需要设置边界以防止用户视角移出到场景之外,通常采用的策略是对场景边界添加刚体组件以阻止场景摄像机的移出。但摄像机视角都设置有视域,当摄像机移动到场景边界,视角已经超出了场景边界,因此还需要对视角进行单独调整。
1 Unity3D引擎
Unity3D是由丹麦公司开发的一款3D引擎,最初主要应用于3D游戏的设计开发。随着虚拟现实技术的发展与普及,Unity3D也逐渐被用于各个行业领域的虚拟现实项目开发,成为虚拟现实项目开发的主流工具之一。其技术优势主要包括以下几个方面。
(1)初期开源免费,通过用户的共用推广,积累了丰富的功能插件和精美的场景、模型资源,能够高效满足用户的各类开发需求[3]。
(2)图形化界面操作,提供了基于三维空间的可视化操作界面以及直观、便捷的操作工具,便于开发者快速搭建场景,调整场景布局。
(3)提供了多种数据接口,支持3D模型、二维图像、音频、视频等多媒体文件的指定格式导入。
(4)支持组件式开发,内置多种功能组件供开发者调用,并可由开发者自行设置功能参数,例如物理模拟组件用于模拟物体重力、碰撞弹射、刮风下雨等效果,粒子组件用于模拟烟火、爆炸等效果。
(5)支持C#、JavaScript等主流编程语言工具,用于进行系统前端界面交互功能的开发;支持MySQL、SQLlite等数据库管理工具,用于实现系统后端的数据管理。
(6)支持多平台的项目发布,基于unity3D开发的虚拟现实项目可以发布在各类主流平台,包括PC端、移动Android端和iOS端以及Web浏览器端。
基于Unity3D的上述技术特点,采用Unity3D引擎进行虚拟仿真博物馆漫游系统的设计开发在技术层面是可行的。
2 虚拟仿真博物馆漫游系统总体设计
2.1 系统开发流程
虚拟仿真博物馆漫游系统开发流程见图1。
(1)三维场景的构建。该模块用于完成虚拟仿真系统的三维模型素材制作,主要包括博物馆场景建模、物品建模两个部分。其中场景建模属于建筑模型,需要先绘制二维平面图,再进行三维建模,因此采用CAD制图软件按照1∶1比例进行精准的二维平面图形绘制,再生成三维场景;物品建模使用3DMAX软件完成。
(2)模型材质的制作。三维场景的视觉效果好坏很大一部分原因是取决于模型材质的精美程度[4],因此绘制材质时,物体本身细节的表现、明暗层次的自然过渡、不同材质的特质区分都需要十分注意。材质绘制常用的软件有Photoshop、Illustrator等软件工具。
(3)素材导入。Unity3D引擎支持三维模型、图形、视频、音频等各类素材的规范化格式导入,其中三维模型统一导入格式为FBX;图形图像文件导入格式为PSD、TIFF、JPG、TGA、PNG、GIF、BMP、IFF、PICT 等,需要注意的是Unity3D导入图片后统一默认为Texture(纹理)模式,不能直接应用于项目开发,需要手动转换为Sprite(图片精灵)模式;音频导入格式包括AIFF、WAV、MP3、OGG 4种[5],其中AIFF、WAV为原生音频,可在不损失音频质量的前提下进行播放,但文件占用存储空间较大;MP3为有损压缩的音频格式,虽然节省了大量的存储空间,但每次播放都需要消耗CPU周期进行解码,并且开发环境需要配置适用的解码器;视频导入格式包括MOV、MPG、MPEG、MP4、AVI等[6],基于Windows平台的开发环境中还需要额外配置QuickTime插件才能正常播放视频。
Unity3D工程开发:Unity3D引擎以工程为单位进行独立项目的开发。创建工程后,基于工程完成项目开发的具体工作,包括:场景搭建、前端界面设计、交互功能实现、数据管理、项目发布5个步骤。
步骤1:场景搭建。导入场景模型素材后,首先设置摄像机位置、视域、遮罩范围等参数,如场景需要假设多个摄像机,还需设置优先级;其次制作天空盒,Unity3D提供了天空盒插件,配合制作好的天空素材即可在虚拟场景中模拟出蓝天白云、黑夜星空等天空效果;场景光源设置,Unity3D提供了多种光源效果,包括自然光和方向光两大类,可以营造室内外不同环境下的光源效果[7];为场景中的墙体、物品等需要交互的模型对象设置刚体属性和添加碰撞体组件,使其具有交互检测的功能。
步骤2:前端界面设计,Unity3D内置有UI组件用于交互界面的设计,并提供了二维与三维两种设计模式,二维模式常用于二维屏幕终端发布的项目界面设计,例如PC终端和手机移动终端;三维模式用于VR终端发布的项目界面设计,例如VR眼镜、VR头盔。
步骤3:交互功能实现。首先需要进行触发条件的设置,Unity3D主要通过检测摄像机与场景中其他物体的刚体碰撞,或是摄像机的射线与物体的碰撞来触发交互事件,因此需要预先为交互物体设置刚体属性和添加碰撞体组件;交互功能的编程实现,Unity3D内置有碰撞器检测函数与触发器检测函数分别对上述两个碰撞方式进行检测,检测条件满足后即可触发相应的交互事件。
步骤4:数据管理。Unity3D后端数据库的连接与访问需要通过导入MySql.Data.MySqlClient插件实现,该插件提供了在C#语言中引用SQL语句连接数据库的方法以及对数据增、删、改、查的操作接口。
步骤5:项目发布。Unity3D的项目发布以场景为单位,当项目中包含多个场景时,需要按照场景的顺序逐一添加至项目中,再进行打包发布。除此,Unity3D还提供了项目发布的个性化参数设置,包括项目名称、开发者署名、软件图标、项目启动的展示界面、项目分辨率、项目内存优化、项目发布平台选择等。
2.2 系统交互功能设计
系统交互功能设计包括3个模块:UI交互、藏品交互和场景漫游,见图2。
UI交互模块:用于实现用户注册、登录及数据管理等功能。用户可以通过系统提供的UI界面进行数据的输入、查询、修改、存储、删除等具体操作。
场景交互模块:用于实现用户与模型和场景的交互。模型交互主要针对藏品模型可以进行物体的放大、缩小、旋转、移动以及藏品信息的文字展示、音频和视频播放等;场景交互用于实现多个场景之间的切换。
场景漫游模块:用于实现用户在虚拟场景中的漫游,用户可以第一个人称视角在虚拟场景中漫游,游览各个展览点。场景设置有边界碰撞检测,防止用户移出到场景之外。
场景交互与场景漫游两个功能模块,系统提供了键盘、触屏、鼠标3种操作模式,用户可以根据应用环境的不同灵活选择操作方式。
3 关键问题的解决策略
3.1 三维场景的构建与资源优化
精美的三维场景制作可以带给用户更加美观和逼真的游览体验,但同时也会增加系统开销,导致系统运行效率低下,甚至出现系统卡顿。因此在场景结构优化与最终的项目展示效果之间需要通过合理的优化策略以达到两者之间的平衡。三维场景的资源优化可以从3个方面实现。
(1)三维场景的模型优化。在三维场景建模过程中,通过模型的合理布线与面数控制等方式,在保证模型细节呈现的同时尽可能简化模型的结构。例如模型布线应以三角形边面为主,尽量减少不规则边面的形成,因为三角形边面的计算效率是最高的;另外模型曲面的计算开销是非常大的,因此尽量减少曲面的构成可以有效提高模型的计算效率,并以高质量的材质绘制弥补模型的细节损失。
(2)减少不必要的模型面构建。例如场景地面的处理,Unity3D内置的平面几何体辅以材质即可呈现较好的地面效果,因此场景建模就可以省略地面的处理;再如像展柜、植物、装饰物等不需要交互的静态模型,被放置在场景中固定不动的情况下,部分面会与场景重叠的而无法展示,因此也可以省略处理。
(3)三维模型的资源调度优化。Unity3D加载场景时会对场景中的所有模型进行计算和渲染,切换新的场景时,原来场景中的模型信息仍然会被保留在内存当中,需要通过调用Destroy方法才能手动清理。如果不清理原来的模型信息,会导致项目运行时间越长,内存消耗越大,系统效率越低;如果清理原有的模型信息,则会导致每次切换场景都要花费较长的时间对模型重新进行计算和渲染,而场景与场景之间频繁切换的话,也会造成很大的计算开销。资源调度优化主要采取的策略是将场景的模型进行分类管理和选择调度,将其划分为共有模型资源与私有模型资源两类,通过Unity3D的资源管理器对模型进行分类管理,属于场景之间的共有模型资源的,在场景切换时不做销毁处理;属于单独场景私有模型资源的,在切换场景时进行销毁,以有效提高场景资源的调度效率。
3.2 场景交互的准确触发
场景中可交互模型都需要添加刚体组件,摄像机与物体的碰撞或射线检测都是基于与刚体的接触,刚体组件提供了位置、缩放比例、旋转角度等属性,以便开发者自行调整刚体框架,使其能将模型完全包裹。场景较小而交互对象较多的情况下,各模型的刚体之间很容易出现前后遮挡或边界重叠的问题,导致交互事件触发错误,用户想与A物体交互,触发的却是B物体。解决这一问题最简单的方法是尽可能缩小刚体的边界,例如只将模型的一部分包裹在刚体中,缩小交互检测的范围。但刚体是透明不可见的,用户交互时只能看到交互对象的整体模型,看不到刚体范围,就导致用户无法准确触发该物品的交互事件,需要不断的移动视角进行尝试。针对上述场景交互的准确触发问题,基于范围的碰撞检测是较为有效的解决方法。
基于范围的碰撞检测策略,需要先对摄像机添加碰撞机组件,Unity3D提供了盒状、球状、胶囊状3种碰撞机,由于本系统采用的是第一人称视角,需要交互的范围锁定在视角的前、后方向,因此适用于胶囊状范围检测,通过调整胶囊碰撞机Y轴的缩放比例,可以确定视角前后的碰撞检测距离。当摄像机视角在场景中前后移动时,进入到碰撞机范围的物体将以数组形式返回各自的属性信息,摄像机通过范围检测即可锁定进入交互范围的物体,依据物体的属性信息可以动态计算出距离摄像机最近的物体,触发与其的交互。通过范围检测,可以将距离较远的物体进行剔除,处于范围内的物体通过动态算法始终锁定距离摄像机视角前方(Z轴正方向)最近的物体进行交互。
3.3 场景漫游边界的视角移出
场景漫游的边界检测是防止用户视角移出的重要手段,但视角具有一定的视野范围,当摄像机检测到与边界发生碰撞时,视野范围已经超出了场景边界。基于范围的碰撞检测策略同样可以解决这一问题,但其范围检测主要是视角的前后方向,无法检测到其他方向的边界,因此还需要结合刚体碰撞检测,为场景边界添加刚体组件。为了进一步改善用户的漫游体验,当视角前方检测到场景边界的同时,可通过编程动态调整视角的视野范围,当视角退出边界检测范围后,还原其视野属性,以确保视野始终处于场景之内。
4 结语
本文针对虚拟现实技术在虚拟博物馆游览中的应用及主要技术问题进行了研究和探讨,并设计开发了一个基于Unity3D的虚拟仿真博物馆漫游系统,该系统具有场景漫游、用户交互、数据管理等主要功能,并在场景构建和资源调度、交互触发准确性、场景漫游边界视角控制3个方面进行了策略改进与优化。