I want to Keep the object/3D Model on the center of mobile screen even when the target is lost (on tracking lost()) and when target found last tracked image model should disappear. I'm using unity.
I tried to follow cloudreco sample but not able to that properly.
for centering of screen i'm using :
GameObject lost = GameObject.Find ("IT"+mTrackableBehaviour.TrackableName);
lost.transform.position=Camera.main.ScreenToWorldPoint(new Vector3(Screen.width/2, Screen.height/2, Camera.main.nearClipPlane) );
I have around 10 image targets with max simultaneous images tracking set to 1.
looking for solution.
Thanks !
EDIT :
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
}
}
for the above code, I tried three methods/approaches to have my 3D Model on screen after tracking lost but none seems to work perfectly or as desired
I have decoupled/cloned my 3d object by instantiate method but when I found tracker again last one is not destroyed (1) and how to make it to come in front of camera
I move my 3dobject to camera on trackinglost but when Again trackingfound how to take my 3dmodel again to original position (2)
I move my camera to my 3dobject after trackinglost but when again trackingfound how to take camera to original position(3)
please have a look at code and please help me .. dont know what i'm missing ...?
ScreenToWorldPoint, you can position yourGameObjectwhere theCamerais and just use thetranform.forwardvector to move yourGameObjectwhere the camera is looking. - HristoGameObjectfrom yourImageTargetI presume. Since they have a child - parent relationship, when the image/marker is lost, yourGameObjectis being deactivated. - Hristo