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

我目前用的是高通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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值