Page 1 sur 1

[RESOLU] Culling mode pour UI

Publié : 17 Déc 2018 16:35
par Leuprochon
Bonjour à tous !

Alors j'ai un petit soucis.

J'ai réalisé un dialogue avec une boite qui apparaît/disparait avec ce tuto :

https://www.youtube.com/watch?v=_nRzoTzeyxU

Tout fonctionne bien.

Par contre je veux faire l'insérer dans une application en RA et la plus rien ne va ! Normalement il faut mettre le Culling Mode sur Cull Completely afin de lancer les animations que lorsque l'objet à tracké est bien détecté. Sauf que pour les UI j'ai cru comprendre que ça ne fonctionnait pas ....

Quelqu'un aurait une idée de comment faire ? Juste une case à cocher "Culling Mode pour UI" ça serait super :p, mais je doute que ça fonctionne !!

Merci à vous et bonne journée !

Leuprochon

Re: Culling mode pour UI

Publié : 18 Déc 2018 12:39
par Leuprochon
J'ai trouvé une piste intéressante je pense.

J'essaye d'utiliser un trigger (on/off ) qui passe sur On uniquement quand l'objet est détecté (Model Target de Vuforia). Malheureusement ça ne fonctionne pas, voici le code :

Si quelqu'un a une idée !

Code : Tout sélectionner

/*==============================================================================
    Copyright (c) 2017 PTC Inc. All Rights Reserved.
     
    Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc.
    All Rights Reserved.
    Confidential and Proprietary - Protected under copyright and other laws.
    ==============================================================================*/

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;

/// <summary>
///     A custom handler that implements the ITrackableEventHandler interface.
/// </summary>
public class EnableAnimation : MonoBehaviour, ITrackableEventHandler
{
	#region PRIVATE_MEMBER_VARIABLES

	protected TrackableBehaviour mTrackableBehaviour;
	public Animator animator;

	#endregion // PRIVATE_MEMBER_VARIABLES

	#region UNTIY_MONOBEHAVIOUR_METHODS

	protected virtual void Start()
	{
		mTrackableBehaviour = GetComponent<TrackableBehaviour>();
		if (mTrackableBehaviour)
			mTrackableBehaviour.RegisterTrackableEventHandler(this);
	}

	#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)
		{

			AudioSource audio = GetComponent<AudioSource> ();
			audio.Play ();
			animator.SetBool ("IsOpen", true);
		}
		else
		{
			AudioSource audio = GetComponent<AudioSource> ();
			audio.Stop ();
			animator.SetBool ("IsOpen", false);
		}
	}

	#endregion // PUBLIC_METHODS

	#region PRIVATE_METHODS

	protected virtual void OnTrackingFound()
	{
		var rendererComponents = GetComponentsInChildren<Renderer>(true);
		var colliderComponents = GetComponentsInChildren<Collider>(true);
		var canvasComponents = GetComponentsInChildren<Canvas>(true);

		// Enable rendering:
		foreach (var component in rendererComponents)
			component.enabled = true;

		// Enable colliders:
		foreach (var component in colliderComponents)
			component.enabled = true;

		// Enable canvas':
		foreach (var component in canvasComponents)
			component.enabled = true;

		animator.SetBool ("IsOpen", true);

	}


	protected virtual void OnTrackingLost()
	{
		var rendererComponents = GetComponentsInChildren<Renderer>(true);
		var colliderComponents = GetComponentsInChildren<Collider>(true);
		var canvasComponents = GetComponentsInChildren<Canvas>(true);


		// Disable rendering:
		foreach (var component in rendererComponents)
			component.enabled = false;

		// Disable colliders:
		foreach (var component in colliderComponents)
			component.enabled = false;

		// Disable canvas':
		foreach (var component in canvasComponents)
			component.enabled = false;

		animator.SetBool ("IsOpen", false);

	}

	#endregion // PRIVATE_METHODS
}


Re: Culling mode pour UI

Publié : 18 Déc 2018 16:31
par boubouk50
Alors effectivement, le ITrackableEventHandler est la bonne manière de détecter si l'objet est tracké ou non.
Ce que tu peux faire, c'est enlever le script de base de Vuforia (DefaultTrackableEventHandler) sur ton target et le remplacer par le tien. Tu copies-colles leur script et ajoute tes trucs dedans.
Le mieux serait d'ajouter une fonction.
MyTrackableEventHandler.cs

Code : Tout sélectionner

/*==============================================================================
Copyright (c) 2017 PTC Inc. All Rights Reserved.

Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc.
All Rights Reserved.
Confidential and Proprietary - Protected under copyright and other laws.
==============================================================================*/

using UnityEngine;
using Vuforia;

/// <summary>
/// A custom handler that implements the ITrackableEventHandler interface.
///
/// Changes made to this file could be overwritten when upgrading the Vuforia version.
/// When implementing custom event handler behavior, consider inheriting from this class instead.
/// </summary>
public class MyTrackableEventHandler : MonoBehaviour, ITrackableEventHandler
{
    #region PROTECTED_MEMBER_VARIABLES

    protected TrackableBehaviour mTrackableBehaviour;
    protected TrackableBehaviour.Status m_PreviousStatus;
    protected TrackableBehaviour.Status m_NewStatus;

    #endregion // PROTECTED_MEMBER_VARIABLES

	//Declaration de l'AudioSource et de l'animator
	private AudioSource audio;
	public Animator animator;

    #region UNITY_MONOBEHAVIOUR_METHODS

    protected virtual void Start()
    {
    	//Initialisation de l'Audiosource: ICI seulement si l'Audiosource est sur cet objet sinon aller chercher le bon!!
    	audio = GetComponent<AudioSource> ();
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();
        if (mTrackableBehaviour)
            mTrackableBehaviour.RegisterTrackableEventHandler(this);
    }

    protected virtual void OnDestroy()
    {
        if (mTrackableBehaviour)
            mTrackableBehaviour.UnregisterTrackableEventHandler(this);
    }

    #endregion // UNITY_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)
    {
        m_PreviousStatus = previousStatus;
        m_NewStatus = newStatus;

        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
            OnTrackingFound();
            AnimationAudio (true);
        }
        else if (previousStatus == TrackableBehaviour.Status.TRACKED &&
                 newStatus == TrackableBehaviour.Status.NO_POSE)
        {
            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
            OnTrackingLost();
            AnimationAudio (false);
        }
        else
        {
            // For combo of previousStatus=UNKNOWN + newStatus=UNKNOWN|NOT_FOUND
            // Vuforia is starting, but tracking has not been lost or found yet
            // Call OnTrackingLost() to hide the augmentations
            OnTrackingLost();
            AnimationAudio (false);
        }
    }

    #endregion // PUBLIC_METHODS

	private void AnimationAudio (bool isPlaying) {
		if (isPlaying)
			audio.Play ();
		else
			audio.Stop ();
		animator.SetBool ("IsOpen", isPlaying);
	}

    #region PROTECTED_METHODS

    protected virtual void OnTrackingFound()
    {
        var rendererComponents = GetComponentsInChildren<Renderer>(true);
        var colliderComponents = GetComponentsInChildren<Collider>(true);
        var canvasComponents = GetComponentsInChildren<Canvas>(true);

        // Enable rendering:
        foreach (var component in rendererComponents)
            component.enabled = true;

        // Enable colliders:
        foreach (var component in colliderComponents)
            component.enabled = true;

        // Enable canvas':
        foreach (var component in canvasComponents)
            component.enabled = true;
    }


    protected virtual void OnTrackingLost()
    {
        var rendererComponents = GetComponentsInChildren<Renderer>(true);
        var colliderComponents = GetComponentsInChildren<Collider>(true);
        var canvasComponents = GetComponentsInChildren<Canvas>(true);

        // Disable rendering:
        foreach (var component in rendererComponents)
            component.enabled = false;

        // Disable colliders:
        foreach (var component in colliderComponents)
            component.enabled = false;

        // Disable canvas':
        foreach (var component in canvasComponents)
            component.enabled = false;
    }

    #endregion // PROTECTED_METHODS
}

Re: Culling mode pour UI

Publié : 18 Déc 2018 16:48
par Leuprochon
Super merci !! Le problème venait du fait que je n'assignais pas le script au bon objet !! Il fallait juste remplacer le script de Vuforia par le miens dans le Model Target comme tu m'as dit.

Merci bien !!

Leuprochon

Re: Culling mode pour UI

Publié : 18 Déc 2018 19:25
par boubouk50
A sujet résolu...