Vuforia7 for Unity2017.3用戶自定義識別圖及擴展追蹤

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就可以看到我們成功創建了一張自定義識別圖。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章