利用自定義識別可以不用上傳圖片到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);
}