unity vuforia AR模型多卡切换后脱卡效果

找unity同事要的一个脚本直接加上去

 

 

这是脱卡的管理类

TrackManager.cs

using UnityEngine;
using System.Collections;

public class TrackManager : MonoBehaviour
{

    #region 单例
    private static TrackManager _instance;
    public static TrackManager Instance { get { return _instance; } }
    void Awake()
    {
        _instance = this;
    }
    #endregion

    private Transform _camera;
    private Transform _target;
    private Transform _model;

    void Start()
    {
        _camera = Camera.main.transform;
    }

    /// <summary>
    /// 识别到图片时
    /// </summary>
    /// <param name="target"></param>
    public void OnTrackingFound(Transform target)
    {
        if (_target == null)
        {
            _target = target;
            _model = _target.GetChild(0);
            InitModel();
        }
        else if (_target == target) //如果再次识别到的图片还是上次的识别图
        {
            InitModel();
        }
        else    //当前的识别图不是上次的识别图
        {
            ResetModel();   //重置上次的模型

            _target = target;
            _model = _target.GetChild(0);
            InitModel();
        }
    }

    /// <summary>
    /// 脱离图片时
    /// </summary>
    /// <param name="model"></param>
    public void OnTrackingLost(Transform target)
    {
        if (_target == null) //初始化时调用TrackLost则全部将模型隐藏
            HideModel(target.GetChild(0).gameObject);
        else
            ShowInCamera(); //否则设为相机子对象显示在屏幕中
    }

    /// <summary>
    /// 在识别图上重置
    /// </summary>
    void InitModel()
    {
        if (_model == null || _target == null)
            return;
        if (_model.parent == _target)   //判断当前模型的父对象是否是识别图
        {
            _model.localPosition = Vector3.zero;
            _model.localEulerAngles = Vector3.zero;
            _model.localScale = Vector3.one;
        }
        else
        {
            _model.parent = null;
            _model.localScale = Vector3.one;
            _model.parent = _target;
            _model.localPosition = Vector3.zero;
            _model.localEulerAngles = Vector3.zero;
        }

        ShowModel();
    }

    /// <summary>
    /// 脱离识别图时重置模型
    /// </summary>
    void ResetModel()
    {
        if (_model == null || _target == null)
            return;
        _model.parent = null;
        _model.localScale = Vector3.one;
        _model.parent = _target;
        _model.position = Vector3.zero;
        _model.eulerAngles = Vector3.zero;

        HideModel();
    }

    /// <summary>
    /// 脱离识别图后的模型显示在屏幕中央
    /// </summary>
    void ShowInCamera()
    {
        if (_model == null || _camera == null)
            return;
        if (_model.parent == _camera)
        {
            _model.localPosition = new Vector3(0f, -0.25f, 1.5f);
			_model.localEulerAngles = new Vector3(0f,90f,0f);
            _model.localScale = Vector3.one;
        }
        else
        {
            _model.parent = null;
            _model.localScale = Vector3.one;
            _model.parent = _camera;
			_model.localPosition = new Vector3(0f, -0.25f, 1.5f);
			_model.localEulerAngles = new Vector3(0f,90f,0f);
        }

        ShowModel();
    }

    /// <summary>
    /// 隐藏模型
    /// </summary>
    void HideModel()
    {
        if (_model != null)
            _model.gameObject.SetActive(false);
    }

    /// <summary>
    /// 初始化时隐藏模型
    /// </summary>
    /// <param name="model"></param>
    void HideModel(GameObject model)
    {
        model.SetActive(false);
    }

    /// <summary>
    /// 显示模型
    /// </summary>
    void ShowModel()
    {
        if (_model != null)
            _model.gameObject.SetActive(true);
    }
}

 同时在vuforia的DefaultTrackableEventHandler类中引用这个类

TrackableEventHandler.cs

 

/*==============================================================================
Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc.
All Rights Reserved.
Confidential and Proprietary - Protected under copyright and other laws.
==============================================================================*/

using UnityEngine;

namespace Vuforia
{
    /// <summary>
    /// A custom handler that implements the ITrackableEventHandler interface.
    /// </summary>
    public class TrackableEventHandler : MonoBehaviour,
                                                ITrackableEventHandler
    {
        #region PRIVATE_MEMBER_VARIABLES
 
        private TrackableBehaviour mTrackableBehaviour;
    
        #endregion // PRIVATE_MEMBER_VARIABLES



        #region UNTIY_MONOBEHAVIOUR_METHODS
    
        void Start()
        {
            mTrackableBehaviour = GetComponent<TrackableBehaviour>();
            if (mTrackableBehaviour)
            {
                mTrackableBehaviour.RegisterTrackableEventHandler(this);
            }
        }

        #endregion // UNTIY_MONOBEHAVIOUR_METHODS



        #region PUBLIC_METHODS

        /// <summary>
        /// Implementation of the ITrackableEventHandler function called when the
        /// tracking state changes.
        /// </summary>
        public void OnTrackableStateChanged(
                                        TrackableBehaviour.Status previousStatus,
                                        TrackableBehaviour.Status newStatus)
        {

            if (newStatus == TrackableBehaviour.Status.DETECTED ||
                newStatus == TrackableBehaviour.Status.TRACKED ||
                newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
            {
                OnTrackingFound();
            }
            else
            {
                OnTrackingLost();
            }
        }

        #endregion // PUBLIC_METHODS



        #region PRIVATE_METHODS


        private void OnTrackingFound()
        {
			

//            Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
//            Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
//
//            // Enable rendering:
//            foreach (Renderer component in rendererComponents)
//            {
//                component.enabled = true;
//            }
//
//            // Enable colliders:
//            foreach (Collider component in colliderComponents)
//            {
//                component.enabled = true;
//            }

            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
			TrackManager.Instance.OnTrackingFound(mTrackableBehaviour.transform);
        }


        private void OnTrackingLost()
        {
			

//            Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
//            Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
//
//            // Disable rendering:
//            foreach (Renderer component in rendererComponents)
//            {
//                component.enabled = false;
//            }
//
//            // Disable colliders:
//            foreach (Collider component in colliderComponents)
//            {
//                component.enabled = false;
//            }

            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
			TrackManager.Instance.OnTrackingLost(mTrackableBehaviour.transform);
        }

        #endregion // PRIVATE_METHODS
    }
}

 

 最后在每个imageTarget上添加这个脚本,并把原先的vuforia自带的那个删掉

 

转载于:https://www.cnblogs.com/liunnn/p/7601654.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值