Anchoring in Vuforia

Viewed 818

I'm able to fix the position of the object once it's spawned. But, the object is placed onto different position on every tap on the screen. I want to avoid this problem and want my object to be fixed in a spawned position throughout the Session or Application lifetime.

This is my Deploy Stage Once script:

public class DeployStageOnce : MonoBehaviour
{

    public GameObject AnchorStage;
    private PositionalDeviceTracker _deviceTracker;
    private GameObject _anchorGameObject;
    private GameObject _previousAnchor;

    public void Start()
    {
        if (AnchorStage == null)
        {
            Debug.Log("AnchorStage must be specified");
            return;
        }
        AnchorStage.SetActive(false);
    }
    public void Awake()
    {
        VuforiaARController.Instance.RegisterVuforiaStartedCallback(OnVuforiaStarted);
    }
    public void OnDestroy()
    {
        VuforiaARController.Instance.UnregisterVuforiaStartedCallback(OnVuforiaStarted);
    }
    private void OnVuforiaStarted()
    {
        _deviceTracker = TrackerManager.Instance.GetTracker<PositionalDeviceTracker>();
    }

    private void AnchorGameObjectSetHitTestPosition(HitTestResult reuslt)

    {

        _anchorGameObject.transform.position = reuslt.Position;

        _anchorGameObject.transform.rotation = reuslt.Rotation;

    }


    public void OnInteractiveHitTest(HitTestResult result)
    {
        if (result == null || AnchorStage == null)
        {
            Debug.LogWarning("Hit test is invalid or AnchorStage not set");
            return;
        }
        var anchor = _deviceTracker.CreatePlaneAnchor(Guid.NewGuid().ToString(), result);
        _anchorGameObject = new GameObject();
        AnchorGameObjectSetHitTestPosition(result);
        if (anchor != null)
        {

            AnchorStage.transform.parent = _anchorGameObject.transform;

            AnchorStage.transform.localPosition = Vector3.zero;

            AnchorStage.transform.localRotation = Quaternion.identity;

            AnchorStage.SetActive(true);

                    }
        if (_previousAnchor != null)
        {
            Destroy(_previousAnchor);
        }
        _previousAnchor = _anchorGameObject;
    }
}
1 Answers

Well you can create an isPlaced variable in your script to check if your object is already placed like this:

private bool isPlaced = false;

    public void OnInteractiveHitTest(HitTestResult result)
    {
        if (result == null || AnchorStage == null)
        {
            Debug.LogWarning("Hit test is invalid or AnchorStage not set");
            return;
        }
        if(!isPlaced)
        { 
            var anchor = _deviceTracker.CreatePlaneAnchor(Guid.NewGuid().ToString(), result);
            _anchorGameObject = new GameObject();
            AnchorGameObjectSetHitTestPosition(result);
            if (anchor != null)
            {

                AnchorStage.transform.parent = _anchorGameObject.transform;

                AnchorStage.transform.localPosition = Vector3.zero;

                AnchorStage.transform.localRotation = Quaternion.identity;

                AnchorStage.SetActive(true);

            }           
            isPlaced = true;
        }
}
Related