Aller au contenu

Créer ses comportements

Dépot GitHub InMind-VR

InMind-VR fournit un ensemble d'exemples de développements compatibles VRmaze dans son espace GitHub.

Chargement des comportements

Pour permettre un chargement des comportements dans VRmaze, il convient de les intégrer via une librairie compilée (fichier .dll). VRmaze charge dynamiquement ces plugins au lancement.

Création d'un comportement

VRmaze repose sur Unity 3D pour la visualisation 3D. Il est donc possible de créer ses comportements propres utilisant la logique d'Unity, basée sur le système de comportements (MonoBehaviour). Les comportements génériques ne nécessitent pas de dépendances supplémentaires et peuvent être intégrés dans VRmaze sans problème.

Détection de collision

Dans VRmaze, il est possible d'ajouter une collision à n'importe quel objet de la structure de l'arbre de manière à pouvoir détecter son entrée dans une zone via la méthode Unity void OnTriggerEnter(Collider other).

Comportement d'interaction

VRmaze dispose d'un système d'interaction spécifique permettant de fonctionner aussi bien à la souris ou au périphérique complexe en réalité virtuelle. Ce système repose sur une interface C# générique permettant de développer des comportements qui seront exécutés en passation.

Voici le code de l'interface IEventListener :

public interface IEventListener{
    void OnOver(); //Appelé lorsque le pointeur est sur l'objet
    void OnExit(); //Appelé une fois lorsque le pointeur n'est plus sur l'objet
    void OnEnter(); //Appelé une fois lorsque le pointeur entre en survole de l'objet
    void OnAction(); //Appelé lorsque l'objet est survolé et lorsque l'utilisateur utilise le bouton d'action
    void OnAction(int buttonIndex);//Appelé lorsque l'objet est survolé et lorsque l'utilisateur utilise n'importe quel bouton du périphérique de pointage
}

Exemple complet

Voir l'exemple complet ici.

Cette interface est étendue pour pouvoir utiliser des périphériques plus complexes, comme les joysticks VR ou même permettre plus d'action à la souris :

public interface ISteamVREventListener : IEventListener {
    void OnTouchpadChange(Vector2 value);
    void OnTriggerChange(float value);
}

public interface IMouseEventListener : IEventListener {
    void OnRightClick();
    void OnMiddleClick();
}

Accès direct aux données interne de VRmaze

Il est possible d'obtenir les informations interne de la passation via la classe LiveData :

  • Evenement de pointage
  • Timer
  • Données Sujet

Obtenir les informations de pointage

Il est tout à fait possible d'obtenir les informations de pointage (classe RayCastHit de Unity). Pour cela, VRmaze donne accès a un ensemble d'information sous forme d'une classe statique nommée "LiveData"

public class GetPointingDataBehaviourExample : MonoBehaviour
    {
        //2023 and above
        // LiveEventManagerDirectAccess.Singleton donne accès aux informations calculées par le gestionnaire l'évenements de vrmaze. Les informations sont mises à jour automatiquement a chaque frame.
        void Update()
        {
            LogRays();
            LogHits();
            LogObjects();
        }

        public void LogRays()
        {
            Debug.Log("Rays launched :" + LiveData.EventManager.Rays.Count);
            foreach (var item in LiveData.EventManager.Rays) 
                Debug.Log("Ray data:" + item.origin.ToString() + " " + item.direction);            
        }

        public void LogObjects()
        {
            Debug.Log("Objects hit :" + LiveData.EventManager.Objects.Count);
            foreach (var item in LiveData.EventManager.Objects)
                Debug.Log("Object info:" + item.name);
        }

        public void LogHits()
        {
            Debug.Log("Hits count :" + LiveData.EventManager.Hits.Count);
            foreach (var item in LiveData.EventManager.Hits)
                Debug.Log("Hit info:" + item.point.ToString());
        }

        //Méthode permettant d'afficher quelques informations.
        void OnGUI()
        {
            for(int i =0;i< LiveData.EventManager.Hits.Count;i++)
                GUI.Label(new Rect(0, i*50, 500, 50), "We hit something : " + LiveEventManagerDirectAccess.Singleton.Hits[i].point);
        }
    }

Il est possible d'obtenir les interactions aux joysticks et boutons (binaires et analogiques) :

public class RetreiveInteractionDeviceDataBehaviourExample : MonoBehaviour
    {
        void Update()
        {
            Console.WriteLine("Retreiving Interaction devices Data !");
            foreach (var item in LiveData.EventManager.InteractionData)
            {
                Console.WriteLine(item.Identifier);

                //We can get Vector3 values (containing verctor2 sometimes)
                foreach (var axe in item.Axes)
                {
                    Console.WriteLine("Axis value : " + axe.ToString());
                }

                //We can get float values
                foreach (var analog in item.Analogs)
                {
                    Console.WriteLine("Analog value : " + analog.ToString());
                }

                //We can get bool values
                foreach (var digital in item.Digitals)
                {
                    Console.WriteLine("digital value : " + digital.ToString());
                }
            }
        }
    }

Exemple complet

Voir l'exemple complet ici

Utiliser les informations de sujet et de temps

Il est possible de connaitre la position du sujet et son orientation :


public class VRmazeSubjectDisplayer : MonoBehaviour
    {
        void OnGUI()
        {
            GUI.Label(new Rect(5, 20, 200, 20), "Current Subject position:"+ LiveData.Subject.HeadPosition.ToString());
            GUI.Label(new Rect(5, 40, 200, 20), "Current Subject rotation:"+ LiveData.Subject.HeadRotation.ToString());
        }
    }

Voici un exemple d'utilisation du temps courant de VRmaze :


public class VRmazeTimerDisplayer : MonoBehaviour
    {
        void OnGUI()
        {
            GUI.Label(new Rect(5, 20, 200, 20), "Current Unity time:"+ Time.time.ToString());
            GUI.Label(new Rect(5, 40, 200, 20), "Current VRmaze time:" + LiveData.Timer.CurrentTimer.ToString());
            GUI.Label(new Rect(5, 60, 200, 20), "Current Experiment time:" + LiveData.Timer.CurrentExperimentTimer.ToString());
            GUI.Label(new Rect(5, 80, 200, 20), "Current Trial time:" + LiveData.Timer.CurrentTrialTimer.ToString());
        }
    }