利用自定义识别可以不用上传图片到Vuforia官网,也可以动态生成/修改识别图来达到在本地修改识别图的目的。
利用Vuforia进行自定义图片的识别(自定义识别是不支持虚拟按键的)
1.新建工程并将Vuforia插件导入Unity
2.因为是自定义识别图,不用将图片上传到官网,也就不用下载相应的图片数据包
3.将原始场景中的MainCamera删除,并拖入vuforia预制件中的ARCamera,ImageTarget和UserDefinedTargetBuilder拖入
4.导一个模型进去并放到ImageTarget下面...
5.在ARCamera下面的VuforiaBehaviour下点击OpenVuforiaConfiguration,输入LicenseKey,然后将ImageTarget的类型设置为UserDefined。
6.写脚本,这里脚本名字叫做UDTTest,挂到UserDefinedTargetBuilder下,然后将UserDefinedTargetBuilder脚本的Start scanning auto勾上,表示开启自动扫描
这个脚本,需要用到Vuforia命名空间, System.Linq命名空间,需要实现接口
IUserDefinedTargetEventHandler,具体代码框架如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using Vuforia;
public class UDTTest : MonoBehaviour,IUserDefinedTargetEventHandler
{
ObjectTracker m_objectTracker;
DataSet m_BuildDataSet;
ImageTargetBuilder.FrameQuality m_FrameQuality;
public int m_TargetCounter;
public ImageTargetBehaviour ImageTargetTemplate;
UserDefinedTargetBuildingBehaviour m_TargetBuildingBehaviour;
// Use this for initialization
void Start () {
m_TargetBuildingBehaviour = this.GetComponent<UserDefinedTargetBuildingBehaviour>();
if (m_TargetBuildingBehaviour!=null)
{
m_TargetBuildingBehaviour.RegisterEventHandler(this);
}
}
// Update is called once per frame
void Update () {
}
public void OnFrameQualityChanged(ImageTargetBuilder.FrameQuality frameQuality)
{
m_FrameQuality = frameQuality;
if (m_FrameQuality == ImageTargetBuilder.FrameQuality.FRAME_QUALITY_LOW)
{
Debug.Log("Low Camera Image Quality ");
}
}
public void OnInitialized()
{
m_objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
if (m_objectTracker != null)
{
m_BuildDataSet = m_objectTracker.CreateDataSet();
m_objectTracker.ActivateDataSet(m_BuildDataSet); //激活数据集
}
}
public void OnNewTrackableSource(TrackableSource trackableSource)
{
m_objectTracker.Stop(); //停止追踪才能激活数据集
m_TargetCounter++;
m_objectTracker.DeactivateDataSet(m_BuildDataSet);//创建一个新的数据集
//如果trackable满了或者已经定义了5个识别对象,那么删除旧的DataSet
if (m_BuildDataSet.HasReachedTrackableLimit() || m_BuildDataSet.GetTrackables().Count() > 5)
{
IEnumerable<Trackable> trackables = m_BuildDataSet.GetTrackables();
Trackable oldest = null;
foreach (Trackable trackable in trackables)
{
if (oldest ==null || trackable.ID < oldest.ID)
{
oldest = trackable;
}
}
if (oldest != null)
{
m_BuildDataSet.Destroy(oldest, true);
}
}
//定义Trackable并实例化
ImageTargetBehaviour imageTargetCopy = Instantiate(ImageTargetTemplate);
//Instantiate<ImageTargetBehaviour>()(ImageTargetTemplate);
imageTargetCopy.gameObject.name = "UserDefinedTarget-" + m_TargetCounter;
//复制一个Trckable到imageTargetCopy上并让它激活
m_BuildDataSet.CreateTrackable(trackableSource, imageTargetCopy.gameObject);
m_objectTracker.ActivateDataSet(m_BuildDataSet);
m_objectTracker.Start();
}
public void OnBuildButtonClick()
{
m_TargetBuildingBehaviour.BuildNewTarget("Test2", 50);
}