第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软件测试网获清华大学出版社和作者授权连载本书部分章节。任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。