Vuforia基礎設置請參考:https://blog.csdn.net/qq_39308897/article/details/78037870;
因爲Unity2017內置了Vuforia,在安裝Unity的時候勾上就行了。
第一步:點擊左上角的菜單欄File-Build Settings-Plyaer Settings-XR Setting-Vuforia Augmented Reality Support選項勾上
第二步:刪除場景內自帶的Main Camera,然後在Hierachy視圖下右鍵-Vuforia-ARCamera新建一個ARCamera和Image,此時如果你沒有導入Vuforia的資源包的話,會提示你是否導入,點擊Import
第三步:點擊Hierachy視圖內的ImageTarget,可以在它的Inspector視圖下看到它掛載了一個ImageTargetBehaviour腳本,我們點開其中的advanced展開高級菜單,並把ExtendedTracking選項勾選上,這表示這張識別圖已經支持擴展追蹤功能,同時並把ImageTargetBehaviour腳本下的Type類型改成UserDefined。
第四步:我們在Project視圖中右鍵新建一個C#腳本,命名爲UserDefinedTest,在UserDefinedTest腳本中,我們需要引用一下Vuforia和System.Linq類,並繼承IUserDefinedTargetEventHandler類,聲明幾個關鍵變量,並在Start方法裏爲變量賦值。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
using System.Linq;
public class UserDefinedTest : MonoBehaviour, IUserDefinedTargetEventHandler
{
UserDefinedTargetBuildingBehaviour m_UserDefinedTarget;
ObjectTracker m_ObjectTracker;
DataSet m_DataSet;
ImageTargetBuilder.FrameQuality m_FrameQuality;
int m_TargetCount;
public ImageTargetBehaviour m_ImageTarget;
void Start () {
m_UserDefinedTarget = this.GetComponent<UserDefinedTargetBuildingBehaviour>();//獲取掛載這個腳本的物體上的UserDefinedTargetBuildingBehaviour腳本
m_FrameQuality = ImageTargetBuilder.FrameQuality.FRAME_QUALITY_NONE;
if (m_UserDefinedTarget != null)
{
m_UserDefinedTarget.RegisterEventHandler(this);
}
}
}
第五步:實現IUserDefinedTargetEventHandler類裏的方法,他們分別爲在初始化階段調用的OnInitialized(),在新增識別圖數據時調用的OnNewTrackableSource(TrackableSource trackableSource),綁定在Button上用以新增識別圖的BuildNewImageTarget(),以及OnFrameQualityChanged(ImageTargetBuilder.FrameQuality frameQuality)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
using System.Linq;
public class UserDefinedTest : MonoBehaviour, IUserDefinedTargetEventHandler
{
UserDefinedTargetBuildingBehaviour m_UserDefinedTarget;
ObjectTracker m_ObjectTracker;
DataSet m_DataSet;
ImageTargetBuilder.FrameQuality m_FrameQuality;
int m_TargetCount;
public ImageTargetBehaviour m_ImageTarget;
void Start () {
m_UserDefinedTarget = this.GetComponent<UserDefinedTargetBuildingBehaviour>();//獲取掛載這個腳本的物體上的UserDefinedTargetBuildingBehaviour腳本
m_FrameQuality = ImageTargetBuilder.FrameQuality.FRAME_QUALITY_NONE;
if (m_UserDefinedTarget != null)
{
m_UserDefinedTarget.RegisterEventHandler(this);
}
}
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_DataSet = m_ObjectTracker.CreateDataSet();//如果m_ObjectTracker不爲空的話,m_DataSet等於我新創建的數據集
m_ObjectTracker.ActivateDataSet(m_DataSet); //激活數據集
}
}
public void OnNewTrackableSource(TrackableSource trackableSource)
{
m_TargetCount++;//每新增一次識別圖,m_TargetCount自增一次
m_ObjectTracker.DeactivateDataSet(m_DataSet);//關閉數據集
//當數據飽和或者大於設定數字5的時候,刪除最初保存的那個數據,以此類推
if (m_DataSet.HasReachedTrackableLimit() || m_DataSet.GetTrackables().Count() >= 5)
{
IEnumerable<Trackable> trackables = m_DataSet.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);
m_DataSet.Destroy(oldest, true);
}
}
//創建一個新的ImageTarget,併爲其命名
ImageTargetBehaviour ImageTBCopy = (ImageTargetBehaviour)Instantiate(m_ImageTarget);
ImageTBCopy.gameObject.name = "CustomImageTarget-" + m_TargetCount;
//將創建過的ImageTarget添加到數據集中
m_DataSet.CreateTrackable(trackableSource, ImageTBCopy.gameObject);
//激活數據集
m_ObjectTracker.ActivateDataSet(m_DataSet);
}
public void BuildNewImageTarget()
{
//創建新識別圖,括號中前一個變量是名字,後一個變量是識別圖的Size;
m_UserDefinedTarget.BuildNewTarget("CustomImageTarget" + m_TargetCount,1);
}
}
第六步:在Hierachy視圖中右鍵-Create Empty創建一個空物體,點擊Add Component,輸入UserDefinedTargetBuildingBehaviour添加並勾選Start Scanning automatically選項,用同樣的方法添加UserDefinedTest腳本,並把Hierachy視圖中的ImageTarget賦給UserDefinedTest腳本下的m_ImageTarget中。
第七步:在Hierachy視圖中右鍵-UI-Button新建一個Button,在Button組件上找到OnClick欄,點擊OnClick欄右下角的加號新增一個監聽事件,並把剛剛新創建的GameObject拖入監聽事件中,選擇BuildNewImageTarget()方法。
第八步:我們在ImageTarget下新建一個Cube,在程序運行的時候點擊Game視窗下的Button就可以看到我們成功創建了一張自定義識別圖。