彭伟国,栗昊
(平顶山学院计算机学院(软件学院),平顶山467000)
随着智能手机的普及,人们通过手机图片和视频去观察了解事物,但是不能从三维视角下观看物体的方方面面。AR 的优势就在于能够把原本在现实物理世界中难以体验到的真实的感官信息,通过科学技术模拟仿真后再叠加到现实世界被人类感官所感知,从而达到超越现实的感官体验[1]。而AR 技术的这一优势能帮助人们在虚实结合的场景中有更好的交互体验。枪械并不是每个人都能接触到的物品,但又有很多人对枪械特别感兴趣。众多人的爱好需求和社会现状出现了矛盾,《AR 枪械》通过增强现实技术,将真实的环境和虚拟的物体实时地叠加到了同一个画面或空间。AR 技术使真实场景与虚拟物体无缝对接,通过《AR 枪械》这一科普软件,用户能够以立体真实的视角,增强用户对枪械知识的学习兴趣,了解枪械科技的发展。
《AR 枪械》能够让用户通过扫描枪械平面识别图来观察三维的枪械模型,并且会出现枪械数据和枪械历史,用户可以通过阅读屏幕上的内容来了解所扫描的枪械的数据及历史。并且三维枪械模型出现后,用户可以通过滑动屏幕旋转模型,满足用户全方位观察枪械的需求。
启动AR 程序,用户能够看到开始识图、藏品、项目设置、项目帮助和退出项目等五个按钮。用户点击开始识图,项目会跳转到识图界面,用户通过枪械识别图获取该枪械的三维模型。通过单个手指在手机屏幕上下左右滑动控制模型上下左右旋转。当两个手指间的距离变小时模型缩小,当距离变大时模型放大。用户可通过数据和历史按钮来查看该枪械的相关数据和历史介绍。用户也可选择截图、收藏和退出等功能。
用户点击藏品按钮,项目会进入到藏品界面,在藏品界面用户可查看枪械藏品的三维模型及该枪械的枪械数据和枪械历史,用户也可选择取消收藏该枪械。通过设置按钮可跳转到设置界面,用户可以通过滑条控制项目音效大小。通过射击体验按钮可跳转到射击体验场景,可以使用自己选择的枪进行射击体验。通过项目帮助按钮可跳转到项目操作介绍界面,用户点击退出按钮,退出项目界面。
《AR 枪械》应用程序主要运用Unity3D 游戏引擎、Vuforia 软件开发工具包和C#脚本语言进行开发,项目UI 主要运用Photoshop 和Unity 软件进行制作,项目中的枪械3D 模型主要运用Maya 软件进行建模。《AR 枪械》在项目策划的基础上,首先完成了枪械3D 模型、项目UI 等设计工作,然后进行AR 识图、枪械收藏、资源加载、截图、藏品展示、项目帮助、项目设置、射击体验等功能的开发。项目中的枪械数据使用JSON 进行存储。项目模块间采用了单例模式进行通信。
项目资源准备方面,除了模型、UI 效果图之外,实现AR 枪械的关键一环就是识别图的制作了。
首先,在Maya 中渲染出枪械模型的正视图,保存其位置,作为AR 枪械模型的渲染图;然后,在Vuforia的官网(https://developer.vuforia.com/)注册并登录账号,通过官网Add Database 按钮创建枪械数据库Firearms⁃Database;最后,在数据库界面点击Add Target 按钮,选取制作的渲染图,完成一个识别图的添加。重复前面步骤,添加其他枪械识别图,完成识别图数据库的创建。
在软件系统开发过程中,类图设计起到承上启下的作用,对上是用例分析的结果,对下是系统代码设计的蓝本[2]。类图也是描述系统详细功能设计的有效方式之一,能够描述系统设计中类与类之间的联系,也能够对类的内部构成加以说明[3]。AR 识图、资源加载、藏品展示是整个项目里面最核心的几个功能,在进行项目开发的初期,首先要完成各个功能模块的类图设计。
AR 枪械软件启动后,当用户点击应用软件上的识图功能,打开相机,相机对准识别图进行识别,根据不同的枪械识别图,用户能识别出不同的枪械模型,并对识别出的模型进行放大缩小和旋转操作。
AR 识图类图如图1 所示,类GameManger 和类MyDefaultTrackableEventHandler 之间是依赖关系。设计单例类GameManger 储存识别的枪械的名字,在该类中设计string 类型name 字段储存枪械名称,设计方法SetFirearmsName()获取枪械名称。设计类MyDefault⁃TrackableEventHandler 解析识别图数据库以及实现模型的加载,在该类中设计GameObject 类型的pregabs储存枪械模型资源,设计方法OnTrackingFound()加载模型,设计方法OnTrackingLost()删除模型。
图1 AR识图功能类图
当用户扫描枪械识别图时,加载对应的枪械模型,当用户点击菜单栏中的数据按钮时会加载并显示当前枪械的数据;当用户点击菜单栏中的历史按钮时会加载并显示当前枪械的历史信息。
资源加载类图如图2 所示,资源加载功能有关类的设计如下:类CollectionUIManager 和类UIManager 都与类InventoryManager 存在依赖关系,类InventoryMan⁃ager 和类Firearms 组合关系。设计类InventoryManager通过JsonLoadFirearms()方法实现对Item.Json 文件的解析,解析枪的数据、历史和枪械模型Prefab。类Col⁃lectionUIManager 和类UIManager 实现对类Inventory⁃Manager 解析的枪的数据、历史和枪械模型Prefab 加载到相应位置。设计类UIManager,在该类中设计方法DataButtonClick()和HistoryButtonClick()实现在识图场景当用户点击数据或者历史按钮时,显示对应的数据。
图2 资源加载功能类图
藏品展示功能为了满足藏品场景的互动性和简洁性进行单独设计,当用户点击主界面的藏品按钮,进入藏品界面,在藏品界面的右边是收藏的枪械列表,左边是枪械的数据以及历史,中间是枪械模型,用户能滑动中间屏幕旋转、放大和缩小枪械模型,也能滑动历史Panel 查看完整的历史介绍。当用户点击藏品列表的枪械时,在对应位置显示所点击枪械的模型、数据以及历史。
藏品展示功能类的设计如下:类CollectionUIMan⁃ager 和类InventoryManager 之间是依赖关系,类Inven⁃toryManager 和类Firearms 之间是组合关系。在类Col⁃lectionUIManager 中设计方法Init()实现控制藏品场景中枪械列表的刷新;对类InventoryManager 解析的枪的数据、历史和枪械模型Prefab 加载到相应位置,设计方法CollectionButtonClickTo()实现当用户点击枪械列表中的枪械图标时,加载对应枪械的数据、历史和枪械模型Prefab。类Firearms 用来存放枪械对象,在类Inven⁃toryManager 中设计方法JsonLoadFirearms()解析的枪械数据,枪械数据都是按照类Firearms 对象的状态储存在内存中,方便查找。
藏品展示功能的类图设计如图3 所示。
图3 藏品展示功能类图
在SampleScene 场景的Hierarchy 面板中鼠标右键创建Vuforia Engine Image,并在该Image 的Inspector面板中点击选择Image TargetBehavior 中的Type 为Predefined,Database 为FirearmsDatabase,ImageTarge为枪械中的一个,并将Image 的名称改为选择的Imag⁃eTarge 的名称一致。重复上述步骤完成所有枪械Im⁃age 的制作。
为所有Image 枪械添加MyDafaultTrackableEven⁃tHandler 脚本,在这个脚本中编写名字为OnTrack⁃ableStateChanged()方法,当程序运行时通过该方法中的Stattus 属性去解析识别到的图片是否是当前Image图片,如果不是继续识别,如果是当前图片将调用名字为OnTrackingFound()方法将该枪械模型加载到内存中,通过GameObject 类型的gameobj 去索引模型,通过Instantiate 方法将gameobj 加载到场景中,完成对应枪械模型的加载,实现识图功能。AR 识图功能效果图如图4 所示。
图4 AR识图功能效果图
在项目场景的Hirerarchy 面板创建空物体,创建InventoryManager 的脚本并加载在空物体上,通过脚本中的JsonLoadFirearms 方法,以文件读写的方式读入Items.Json 文件中枪械编号、枪械名称、枪械收藏状态、枪械历史、枪械重量等枪械资源。通过firearmsList 列表存储JSON 解析的全部枪械数据,然后通过GetFire⁃armsState()方法获取某个枪械的所有数据。
在识图场景,当用户识别枪械后,用户点击菜单栏中的数据按钮,该按钮通过监听事件通过MainMe⁃nuButtonClick()方法通过GameManager 类获取当前枪械的名称name 字段,在通过DataButtonClick()方法将枪械名字name 发送给InventoryManager 类的GetFire⁃armsText 方法,该方法将返回一个Firearms 对象,该对象存储着当前枪械的数据信息,获当前数据后,将枪械数据发送给Datapanel 面板写的DataText 的Text 文本,将数据显示在屏幕上;当用户点击HistoryButtonClick按钮时,重复数据按钮方法,将枪械历史显示在屏幕上。
藏品展示功能的实现效果图如图5 所示,该功能的实现步骤如下:
(1)给藏品场景中的Canvas 挂在CollectionUIMan⁃ager 脚本,当场景运行时,该脚本将通过Init 方法获取场景中的藏品展示列表CollectionPanel 以及面板下的所用子物体。
(2)在场景中的Hirerarchy 面板中创建一个空物体,命名为InventoryManager,再挂载InventoryManager脚本,当场景运行时,该脚本将运行脚本中的JsonLoad⁃Firearms()方法,将Items.Json 文件中的数据读入Fire⁃List 列表中。Items.Json 文件中通过State 存储枪械的状态,通过查看FireList[n].state 的值来确定枪械是否收藏。
(3)在场景中类CollectionUIManager 通过UpdateS⁃ceneCollectionFirearmsList()方法将从InventoryManager类的GetCollectionNameList()方法中获取的收藏中的枪械名称存储TextList 列表内,并依次在CollectionPan⁃el 通过Init()方法将枪械名称加载到藏品列表中,在屏幕上显示。根据当前列表中枪械名称,通过Resource.load()方法将枪械对应的图片,从Resource 文件夹内加载到列表中。
AR 枪械这款应用程序,用户通过手机扫描枪械识别图,识别出枪械模型;用户通过资源加载功能读写枪械配置资源,以在UI 界面显示枪械数据信息和历史信息;用户通过藏品展示功能,收藏喜爱的枪械。另外,用户还可以运用枪械模型进行射击体验,享受射击的快乐。
图5 藏品展示功能效果图