Vuforia----自定义目标识别
1、1、插件导入
访问https://developer.vuforia.com/downloads/sdk,进入如下界面,并下载vuforiaSDK的Unity版本。
2、创建工程
新建一个Unity工程并将下载好的插件导入到Unity中。
3、场景搭建
删除场景中原有的MainCamera,接着从Vuforia->Prefabs路径下将AR Camera,ImageTarget以及UserDefinedTargetBuilder拖入场景。
接着在AR Camera的Inspector面板下添加AppLicenseKey。随后在ImageTarge的Inspector面版下将ImageTarget类型设置为UserDefined,如下图:
2、接下来我们需要添加模型了,这里就用Cube代替了,我们在ImageTarget下添加一个Cube。最后创建Button按钮,也就是我们创建自定义识别图最重要的一步。
3、编写脚本
在Project下新建一个C#脚本,脚本主框架如下:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Vuforia;
public class UDTTest : MonoBehaviour ,IUserDefinedTargetEventHandler
{
void Start ()
{
}
public void OnFrameQualityChanged(ImageTargetBuilder.FrameQuality frameQuality) { }
public void OnInitialized() { }
public void OnNewTrackableSource(TrackableSource trackableSource) { }
public void BuildNewTarget()
{
}
}
这个类当中比较关键的就是IUserDefinedTargetEventHandler这个接口,这个接口中定义了OnFrameQualityChanged,OnInitialized,OnNewTrackableSource这三个方法,我们实现这个接口中的三个方法,并将脚本附加到UserDefinedTargetBuilder上。
首先我们需要声明一个UserDefinedTargetBuildingBehaviour类型的变量,接着在Start函数里将当前类注册为该类型事件。
UserDefinedTargetBuildingBehaviour mTargetBuildingBehaviour;
void Start ()
{
mTargetBuildingBehaviour = GetComponent<UserDefinedTargetBuildingBehaviour>();
if (mTargetBuildingBehaviour)
{
mTargetBuildingBehaviour.RegisterEventHandler(this);
Debug.Log("Registering User Defined Target event handler.");
}
}
接下来要实现接口中的三个函数,先是OnInitialized,用来初始化一些数据,我们在这个函数里写入下面的代码:
public void OnInitialized()
{
mObjectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
if (mObjectTracker != null)
{
mBuiltDataSet = mObjectTracker.CreateDataSet();
mObjectTracker.ActivateDataSet(mBuiltDataSet);
}
}
这里用到两个新的变量需要提前声明,如下:
ObjectTracker mObjectTracker;
// 新定义的数据集添加到DataSet里
DataSet mBuiltDataSet;
接着是OnFrameQualityChanged这个函数,用来更新当前帧质量。我们在里面写入下面的代码:
public void OnFrameQualityChanged(ImageTargetBuilder.FrameQuality frameQuality)
{
mFrameQuality = frameQuality;
if (mFrameQuality == ImageTargetBuilder.FrameQuality.FRAME_QUALITY_LOW)
{
Debug.Log("Low camera image quality");
}
}
这里的mFrameQuality 是一个用来记录当前帧图像质量的枚举类型,声明如下:
ImageTargetBuilder.FrameQuality mFrameQuality = ImageTargetBuilder.FrameQuality.FRAME_QUALITY_NONE;
最后也是最重要的一个方法OnNewTrackableSource,代码如下:
public void OnNewTrackableSource(TrackableSource trackableSource)
{
mTargetCounter++;
// Deactivates the dataset first
mObjectTracker.DeactivateDataSet(mBuiltDataSet);
// Destroy the oldest target if the dataset is full or the dataset
// already contains five user-defined targets.
if (mBuiltDataSet.HasReachedTrackableLimit() || mBuiltDataSet.GetTrackables().Count() >= 5)
{
IEnumerable<Trackable> trackables = mBuiltDataSet.GetTrackables();
Trackable oldest = null;
foreach (Trackable trackable in trackables)
{
if (oldest == null || trackable.ID < oldest.ID)
oldest = trackable;
}
if (oldest != null)
{
Debug.Log("Destroying oldest trackable in UDT dataset: " + oldest.Name);
mBuiltDataSet.Destroy(oldest, true);
}
}
// Get predefined trackable and instantiate it
ImageTargetBehaviour imageTargetCopy = (ImageTargetBehaviour)Instantiate(ImageTargetTemplate);
imageTargetCopy.gameObject.name = "UserDefinedTarget-" + mTargetCounter;
// Add the duplicated trackable to the data set and activate it
mBuiltDataSet.CreateTrackable(trackableSource, imageTargetCopy.gameObject);
// Activate the dataset again
mObjectTracker.ActivateDataSet(mBuiltDataSet);
}
这个函数里需要提前声明的变量有两个,如下:
int mTargetCounter;
//声明一个公开的ImageTargetBehaviour然后在Unity中赋值
public ImageTargetBehaviour ImageTargetTemplate;
最后一个就是我们自定义的一个函数BuildNewTarget,代码如下:
public void BuildNewTarget()
{
mTargetBuildingBehaviour.BuildNewTarget("test", 50);
}
然后还需要返回到Unity中进行一些细微的设置调整,将我们的脚本拖到UserDefinedTargetBuilder下,并给ImageTargetTemplate进行赋值,如下图:
3、然后我们在Button上添加点击事件,步骤如下:
4、然后在UserDefinedTargetBuilder上勾选Start scanning automatically,表示开启自动扫描。
5、运行工程,首先去拍摄一张图片,界面如下:
5、将我们需要自定义的识别图置于取景框内,点击Button,便可识别出Cube,将识别图移除摄像头取景范围,模型消失,再次扫描刚才的识别图,依然出现模型。如下:
6、至此,Vuforia的自定义目标识别,介绍完毕,大家可以根据自己的需求,发挥想象力,制作出属于自己的炫酷AR产品。