Vuforia核心功能官方案例详解—VR及AR开发高级教程(6)

发表于:2017-3-24 11:12

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:吴亚峰、刘亚志、于复    来源:51Testing软件测试网原创

#
AR
#
Unity
#
VR
分享:
  第3章  Vuforia核心功能官方案例详解
  前面章节中笔者介绍了增强现实的简介以及Vuforia核心功能的基础知识,使读者对增强现实技术,以及在开发过程中所要注意的事项有了基本了解。本章将详细讲解Vuforia核心功能的官方案例,通过实践使读者对增强现实的开发有更深层的了解。
  3.1  官方案例下载及ARCamera参数讲解
  本节中将着重讲解Vuforia核心功能的官方案例和ARCamera预制件中的参数,因为在每个案例中都会涉及ARCamera预制件的使用,所以笔者在这里将统一讲解。需要读者注意的是,在讲解每个案例的开发步骤之前,笔者都会先展示案例的运行效果,使得开发步骤思路更加清晰。
  (1)前面章节中笔者介绍了如何在Vuforia官网注册用户账号,打开Vuforia官网登录用户账号(因为在下载官方案例时需要登录,否则会提示用户登录)。单击导航栏中"Downloads"下的Samples菜单,会显示出官方的案例列表,如图3-1所示。
  
  (2)选择Download for Unity字样下载官方案例。下载完成后将该压缩包解压到当前文件夹,会显示出所有案例的unitypackage资源包,如图3-2所示。打开Unity 3D游戏开发引擎,在Project面板右击→Import Package→Custom Package,找到资源包所在位置即可将其导入进Unity引擎,如图3-3所示。
  (3)资源包导入成功后,为官方的案例添加License Key(前面章节笔者已详细讲解过如何在官网上创建Key,不熟悉的读者可以参考前面章节),再按照Unity导出APK的步骤将官方案例导出到移动设备上即可运行,相关步骤读者可以参考Unity的书籍。
 
  (4)每个案例中都会使用到ARCamera预制件,笔者将详细讲解ARCamera游戏对象上的参数。选中该游戏对象,读者会发现挂载有许多脚本,如图3-4所示。这些脚本用来处理数字眼睛技术、智能地形的控制等。笔者在这里将详细讲解VuforiaBehaviour和DatabaseLoadBehaviour两个脚本。
  (5)VuforiaBehaviour脚本下可以为App添加License Key,如图3-5所示。该Key是该应用的标志。笔者建议每一个Key只能应用于一个App,否则在设备上运行时可能会报错。在其下面可以修改摄像机的模式、可识别图像的最大数量等参数,具体内容如表3-1所示。
  (6)需要读者注意的是,在将世界中心模式选择为SPECIFIC_TARGET时,需要开发人员手动为其添加一个World Center,如图3-6所示。在改脚本中,图像(物体)目标默认最大的可识别数量为1。在Datbase Load Behaviour脚本中可以设置加载以及激活一个或者多个数据集,如图3-7所示。
 
  (7)与加载并激活数据集相对应的是在ImageTarget Behaviour中选择数据集以及目标图像。以图像识别为例,在ImageTarget Behaviour脚本中修改这两个参数即可,如图3-8和图3-9所示。开发人员可在此参数中添加多个识别目标。
  
  (8)在每个官方案例中,开发人员在双击扫描界面后弹出一个界面,在该界面中可以决定是否使用扩展追踪、摄像机自动对焦,以及调用摄像机的哪个摄像头等功能,如图3-10所示。这些界面功能是用Unity实现的,有兴趣的读者可以参考Unity的相关书籍。
 
  3.2  扫描图片官方案例详解
  扫描图片,顾名思义是通过摄像机扫描图片时在图片上方出现一些设定的3D物体,还可以通过编写程序实现人与物体交互的功能。前面章节中介绍了图片的要求以及一些注意事项,有需要的读者可以阅读前面章节的内容。
  3.2.1 预制件通用脚本介绍
  在Vuforia官方案例以及其SDK中,将很多需要用到的东西做成了预制件,如ARCamera、ImageTarget、ObjectTarget等,如图3-11所示。在预制件上都实现了其相关功能。但是在不同预制件上会有部分相同的脚本,如图3-12所示。笔者在这里将详细讲解这些脚本。
 
  Turn Off Behaviour脚本的作用是在应用程序运行时禁止场景中的物体的渲染,分别获取游戏对象上Mesh Render和Mesh Filter组件并将其销毁。需要读者注意的是,在官方案例中的大部分脚本都引用了Vuforia命名空间,开发人员在编写脚本时需注意。
  代码位置:见官方案例ImageTargets-5-5-9.unitypackage下Assets/Vuforia/Scripts/TurnOff Behaviour.cs
  1     using UnityEngine;
  2     namespace Vuforia{                       //引用Vuforia命名空间
  3       public class TurnOffBehaviour : TurnOffAbstractBehaviour{
  4         void Awake(){                        //重写Awake方法
  5           if (VuforiaRuntimeUtilities.IsVuforiaEnabled()){
  //是否获取了设备上摄像头的连接
  6             MeshRenderer targetMeshRenderer = this.GetComponent<MeshRenderer>();
  7             Destroy(targetMeshRenderer);     //获取游戏对象的MeshRender组件并将其移除
  8             MeshFilter targetMesh = this.GetComponent<MeshFilter>();
  9             Destroy(targetMesh);             //获取游戏对象的MeshFilter组件并将其移除
  10    }}}}
  说明:分别获取游戏对象上的Mesh Render组件和Mesh Filter组件并将其移除。
  在摄像机扫描物体对象时,并不是任何时刻都可以扫描到对象(图片、圆柱体以及3D物体等),这时需一个脚本用来处理物体对象是否符合追踪状态的两种情况。在预制件上挂载的Default Trackable Event Handle脚本就是用来处理这种情况,具体代码如下。
  代码位置:见官方案例ImageTargets-5-5-9.unitypackage下的Assets/Vuforia/Scripts/ Default TrackableEventHandler.cs
  1     using UnityEngine;
  2     namespace Vuforia{                            //继承ITrackableEventHandler接口
  3       public class DefaultTrackableEventHandler : MonoBehaviour, ItrackableEvent
  Handler{
  4         private TrackableBehaviour mTrackableBehaviour;      //声明该类的实例
  5         void Start(){
  6           mTrackableBehaviour = GetComponent<TrackableBehaviour>();
  //对类的实例进行初始化
  7           if (mTrackableBehaviour){
  8           mTrackableBehaviour.RegisterTrackableEventHandler(this);
  //注册追踪事件处理监听
  9         }}
  10        public void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus,
  11          TrackableBehaviour.Status newStatus){                    //实现接口的方法
  12          if (newStatus == TrackableBehaviour.Status.DETECTED ||   //当状态为检测
  13            newStatus == TrackableBehaviour.Status.TRACKED ||      //当状态为追踪
  14            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED){
  //当状态为扩展追踪
  15              OnTrackingFound();                             //执行物体可追踪方法
  16          }else{OnTrackingLost(); }}                         //执行物体追踪丢失方法
  17        private void OnTrackingFound(){
  //当符合追踪状态时,获取子物体的Render和Collider组件
  18          Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
  19          Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
  20          foreach (Renderer component in rendererComponents){ //遍历渲染器组件数组
  21            component.enabled = true;                         //将每个渲染器都置为可用
  22          }
  23          foreach (Collider component in colliderComponents){
  24            component.enabled = true;       //遍历碰撞器数组并将其置为可用
  25          }}
  26        private void OnTrackingLost(){      //当不符合追踪状态时,获取渲染组件和碰撞器组件
  27          Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
  28          Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
  29          foreach (Renderer component in rendererComponents){  //遍历渲染器组件数组
  30            component.enabled = false;               //将每个渲染器都置为不可用
  31          }
  32          foreach (Collider component in colliderComponents){
  33            component.enabled = false;               //遍历碰撞器数组并将其置为不可用
  34   }}}}
  第1-4行引用Vuforia命名空间并声明TrackableBehaviour类的实例。
  第5-9行重写Start方法,对mTrackableBehaviour变量进行实例化并注册追踪事件处理监听。
  第10-16行实现该类继承接口中的方法,当符合摄像机追踪状态时执行物体可追踪方法,否则执行物体追踪丢失的方法。
  第17-19行当符合追踪状态时,获取子物体的Render组件和Collider组件。
  第20-25行遍历渲染器和碰撞器组件数组,并将其置为可用。
  第26-34行表示当物体不符合追踪状态时,在获取渲染组件与碰撞器组件后将其置为不可用。
本文选自《VR及AR开发高级教程—基于Unity》第三章,本站经人民邮电出版社和作者的授权。
版权声明:51Testing软件测试网获清华大学出版社和作者授权连载本书部分章节。任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
物体识别Object Recognition—VR及AR开发高级教程(5)
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号