![](/img/trans.png)
[英]Keep 3D object on screen even after Image target lost in VUFORIA and UNITY
[英]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.