我们在开发一些AR应用的时候有时候会需要与识别图进行一些简单的交互,这就可以利用.Vuforia自带的VirtualButton功能来利用识别图和虚拟物体有一个简单的交互
步骤:
1.首先导入Vuforia,这里使用的是Vuforia6.2.10的版本,Unity2017.1.0f3。
2.将识别图的数据包导入该工程。
3.删除原始场景中的MainCamera,再从Vuforia-Perfabs中将ARCamera和ImageTarget拖到场景
4.在ARCamera的Inspector中 找到其上的VuforiaBehaviour组件,并点击OpenVuforiaConfiguration进入编辑界面。 在AppLicenseKey 中输入LicenseKey,并将Datasets中的LoadxxDatabase勾选(xx为你的DatabaseName),其余设置可按需要设置。
5.然后设置ImageTarget。
(白色的ImgTarget
,
这里需要在Assets-Editor-Vuforia-ImageTargetTextures-xx(DatabaseName) 中,找到识别图,将其TextureShape改成2D即可
)
)
6.将Vuforia-Perfabs 中的VirtualButton 拖到场景中,拖到指定的位置。图中浅蓝色的位置是按下VirtualButton可以生效的位置。
7.假设我们需要按键来控制方块的颜色,首先新建脚本,这个脚本目的是来控制VirtualButton。
8.设置一个tag,为了便于找到目标立方体,也就是图中的黄色立方体,需要在脚本中控制他的颜色。建立这个脚本名字为VirtualBTCtrl,同时也是这个类的名字,需要用到命名空间Vuforia, 这个类不仅需要继承自MonoBehaviour,还需要实现接口IVirtualButtonEventHandler,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
public class VirtualBTCtrl : MonoBehaviour,IVirtualButtonEventHandler
{
...
public void OnButtonPressed(VirtualButtonAbstractBehaviour vb)
{
}
public void OnButtonReleased(VirtualButtonAbstractBehaviour vb)
{
}
}
其中需要实现
public void OnButtonPressed(VirtualButtonAbstractBehaviour vb)
{
//Code
}
public void OnButtonReleased(VirtualButtonAbstractBehaviour vb)
{
//Code
}
这两个方法 ,这两个方法用来监听虚拟按键按下和释放的事件。为了触发这个事件,我们要将之前添加的VirtualButton对象注册到时间系统。所以需要在Start方法中寻找所有的VirtualButtonBehaviour组件并利用其RegisterEventHandler方法将当前对象,也就是重载了上面两个函数的脚本的对象 作为参数传入。
在Start方法中获得所有子物体(这个脚本挂在ImageTarget上,VirtualButton是其子物体)的VirtualButtonBehaviour组件:
VirtualButtonBehaviour[] vbBehaviours = this.GetComponentsInChildren<VirtualButtonBehaviour>();
for (int i = 0; i < vbBehaviours.Length; i++)
{
vbBehaviours[i].RegisterEventHandler(this); //注册所有的vb事件
}
之后便可以在OnButtonPressed 和 OnButtonReleased 中实现我们需要的功能
不过在判断是哪一个按键被按下时需要用一个switch-case结构,判断按下的按键的名称(VirtualButtonName),这个VirtualButtonName 在每个VirtualButton上的Inspector面板中的VirtualButtonBehaviour面可以修改。
public void OnButtonPressed(VirtualButtonAbstractBehaviour vb)
{
//mat是在start方法中获得的立方体的材质
switch (vb.VirtualButtonName)
{
case "VirtualButton_R": mat.color = Color.red;
break;
case "VirtualButton_G": mat.color = Color.green;
break;
case "VirtualButton_B": mat.color = Color.blue;
break;
default:
break;
}
}
public void OnButtonReleased(VirtualButtonAbstractBehaviour vb)
{
mat.color = Color.yellow;
}
9.最后把我们写的VirtualBTCtrl脚本拖到ImageTarget下。
10.结果
注:
虚拟按键的位置尽量在识别图中的识别点比较多的地方,这样识别效果会比较好。
本文内容参考加速想象力出版的AR与VR开发实战教程。