高通vuforia动态加载、卸载、对焦、翻转摄像头、控制识别数模板

来源:互联网 发布:2011年网络男歌手 编辑:程序博客网 时间:2024/05/05 14:03

我目前用的是高通6117版本的SDK,最新版函数改动不多,大体上一致,话不多说上代码

using UnityEngine;using System.Collections;using Vuforia;using System.Collections.Generic;using System.IO;using UnityEngine.UI;public class Vuforia_Template : MonoBehaviour{    private string sz_DataPath = null;    private bool b_LoadDataSet = false;    private ObjectTracker m_ObjectTracker = null;    private DataSet m_DataSet = null;    private ImageTargetBehaviour[] m_ImageTargetBehaviours = null;    private static Vuforia_Template _insttance = null;    /// <summary>    /// 是否为使用本地识别库数据    /// </summary>    [Header("是否为使用本地识别库数据")]    public bool b_Location = false;    public static Vuforia_Template Instance    {        get { return _insttance; }    }    public string GetDataPath    {        get { return sz_DataPath; }        set { sz_DataPath = value; }    }    private void Awake()    {        _insttance = this;    }    void Start()    {        //string path = Application.isEditor ? Application.persistentDataPath.Replace("/" + Application.productName, "") : Application.persistentDataPath;        //GetDataPath = path + "/" + "Capable" + ".xml";        VuforiaBehaviour.Instance.RegisterVuforiaStartedCallback(RegisterVuforiaStartedCallback);    }    void RegisterVuforiaStartedCallback()    {        StartCoroutine(LoadDataSet());    }    public void StartLoadDataSet(string data_name)    {        sz_DataPath = data_name;        StartCoroutine(LoadDataSet());    }    #region Public_Method    IEnumerator LoadDataSet()    {            Debug.Log(sz_DataPath);            yield return new WaitUntil(delegate {                return !string.IsNullOrEmpty(sz_DataPath);            });        yield return new WaitForSecondsRealtime(0.5f);        if (VuforiaRuntimeUtilities.IsVuforiaEnabled())        {            m_ObjectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();            m_DataSet = m_ObjectTracker.CreateDataSet();            if (m_DataSet == null && !b_Location)            {                b_LoadDataSet = m_DataSet.Load(sz_DataPath, VuforiaUnity.StorageType.STORAGE_ABSOLUTE);//绝对路径 一般用来网络下载的识别库            }            else            {                b_LoadDataSet = m_DataSet.Load(sz_DataPath);//本地预制的识别库            }        }        yield return null;        if (b_LoadDataSet)        {            m_ObjectTracker.ActivateDataSet(m_DataSet);        }        yield return new WaitUntil(() => FindObjectsOfType<ImageTargetBehaviour>().Length>0);        UpdateImageTarget();        CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO);        yield return new WaitForSeconds(.5f);        CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);        m_ObjectTracker.Start();//开启识别器 (可以理解为摄像头)    }    void UpdateImageTarget()    {        m_ImageTargetBehaviours = FindObjectsOfType<ImageTargetBehaviour>();        for (int i = 0; i < m_ImageTargetBehaviours.Length; i++)        {            ImageTargetBehaviour imageTargetBehaviour = m_ImageTargetBehaviours[i];            GameObject temp_cube = GameObject.CreatePrimitive(PrimitiveType.Cube);            temp_cube.transform.localPosition = new Vector3(0, 0.4f, 0);            temp_cube.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);            temp_cube.transform.SetParent(imageTargetBehaviour.transform,false);            imageTargetBehaviour.name = m_ImageTargetBehaviours[i].ImageTarget.Name + "Target";            imageTargetBehaviour.gameObject.AddComponent<DefaultTrackableEventHandler>();            imageTargetBehaviour.gameObject.AddComponent<TurnOffBehaviour>();        }    }    public void UnLoadDataSet(ImageTargetBehaviour[] imageTargetBehaviours = null)    {        if (m_ImageTargetBehaviours != null && m_ImageTargetBehaviours.Length>0&& imageTargetBehaviours ==null)        {            imageTargetBehaviours = m_ImageTargetBehaviours;        }        bool isVuforiaEnabled = VuforiaRuntimeUtilities.IsVuforiaEnabled();        if (isVuforiaEnabled)        {            ObjectTracker tracker = TrackerManager.Instance.GetTracker<ObjectTracker>();            tracker.Stop();            tracker.DeactivateDataSet(m_DataSet);            IEnumerable<DataSet> dataSets = tracker.GetActiveDataSets();            IEnumerator<DataSet> dEnumerator = dataSets.GetEnumerator();            List<DataSet> list = new List<DataSet>();            while (dEnumerator.MoveNext())            {                list.Add(dEnumerator.Current);            }            for (int i = 0; i < list.Count; i++)            {                tracker.DeactivateDataSet(list[i]);                tracker.DestroyDataSet(list[i], true);            }            for (int i = 0; i < imageTargetBehaviours.Length; i++)            {                TrackerManager.Instance.GetStateManager().DestroyTrackableBehavioursForTrackable(imageTargetBehaviours[i].Trackable);            }        }    }    public IEnumerator SetFocusMode()    {        CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO);        yield return new WaitForSeconds(.5f);        CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);    }    public void SetCameraDirection(CameraDevice.CameraDirection CameraDirection)    {        CameraDevice.Instance.Stop();        CameraDevice.Instance.Deinit();        CameraDevice.Instance.Init(CameraDirection);        CameraDevice.Instance.Start();#if UNITY_IPHONE        if (CameraDirection == CameraDevice.CameraDirection.CAMERA_FRONT)            StartCoroutine(shuaxin());#elif UNITY_ANDROID#endif    }    IEnumerator shuaxin()    {        yield return new WaitForEndOfFrame();        Camera.main.transform.localEulerAngles = new Vector3(0, 0, 180.0f);    }    public void SetTrackedImageCount(int TrackedCount)    {        VuforiaUnity.SetHint(VuforiaUnity.VuforiaHint.HINT_MAX_SIMULTANEOUS_IMAGE_TARGETS, TrackedCount);    }    public void SetTrackedObjectCount(int TrackedCount)    {        VuforiaUnity.SetHint(VuforiaUnity.VuforiaHint.HINT_MAX_SIMULTANEOUS_OBJECT_TARGETS, TrackedCount);    }    #endregion}


阅读全文
1 0