簡體   English   中英

即使目標丟失,也可以將對象/ 3D模型保留在屏幕上(UNITY + Vuforia)

[英]Keeping the object/3D Model on the screen even when the target is lost (UNITY + Vuforia)

我想將對象/ 3D模型保持在移動屏幕的中心,即使目標丟失 (跟蹤丟失())以及目標找到最后跟蹤的圖像模型應該消失。 我正在使用團結。

我試圖關注cloudreco樣本,但不能正確。

我正在使用的屏幕居中:

GameObject lost = GameObject.Find ("IT"+mTrackableBehaviour.TrackableName);

lost.transform.position=Camera.main.ScreenToWorldPoint(new Vector3(Screen.width/2, Screen.height/2, Camera.main.nearClipPlane) );


我有大約10個圖像目標,最大同時圖像跟蹤設置為1。
尋找解決方案。
謝謝 !

編輯:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
namespace Vuforia
{
    /// <summary>
    /// A custom handler that implements the ITrackableEventHandler interface.
    /// </summary>
    public class dtehedit : MonoBehaviour,
    ITrackableEventHandler
    {

        #region PRIVATE_MEMBER_VARIABLES

        private TrackableBehaviour mTrackableBehaviour;
        private bool firsttime=false;
        //private bool secondtime=false;
        GameObject lost, lostclone;
        #endregion // PRIVATE_MEMBER_VARIABLES



        #region UNTIY_MONOBEHAVIOUR_METHODS

        void Start()
        {
            Debug.Log ("start method before registring");
            mTrackableBehaviour = GetComponent<TrackableBehaviour>();
            if (mTrackableBehaviour)
            {
                mTrackableBehaviour.RegisterTrackableEventHandler(this);
            }
            Debug.Log ("start method after registring");
        }

        #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()
        {
            firsttime = true;
            if (lostclone != null) {
                Debug.Log ("LOST CLONE otf ::" + lostclone.name);
                DestroyObject (lostclone); // (1) if new object is scanned gameobject lostclone is not destroyed
            }

            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");
        }


        private void OnTrackingLost()
        {
//          Debug.Log (firsttime);
//          if (!firsttime) {
//              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;
//              }
//
//          } else {
//              string itname = mTrackableBehaviour.TrackableName;
//              Debug.Log ("lost trackable name " + itname);
//              GameObject lost = GameObject.Find ("IT" + itname);
// (2) WOrking but dont know how to reposition gameobject after next tracker is found 
//              lost.transform.GetChild(0).transform.position=Camera.main.ScreenToWorldPoint(new Vector3(Screen.width/2, Screen.height/2, Camera.main.nearClipPlane+20) ); 
// (3) workinh but dont know how to reset camera position when next tracker is found
////                Camera.main.transform.position = lost.transform.GetChild(0).transform.position + lost.transform.GetChild(0).transform.forward * 25;
////                Camera.main.transform.LookAt (lost.transform.GetChild(0).transform);
//          }


                            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;
                            }
            if (firsttime) {
                string itname = mTrackableBehaviour.TrackableName;
                Debug.Log ("lost trackable name " + itname);
                lost = GameObject.Find ("IT" + itname).transform.GetChild (0).gameObject;
                lostclone = Instantiate (lost) as GameObject; //decoupling
                Debug.Log ("LOST CLONE ::"+lostclone.name);
            }
            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
        }

        #endregion // PRIVATE_METHODS
    }
}

對於上面的代碼,我嘗試了三種方法/方法,在跟蹤丟失后將我的3D模型放在屏幕上,但似乎沒有一個完美或按需

我通過實例化方法解耦/克隆了我的3d對象但是當我再次找到跟蹤器時,最后一個沒有被銷毀(1)以及如何讓它來到相機前面

我將3dobject移動到了跟蹤丟失的相機上,但是當再次跟蹤發現如何將我的3dmodel再次移到原始位置時(2)

我在跟蹤丟失后將相機移動到我的3dobject但是再次跟蹤發現如何將相機帶到原始位置(3)
請看看代碼,請幫助我..不知道我錯過了什么......?

我看了你的代碼,修改了一下,我相信這應該可以解決你的問題。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
namespace Vuforia
{
    /// <summary>
    /// A custom handler that implements the ITrackableEventHandler interface.
    /// </summary>
    public class dtehedit : MonoBehaviour,
    ITrackableEventHandler
    {

        #region PRIVATE_MEMBER_VARIABLES

        private TrackableBehaviour mTrackableBehaviour;
        private bool firsttime = false;
        string itname = "";
        //private bool secondtime=false;
        GameObject lost, lostclone;
        #endregion // PRIVATE_MEMBER_VARIABLES



        #region UNTIY_MONOBEHAVIOUR_METHODS

        void Start()
        {
            Debug.Log("start method before registring");
            mTrackableBehaviour = GetComponent<TrackableBehaviour>();
            if (mTrackableBehaviour)
            {
                mTrackableBehaviour.RegisterTrackableEventHandler(this);
            }
            Debug.Log("start method after registring");
        }

        #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()
        {
            // This is wrong because you never set it to false. Every time a tracker(image) is found it will be the first time - wrong.
            //      firsttime = true;      


            if (lostclone != null)
            {
                Debug.Log("LOST CLONE otf ::" + lostclone.name);
                // DestroyObject(lostclone); // (1) if new object is scanned gameobject lostclone is not destroyed
            }

            //Here you can reset the position of the GameObject back to the parent(tracker)'s position. 
            this.transform.GetChild(0).transform.position = new Vector3(0, 0, 0);

            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");
        }


        private void OnTrackingLost()
        {
            Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
            Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

            // What you can do is not disable this
            //foreach (Renderer component in rendererComponents)
            //{
            //    component.enabled = false;
            //}

            // Disable colliders: Disable this if you need it diabled only
            foreach (Collider component in colliderComponents)
            {
                component.enabled = false;
            }

            string itname = mTrackableBehaviour.TrackableName;
            Debug.Log("lost trackable name " + itname);
            GameObject lost = GameObject.Find("IT" + itname);
            //(2) WOrking but dont know how to reposition gameobject after next tracker is found

            // This is not decoupling but it should work ( you dont need to find the gameobject you can use [this] instead)
            this.transform.GetChild(0).transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width / 2, Screen.height / 2, Camera.main.nearClipPlane + 20));
            // Disable rendering:

            itname = mTrackableBehaviour.TrackableName;
            Debug.Log("lost trackable name " + itname);
            lost = GameObject.Find("IT" + itname).transform.GetChild(0).gameObject;
            // this is not I ment by decoupling sory, I ment de parenting -> (gameObject.parent = null)
            //lostclone = Instantiate(lost) as GameObject; //decoupling
        }

        #endregion // PRIVATE_METHODS
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM