unity脱卡后使物体显示在屏幕中央

  • 直接在ImageTarget下的DefaultTrackableEventHandler脚本中修改
  • 首先在ARCamera下创建一个空的游戏物体并调整z轴距离
  • 需要创建两个对象一个是你需要脱卡后居中的模型一个是空物体
  • 创建一个transform来储存模型初始位置
        public GameObject house;//室外场景模型
        public GameObject arempty;//arcamera下的空物体

        private Transform housrTransform;//模型的位置

1.在start方法里将模型位置初始化

2.接着需要创建一个Bool值来判断是否脱卡,并且要还需要一个Bool值来判断是否是第一次识别到物体初始值都为false

private bool isFirst = false ;//是否第一次识别到物体
private bool isTuoKa = false;//是否脱卡

3.在OnTrackingFound()方法里将isFirst设为true;   isTuoKa为false

4.在OnTrackingLost()方法里判断if(!isFirst)则执行两个foreach函数体;否则else使isTuoKa设为true并且将ARCamera下空物体的位置赋给模型,接着令模型的父物体为ARCamera下空物体且位置一样;要想使脱卡后物体面对着你,需要给他固定旋转度,如housrTransform.localEulerAngles = new Vector3(-90, 0, 0)使模型的x轴旋转度为-90度;固定脱卡后大小也是一样调用transform下的localScale方法使之等于new Vector3(   x  , y    ,  z  )三个值

5.这样之后脱卡后就能显示在屏幕中央且能固定位置,但是再次扫描图就不行了;

6.要想再次扫描可以,那么我们创建一个Bool值来判断是否返回这里我用的Tkreturn,初始值为false

7.当isTuoKa为true时,位置什么的全变换完后令Tkreturn为true,之后在OnTrackingFound()方法里再次将父物体变回来,再调整当地的欧拉角的值,但是在固定大小时需要判断Tkreturn是否为true,如果不判断再次扫描时大小不是很大就是很小。

全部代码如下:

/*==============================================================================
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 DefaultTrackableEventHandler : MonoBehaviour,
                                                ITrackableEventHandler
    {
        #region PRIVATE_MEMBER_VARIABLES
        public GameObject house;//室外场景模型
        public GameObject arempty;//arcamera下的空物体

        private Transform housrTransform;//模型的位置


        private bool isFirst = false ;//是否第一次识别到物体
        private bool isTuoKa = false;//是否脱卡
        private bool Tkreturn = false;


        private TrackableBehaviour mTrackableBehaviour;

        #endregion // PRIVATE_MEMBER_VARIABLES


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

        #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);
            isFirst = true;
            isTuoKa = false;
            house.transform .position  = this.transform.position;
            housrTransform.SetParent(transform);
            housrTransform.localEulerAngles = new Vector3(0, 180, 0);
            if (Tkreturn)
            {
                housrTransform.localScale = new Vector3(0.015f, 0.0151f, 0.015f);
            }
            // 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");
        }


        private void OnTrackingLost()
        {
            Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
            Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
            if (!isFirst) {
               // Disable rendering:
                foreach (Renderer component in rendererComponents)
                {
                    component.enabled = false;
                }

                // Disable colliders:
                foreach (Collider component in colliderComponents)
                {
                    component.enabled = false;
                }

            }
            else
            {
                isTuoKa = true;
                house.transform.position = arempty.transform.position;//令house的位置等于arcamera下空物体的位置
                housrTransform.SetParent(arempty.transform);//使父物体为arempet且位置与父物体一样
                housrTransform.localEulerAngles = new Vector3(-90, 0, 0);//脱卡之后使之面对着你
                housrTransform.localScale = new Vector3(0.2f, 0.2f, 0.2f);//脱卡之后固定物体大小
                Tkreturn = true;
            }
            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
        }

        #endregion // PRIVATE_METHODS
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值