/*****************************************************
    * UPDATE THUMB/INDEX ROTATION
    *
    * INFO:    Maintient à jour la rotation de l'objet 3D
    *          en fonction du pouce et de l'index de la main.
    *          Ajuste dynamiquement la vitesse de rotation
    *          selon la position du ou des doigts qui
    *          causent la rotation. C'est ici qu'on valide
    *          quels sont les doigts ouverts.
    *
    *          *** TO OPTIMIZE ***
    *
    *****************************************************/
    private void ThumbIndexRotation()
    {
        //Si la main qui permet d'effecuer la rotation est détectée.
        //Si la manipulation contrôlé d'objet est activé.
        if (DetectionController.GetInstance().IsHandDetected(ThumbOrIndexGesture.GetInstance().GetHand()) &&
            PalmUIController.GetInstance().IsManipulationControlled())
        {
            //La liste des objets sélectionnés avec le raycast
            List <SelectedObject> objectsToRotateList = SelectionController.GetInstance().GetSelectedObjects();

            if (objectsToRotateList.Count > 0)
            {
                //Recupère le contrôleur de la la main
                detectedHand = DetectionController.GetInstance().GetHand(ThumbOrIndexGesture.GetInstance().GetHand());

                //Change l'etat des doigts si le pouce et/ou l'index est ouvert
                if (detectedHand.GetFinger(FingersE.pouce).IsFingerOpen() || detectedHand.GetFinger(FingersE.index).IsFingerOpen())
                {
                    isThumbOpen = detectedHand.GetFinger(FingersE.pouce).IsFingerOpen() ? true : false;
                    isIndexOpen = detectedHand.GetFinger(FingersE.index).IsFingerOpen() ? true : false;
                }

                foreach (SelectedObject objectToRotate in objectsToRotateList)
                {
                    //Applique la rotation en fonction de la force
                    Vector3 rotationSpeed   = stopPosition * amplifyFingerRotation;
                    Vector3 dynamicRotation = objectToRotate.TransformObject.worldToLocalMatrix * rotationSpeed;
                    objectToRotate.TransformObject.Rotate(dynamicRotation);

                    startPosition = Vector3.Lerp(stopPosition, Vector3.zero, Time.deltaTime);
                }
            }
        }
    }
예제 #2
0
    /*****************************************************
    * DETECTED SINGLE FINGER GESTURE
    *
    * INFO:    Valide la détection du geste qui consiste à
    *          garder le pouce ou l'index ou l'index et le pouce
    *          ouvert.La fonction communique directement avec
    *          le médiateur du contrôleur de gestes.
    *
    *****************************************************/
    public override bool IsDetectedGesture()
    {
        bool isFingerOpen = false;

        //Si la main est détectée
        if (DetectionController.GetInstance().IsHandDetected(hand))
        {
            //Recupère le contrôleur de la la main
            DetectionController.HandController detectedHand = DetectionController.GetInstance().GetHand(hand);

            for (int i = 0; i < 4; i++)
            {
                if (detectedHand.GetFinger((FingersE)i).IsFingerOpen())
                {
                    //Si le ou les bons doigts de la main sont ouverts
                    if ((FingersE)i == FingersE.pouce || (FingersE)i == FingersE.index)
                    {
                        isFingerOpen = true;
                    }
                    else
                    {
                        return(false);
                    }
                }
            }
        }
        //DisplayDectedGesture(isFingerOpen);
        return(isFingerOpen);
    }
    /*****************************************************
    * UPDATE
    *
    * INFO:    Recupere la distance du scaling et met à jour
    *          l'objet à chaque frame. Un amplificateur de
    *          mouvement est utilisé pour faciliter le
    *          redimensionnement.
    *
    *          Ex: Si l'amplificateur est de 2.0f et que les
    *          mains se déplacent de 1" vers l'extérieur,
    *          l'objet va grossir de 2" dans tous les sens.
    *
    *****************************************************/
    void Update()
    {
        //Si la manipulation contrôlé d'objet est activé et que les deux mains sont détectés.
        if (isScaling && DetectionController.GetInstance().IsBothHandsDetected() &&
            PalmUIController.GetInstance().IsManipulationControlled())
        {
            //La liste des objets sélectionnés avec le raycast
            List <SelectedObject> objectsToScaleList = SelectionController.GetInstance().GetSelectedObjects();

            if (objectsToScaleList.Count > 0)
            {
                float newDistance = GetDistance();
                float distance    = newDistance - lastDistance;

                foreach (SelectedObject objectToScale in objectsToScaleList)
                {
                    // Met à jour la dimension de l'objet (X,Y,Z) avec l'amplificateur pris en compte.
                    objectToScale.TransformObject.localScale += new Vector3(distance, distance, distance) * amplifyScale;

                    // Évite que le redimensionnement de l'objet soit trop petit ou trop grand
                    if (objectToScale.GetScale().x < minimumScale)
                    {
                        objectToScale.TransformObject.localScale = new Vector3(minimumScale, minimumScale, minimumScale);
                    }
                    if (objectToScale.GetScale().x > maximumScale)
                    {
                        objectToScale.TransformObject.localScale = new Vector3(maximumScale, maximumScale, maximumScale);
                    }
                }
                lastDistance = newDistance;
            }
        }
    }
    /*****************************************************
    * UPDATE HAND & FINGERTIP IMAGE
    *
    * INFO:    Affiche en temps réel la detection de la
    *          main gauche et droite.
    *          Affiche les doigts qui sont détectés par
    *          le LeapMotion pour la main gauche et droite.
    *
    *****************************************************/
    private void UpdateHandFingertipImage()
    {
        // Main gauche
        if (DetectionController.GetInstance().IsHandDetected(HandsE.gauche))
        {
            // Controleur de la main gauche
            Hand leftHand = DetectionController.GetInstance().GetHand(HandsE.gauche).GetLeapHand();

            //Un point vert (image) est affiché si le doigt de la main gauche est détecté
            L_Hand.enabled        = true;
            L_Thumb.enabled       = leftHand.GetThumb().IsExtended ? true : false;
            L_Index.enabled       = leftHand.GetIndex().IsExtended ? true : false;
            L_Majeur.enabled      = leftHand.GetMiddle().IsExtended ? true : false;
            L_Annulaire.enabled   = leftHand.GetRing().IsExtended ? true : false;
            L_Auriculaire.enabled = leftHand.GetPinky().IsExtended ? true : false;
        }

        // Main droite
        if (DetectionController.GetInstance().IsHandDetected(HandsE.droite))
        {
            // Controleur de la main droite
            Hand rightHand = DetectionController.GetInstance().GetHand(HandsE.droite).GetLeapHand();

            //Un point vert (image) est affiché si le doigt de la main droite est détecté
            R_Hand.enabled        = true;
            R_Thumb.enabled       = rightHand.GetThumb().IsExtended ? true : false;
            R_Index.enabled       = rightHand.GetIndex().IsExtended ? true : false;
            R_Majeur.enabled      = rightHand.GetMiddle().IsExtended ? true : false;
            R_Annulaire.enabled   = rightHand.GetRing().IsExtended ? true : false;
            R_Auriculaire.enabled = rightHand.GetPinky().IsExtended ? true : false;
        }
    }
    /*****************************************************
    * DETECTED FIST GESTURE
    *
    * INFO:    Valide la détection du geste qui consiste
    *          à effectuer un glissement de la main.
    *          La fonction communique directement avec le
    *          médiateur du contrôleur de gestes.
    *
    *          *** TO CHECK RIGHT SWIPE ***
    *
    *****************************************************/
    public override bool IsDetectedGesture()
    {
        bool isSwiping = false;

        swipeDirection = "";

        if (DetectionController.GetInstance().IsHandDetected(hand) && coolDownLeft <= 0.0f)
        {
            // Sert simplement de reference
            DirectionsE _direction = DirectionsE.droite;

            // Vérifie si la reference du geste est de type 'Swipe'
            if (IsHandSwiping(ref _direction))
            {
                // Si la reference equivaut bien au sens du glissement entré en paramètre
                if (_direction == direction)
                {
                    swipeDirection = direction.ToString();
                    coolDownLeft   = cooldownTime;
                    isSwiping      = true;
                }
            }
        }
        DisplayDectedGesture(isSwiping);
        return(isSwiping);
    }
예제 #6
0
    /*****************************************************
    * DETECTED FIST GESTURE
    *
    * INFO:    Valide la détection du geste qui consiste
    *          à tapper des mains. La fonction
    *          communique directement avec le médiateur
    *          du contrôleur de gestes.
    *
    *****************************************************/
    public override bool IsDetectedGesture()
    {
        bool isClapping = false;

        //Si les deux mains sont visibles
        if (DetectionController.GetInstance().IsBothHandsVisible() && cooldownLeft <= 0.0f)
        {
            //La main gauche et droite
            DetectionController.HandController leftHand  = DetectionController.GetInstance().GetHand(HandsE.gauche);
            DetectionController.HandController rightHand = DetectionController.GetInstance().GetHand(HandsE.droite);

            if (leftHand.GetHandVelocity().magnitude >= clapSpeed &&
                rightHand.GetHandVelocity().magnitude >= clapSpeed)
            {
                //Si les deux mains sont assez proche l'une de l'autre
                if (DetectionController.GetInstance().GetDistanceBetweenHands() <= handsDistance)
                {
                    cooldownLeft = cooldownTime;
                    isClapping   = true;
                }
            }
        }
        DisplayDectedGesture(isClapping);
        return(isClapping);
    }
예제 #7
0
    /*****************************************************
    * METHOD:  UPDATE
    *
    * INFO:    Recupere la distance de la translation et met
    *          à jour l'objet à chaque frame. Un amplificateur
    *          de mouvement est utilisé pour faciliter les
    *          déplacements.
    *
    *          Ex: Si l'amplificateur est de 2.0f et que la
    *          main se déplace de 1" vers la gauche, l'objet
    *          va se déplacer de 2" vers la gauche.
    *
    *****************************************************/
    void Update()
    {
        //Si la manipulation contrôlé d'objet est activé
        if (PalmUIController.GetInstance().IsManipulationControlled())
        {
            // Si la main initialisé avec le geste Fist est détecté, on effectue une translation
            if (isTranslating && DetectionController.GetInstance().IsHandDetected(hand))
            {
                //La liste des objets sélectionnés avec le raycast
                List <SelectedObject> objectsToTranslateList = SelectionController.GetInstance().GetSelectedObjects();
                if (objectsToTranslateList.Count > 0)
                {
                    // Calcul la distance du déplacement
                    Vector3 newHandPosition = GetStartHandPosition();
                    Vector3 handDistance    = newHandPosition - lastHandPosition;

                    foreach (SelectedObject objectToTranslate in objectsToTranslateList)
                    {
                        // Met à jour la position de l'objet (X,Y,Z) avec l'amplificateur pris en compte.
                        objectToTranslate.TransformObject.position += handDistance * amplifyMovement;
                    }
                    lastHandPosition = newHandPosition;
                }
            }
        }
    }
예제 #8
0
 /*****************************************************
 * GET POSITION
 *
 * INFO:    Retourne la position (x,y,z) de la main
 *          qui effectue la geste Fist.
 *
 *****************************************************/
 private Vector3 GetStartHandPosition()
 {
     return(DetectionController
            .GetInstance()
            .GetHand(hand)
            .GetHandPosition());
 }
예제 #9
0
    /*****************************************************
    * DETECTED ONLY INDEX GESTURE
    *
    * INFO:    Retourne vrai si seulement ce doigt est ouvert.
    *
    *****************************************************/
    public override bool IsDetectedGesture()
    {
        //Si la main du geste n'est pas détectée.
        if (!DetectionController.GetInstance().IsHandDetected(hand))
        {
            return(false);
        }

        DetectionController.HandController handController = DetectionController.GetInstance().GetHand(hand);
        onlyThisFingerOpened = false;

        //Pour tous les doigts de la main, partant de l'auriculaire
        for (int i = 0; i < (int)FingersE.auriculaire; i++)
        {
            FingersE _finger = FingersE.pouce + i;

            if (handController.GetFinger(_finger).IsFingerOpen())
            {
                //Verifie si seulement le doigt est ouvert et que les autres sont fermés
                if (_finger == finger)
                {
                    onlyThisFingerOpened = true;
                }
                else
                {
                    return(false);
                }
            }
        }
        DisplayDectedGesture(onlyThisFingerOpened);
        return(onlyThisFingerOpened);
    }
    /*****************************************************
    * GEST DISTANCE
    *
    * INFO:    Retourne la distance entre l'index (doigt)
    *          de la main gauche et l'index (doigt) de la
    *          main droite.
    *
    *****************************************************/
    private float GetDistance()
    {
        //Le doigt (index) de la main gauche et droite
        Vector3 leftFingerPosition  = DetectionController.GetInstance().GetHand(HandsE.gauche).GetFinger(FingersE.index).GetFingertipPosition();
        Vector3 rightFingerPosition = DetectionController.GetInstance().GetHand(HandsE.droite).GetFinger(FingersE.index).GetFingertipPosition();

        return(Vector3.Distance(leftFingerPosition, rightFingerPosition));
    }
예제 #11
0
 /*****************************************************
 *
 *
 * INFO:
 *
 *****************************************************/
 private void MoveWithBothHands()
 {
     if (isMoving && isHandSet && !isMovingPaused &&
         DetectionController.GetInstance().IsHandDetected(HandsE.gauche) &&
         DetectionController.GetInstance().IsHandDetected(HandsE.droite))
     {
     }
 }
    /*****************************************************
    * UPDATE SWIPE ROTATION
    *
    * INFO:    Evenement qui permet de maintenir a jour la
    *          rotation de l'objet lorsque l'utilisateur effectue
    *          un geste Swipe.
    *
    *          *** TO OPTIMIZE ***
    *
    *****************************************************/
    public void UpdateSwipeRotation()
    {
        //Si la manipulation contrôlé d'objet est activé
        if (PalmUIController.GetInstance().IsManipulationControlled())
        {
            //La liste des objets sélectionnés avec le raycast
            List <SelectedObject> objectsToRotateList = SelectionController.GetInstance().GetSelectedObjects();

            if (objectsToRotateList.Count > 0)
            {
                //Le type de Swipe effectué (gauche, droite, haut, bas)
                swipeType = GestureMediator.GetGestureType();
                if (swipeType.Contains("Swipe"))
                {
                    foreach (SelectedObject objectToRotate in objectsToRotateList)
                    {
                        detectedHand = DetectionController.GetInstance().GetHand(GestureMediator.GetDetectedHand());
                        float velocityX = 0f;
                        float velocityY = 0f;

                        //La velocité du swipe en X ou Y
                        if (isRotationX)
                        {
                            velocityX = -detectedHand.GetHandVelocity().x;
                        }
                        if (isRotationY)
                        {
                            velocityY = detectedHand.GetHandVelocity().y;
                        }

                        allowCoroutine = true;

                        //Rotation horizontale (Swipe gauche ou droite)
                        if (isRotationX && (swipeType.Contains("droite") || swipeType.Contains("gauche")))
                        {
                            //Demarre la rotation horizontale selon le type choisi (swipe lock angle / swipe velocity)
                            Vector3 axis = Mathf.Sign(velocityX) * Vector3.up;
                            StartCoroutine(isLockRotation ?
                                           RotateWhenSwipe(objectToRotate.TransformObject, axis, rotationAngle, secondsToRotate) :
                                           RotateFreeWhenSwipe(objectToRotate.TransformObject, axis, velocityX));
                        }

                        //Rotation verticale (Swipe haut ou bas)
                        if (isRotationY && (swipeType.Contains("haut") || swipeType.Contains("bas")))
                        {
                            //Demarre la rotation verticale selon le type choisi (swipe lock angle / swipe velocity)
                            Vector3 axis = Mathf.Sign(velocityY) * Vector3.right;
                            StartCoroutine(isLockRotation ?
                                           RotateWhenSwipe(objectToRotate.TransformObject, axis, rotationAngle, secondsToRotate) :
                                           RotateFreeWhenSwipe(objectToRotate.TransformObject, axis, velocityY));
                        }
                    }
                }
            }
        }
    }
예제 #13
0
 /*****************************************************
 * DETECTED FIST GESTURE
 *
 * INFO:    Valide la détection du geste qui consiste
 *          à fermer la main (poing). La fonction
 *          communique directement avec le médiateur
 *          du contrôleur de gestes.
 *
 *****************************************************/
 public override bool IsDetectedGesture()
 {
     isFisting = false;
     if (DetectionController.GetInstance().IsHandDetected(hand))
     {
         DetectionController.HandController handController = DetectionController.GetInstance().GetHand(hand);
         isFisting = handController.IsFist(tolerance) && handController.IsAllFingersClosed() && !BothFistGesture.GetInstance().IsBothFisting();
     }
     DisplayDectedGesture(isFisting);
     return(isFisting);
 }
예제 #14
0
 /*****************************************************
 * GET HAND AXIS
 *
 * INFO:    Retourne l'axe (vecteur) que prend les doigts
 *          de la main pour rendre le déplacement plus
 *          dynamique.
 *
 *****************************************************/
 public Vector3 GetHandAxis()
 {
     if (DetectionController.GetInstance().IsHandDetected(hand))
     {
         return(DetectionController
                .GetInstance()
                .GetHand(hand)
                .GetAxis(HandAxisE.doigt));
     }
     return(Vector3.zero);
 }
예제 #15
0
 /*****************************************************
 * GET RELATIVE HAND POSITION
 *
 * INFO:    Retourne la position relative de la main.
 *
 *****************************************************/
 Vector3 GetRelativeHandPosition()
 {
     if (DetectionController.GetInstance().IsHandDetected(hand))
     {
         return(DetectionController
                .GetInstance()
                .GetHand(hand)
                .GetRelativeHandPosition());
     }
     return(Vector3.zero);
 }
 /*****************************************************
 * UPDATE
 *
 * INFO:
 *
 *****************************************************/
 void Update()
 {
     if (DetectionController.GetInstance().IsHandDetected(HandsE.gauche) && !isPalmUIInitialized)
     {
         if (DetectionController.GetInstance().IsHandDetected(HandsE.gauche) && !isPalmUIInitialized)
         {
             //Activation de depart du Palm UI
             manipulationType.SetActive(true);
             isPalmUIInitialized = true;
         }
     }
 }
    /*****************************************************
    * UPDATE - TARGET OBJECT
    *
    * INFO:    Detection de l'action qui consiste a effectuer
    *          un tir (trigger) avec le pouce lorsque la main
    *          fait un geste de fusil (pouce et index).
    *
    *****************************************************/
    void Update()
    {
        isGunActionDetected = false;

        //Si le Palm UI n'est pas ouvert et la main droite détecté
        if (!PalmUIController.GetInstance().IsPalmUIOpen() &&
            DetectionController.GetInstance().IsHandDetected(raycastHand))
        {
            //Étape 1: l'index et le pouce (fusil) sont ouverts
            if (wasOnlyIndexThumbOpen)
            {
                //Étape 2: le pouce est désormais fermé (trigger) et l'index est ouvert
                if (isOnlyIndexOpen && !isOnlyIndexThumbOpen)
                {
                    //Le temps du trugger (pouce: ouvert --> fermé --> ouvert)
                    timer += Time.deltaTime;
                }
                //Étape 3: l'index et le pouce sont ouverts à nouveau et le trigger respecte le delais
                if (timer < triggerTimer && timer > 0f && wasOnlyIndexOpen && isOnlyIndexThumbOpen)
                {
                    isGunActionDetected = true;
                    timer = 0f;
                }
                //Pour tout déselectionner les objets, on maintient le pouce descendu plus longtemps
                if (timer > timeBeforeUnselect && timer > triggerTimer && isOnlyIndexOpen && !isOnlyIndexThumbOpen)
                {
                    //Change le materiel de couleur (rouge)
                    UnselectAllObjects(false);
                }
                //Si apres prolongation du pouce fermé et qu'on le relève, désélectionne tous les objets.
                if (timer > timeBeforeUnselect && timer > triggerTimer && wasOnlyIndexOpen && isOnlyIndexThumbOpen)
                {
                    //Remet le materiel par defaut et vide les liste de sélection
                    UnselectAllObjects(true);
                    timer = 0f;
                }

                //timer = 0f;
            }
            //Si on ne pointe pas et que le geste Gun (pouce et index) n'est pas détecté
            if (!isOnlyIndexOpen && !isOnlyIndexThumbOpen)
            {
                ResetAllState();
            }
        }
        else
        {
            ResetAllState();
        }
    }
예제 #18
0
    /*****************************************************
    * DETECTED PINCH GESTURE
    *
    * INFO:    Valide la détection du geste qui consiste à
    *          effectuer un pincement de doigt. La fonction
    *          communique directement avec le médiateur
    *          du contrôleur de gestes.
    *
    *****************************************************/
    public override bool IsDetectedGesture()
    {
        bool isPinching = false;

        if (DetectionController.GetInstance().IsHandDetected(hand))
        {
            //Valide si la tolerance est respectée et évite la confusion avec double pincement et le poing
            isPinching = DetectionController.GetInstance().GetHand(hand).IsHandPinching(tolerance) &&
                         !BothPinchGesture.GetInstance().IsBothPinching() && !FistGesture.GetInstance().IsFisting() &&
                         !OneFingerGesture.GetInstance().IsPointing();
        }
        DisplayDectedGesture(isPinching);
        return(isPinching);
    }
    /*****************************************************
    * IS HAND SWIPING
    *
    * INFO:    Valide le sens du glissement effectuée par
    *          la main et retourne la reponse.
    *
    *****************************************************/
    bool IsHandSwiping(ref DirectionsE _direction)
    {
        // Recupere le controleur de la main détectée
        DetectionController.HandController detectHand = DetectionController.GetInstance().GetHand(hand);

        // Recupere la velocité de la main
        Vector3 velocity = detectHand.GetHandVelocity();

        velocity = Camera.main.transform.InverseTransformDirection(velocity);

        // Glissement vers la droite (+X)
        if (velocity.x >= this.velocity)
        {
            _direction = DirectionsE.droite;
            return(true);
        }
        // Glissement vers la gauche (-X)
        else if (velocity.x <= -this.velocity)
        {
            _direction = DirectionsE.gauche;
            return(true);
        }
        // Glissement vers le haut (+Y)
        else if (velocity.y >= this.velocity)
        {
            _direction = DirectionsE.haut;
            return(true);
        }
        // Glissement vers le bas (-Y)
        else if (velocity.y <= -this.velocity)
        {
            _direction = DirectionsE.bas;
            return(true);
        }
        // Glissement vers l'interieur (+Z)
        else if (velocity.z >= this.velocity)
        {
            _direction = DirectionsE.interieur;
            return(true);
        }
        // Glissement vers l'exterieur (-Z)
        else if (velocity.z <= -this.velocity)
        {
            _direction = DirectionsE.exterieur;
            return(true);
        }

        return(false);
    }
    /*****************************************************
    * DETECTED FIST GESTURE
    *
    * INFO:    Valide la détection du geste qui consiste
    *          à fermer les deux mains (poing). La fonction
    *          communique directement avec le médiateur
    *          du contrôleur de gestes.
    *
    *****************************************************/
    public override bool IsDetectedGesture()
    {
        isBothFist = false;
        if (DetectionController.GetInstance().IsHandDetected(HandsE.gauche) &&
            DetectionController.GetInstance().IsHandDetected(HandsE.droite))
        {
            DetectionController.HandController leftHand  = DetectionController.GetInstance().GetHand(HandsE.gauche);
            DetectionController.HandController rightHand = DetectionController.GetInstance().GetHand(HandsE.droite);

            isBothFist = leftHand.IsFist(tolerance) && leftHand.IsAllFingersClosed() &&
                         rightHand.IsFist(tolerance) && rightHand.IsAllFingersClosed();
        }
        DisplayDectedGesture(isBothFist);
        return(isBothFist);
    }
    // Update is called once per frame
    void Update()
    {
        if (DetectionController.GetInstance().IsHandDetected(hand))
        {
            handController = DetectionController.GetInstance().GetHand(hand);

            //Si le doigt du raycast est le seul d'ouvert et le Palm UI n'est pas affiché
            if (handController.IsIndexOpened()) //&& !PalmUIController.GetInstance().IsPalmUIOpen()
            {
                //La position du bout du foigt et la direction auquelle il pointe
                fingerController         = handController.GetFinger(finger);
                light.transform.position = fingerController.GetFingertipPosition();
                light.transform.rotation = Quaternion.LookRotation(fingerController.GetFingerDirection());
            }
        }
    }
예제 #22
0
    /*****************************************************
    * DETECTED BOTH PINCH GESTURE
    *
    * INFO:    Valide la détection du geste qui consiste à
    *          effectuer un pincement de doigts avec les
    *          deux mains. La fonction communique directement
    *          avec le médiateur du contrôleur de gestes.
    *          Pincement du pouce et de l'index.
    *
    *****************************************************/
    public override bool IsDetectedGesture()
    {
        isBothPinch = false;
        if (DetectionController.GetInstance().IsBothHandsDetected() && DetectionController.GetInstance().IsBothHandsVisible())
        {
            //Tolerence acceptable du pincement
            bool leftHandPinching  = DetectionController.GetInstance().GetHand(HandsE.gauche).IsHandPinching(tolerance);
            bool rightHandPinching = DetectionController.GetInstance().GetHand(HandsE.droite).IsHandPinching(tolerance);
            //Pincement avec l'index et le pouce
            bool leftIndexThumbPinch  = DetectionController.GetInstance().GetHand(HandsE.gauche).IsPinchDistance(distance);
            bool rightIndexThumbPinch = DetectionController.GetInstance().GetHand(HandsE.droite).IsPinchDistance(distance);

            isBothPinch = leftHandPinching && rightHandPinching && leftIndexThumbPinch && rightIndexThumbPinch && !BothFistGesture.GetInstance().IsBothFisting();
        }
        DisplayDectedGesture(isBothPinch);
        return(isBothPinch);
    }
    /*****************************************************
    * UPDATE FIST AND PINCH SLIDERS
    *
    * INFO:    Affiche en temps réel le niveau de détection
    *          des gestes Fist et Pinch pour les deux mains.
    *
    *          *** PROBLEM ***
    *          Les sliders de la main gauche fonctionnent
    *          seulement si la main droite est détectée.
    *
    *****************************************************/
    private void UpdateFistPinchSliders()
    {
        // Main gauche détectée
        if (DetectionController.GetInstance().IsHandDetected(HandsE.gauche))
        {
            // Recupere la force du Fist et du Pinch pour la main gauche
            Hand leftHand = DetectionController.GetInstance().GetHand(HandsE.gauche).GetLeapHand();
            leftFistSlider.value  = leftHand.GetFistStrength();
            leftPinchSlider.value = -leftHand.PinchDistance;

            leftFistSlider.image.color = leftFistSlider.value >= tolerance ? Color.green : Color.gray;

            if (leftHand.GetFistStrength() > tolerance)
            {
                leftPinchSlider.value       = -100;
                leftPinchSlider.image.color = Color.gray;
            }
            else
            {
                leftPinchSlider.image.color = leftPinchSlider.value >= -20f ? Color.green : Color.gray;
            }
        }

        // Main droite détectée
        if (DetectionController.GetInstance().IsHandDetected(HandsE.droite))
        {
            // Recupere la force du Fist et du Pinch pour la main droite
            Hand rightHand = DetectionController.GetInstance().GetHand(HandsE.droite).GetLeapHand();
            rightFistSlider.value  = rightHand.GetFistStrength();
            rightPinchSlider.value = -rightHand.PinchDistance;

            rightFistSlider.image.color = rightFistSlider.value >= tolerance ? Color.green : Color.gray;

            if (rightHand.GetFistStrength() > tolerance)
            {
                rightPinchSlider.value       = -100;
                rightPinchSlider.image.color = Color.gray;
            }
            else
            {
                rightPinchSlider.image.color = rightPinchSlider.value >= -20f ? Color.green : Color.gray;
            }
        }
    }
    /*****************************************************
    * UPDATE CLAP HAND SLIDERS
    *
    * INFO:    ...
    *
    *****************************************************/
    private void UpdateClapSliders()
    {
        //Recupere le type de geste détecté
        string gesture = GestureMediator.GetGestureType();

        if (gesture.Contains("Clap"))
        {
            if (DetectionController.GetInstance().IsHandDetected(HandsE.gauche) &&
                GestureMediator.GetDetectedHand() == HandsE.gauche)
            {
                StartCoroutine(SwipeSliderTimer(clapLeftHand));
            }
            if (DetectionController.GetInstance().IsHandDetected(HandsE.droite) &&
                GestureMediator.GetDetectedHand() == HandsE.droite)
            {
                StartCoroutine(SwipeSliderTimer(clapRightHand));
            }
        }
    }
예제 #25
0
    /*****************************************************
    * UPDATE
    *
    * INFO:    Deplace un objet de sa position vers celle
    *          de la camera en un temps donné.
    *
    *****************************************************/
    void Update()
    {
        //La main utilisé pour sélectionner un objet 3D
        DetectionController.HandController handController = DetectionController.GetInstance().GetHand(SelectionController.GetInstance().GetHand());

        if (handController.IsHandSet())
        {
            //La liste des objets sélectionnés avec le raycast
            List <SelectedObject> objectsToPullList = SelectionController.GetInstance().GetSelectedObjects();

            if (objectsToPullList.Count > 0)
            {
                foreach (SelectedObject objectToPull in objectsToPullList)
                {
                    //Pour rapprocher (tirer) l'objet
                    if (isReadyToPull && isPullObject)
                    {
                        isPullObject     = false;
                        wasPullingObject = true;

                        //La position de la camera avec un offset pour garder une certaine distance avec l'objet
                        Transform camera         = Camera.main.transform;
                        Vector3   cameraPosition = camera.position + camera.forward * offsetToCamera;

                        //Demarre le deplacement de l'objet vers la camera aen un temps donné
                        StartCoroutine(MoveToPosition(objectToPull, cameraPosition, translationTime));
                    }

                    //Pour remettre (pousser) l'objet a sa position initial
                    if (isReadyToPush && isPushBackObject && wasPullingObject)
                    {
                        isPushBackObject = false;
                        wasPullingObject = false;

                        //Demarre le deplacement de l'objet vers sa position initiale apres avoir tiré l'objet
                        StartCoroutine(MoveToPosition(objectToPull, objectToPull.GetInitialPosition(), translationTime));
                    }
                }
            }
        }
    }
    /*****************************************************
    * UPDATE RAYCAST DISTANCE
    *
    * INFO:    Affiche la distance entre le bout du doigt
    *          qui a le raycast et l'objet 3D pointé.
    *
    *****************************************************/
    private void UpdateRaycastDistance()
    {
        //*** TO OPTIMIZE ***

        if (SelectionController.GetInstance() != null)
        {
            if (DetectionController.GetInstance().IsHandDetected(SelectionController.GetInstance().GetHand()))
            {
                float raycastDistance = SelectionController.GetInstance().GetRaycastDistance();
                if (raycastDistance > 0f)
                {
                    raycastLabel.text = "Contact dist.: " +
                                        SelectionController.GetInstance().GetRaycastDistance().ToString("F2") + " m";
                }
                else
                {
                    raycastLabel.text = "Contact dist.: n/a";
                }
            }
        }
    }
예제 #27
0
    /*****************************************************
    * DETECTED ONLY INDEX AND THUMB GESTURE
    *
    * INFO:    Retourne vrai si seulement le pouce et
    *          l'index sont ouverts.
    *
    *****************************************************/
    public override bool IsDetectedGesture()
    {
        bool isGunGesture = false;

        //Si la bonne main est détectée
        if (DetectionController.GetInstance().IsHandDetected(hand))
        {
            bool isIndexOpen = false;
            bool isThumbOpen = false;
            DetectionController.HandController handController = DetectionController.GetInstance().GetHand(hand);

            //Pour tous les doigts de la main
            foreach (DetectionController.FingerController finger in handController.GetFingers())
            {
                //Verifie si l'index et le pouce sont ouverts et que les autres doigts sont fermés
                if (finger == handController.GetFinger(FingersE.index) || finger == handController.GetFinger(FingersE.pouce))
                {
                    if (finger == handController.GetFinger(FingersE.index))
                    {
                        isIndexOpen = finger.IsFingerOpen();
                    }
                    if (finger == handController.GetFinger(FingersE.pouce))
                    {
                        isThumbOpen = finger.IsFingerOpen();
                    }
                }
                //else if (finger == handController.GetFinger(Fingers5.pouce)) { isOnlyIndexThumbOpen = finger.IsFingerOpen();  }
                else
                {
                    if (finger.IsFingerOpen())
                    {
                        isIndexOpen = isThumbOpen = false;
                    }
                }
            }
            isGunGesture = isIndexOpen && isThumbOpen;
        }
        DisplayDectedGesture(isGunGesture);
        return(isGunGesture);
    }
    /*****************************************************
    * INITIATE RAYCAST
    *
    * INFO:    Demarre le raycast effectué à partir du bout
    *          d'un doigt pour une main quelconque.
    *
    *          Initialise le laser et la sélection d'objet
    *          par raycast et Gun gesture.
    *
    *          Fonction appelé en boucle par le DetectionController.
    *
    *****************************************************/
    public void InitiateRaycast()
    {
        //Si la main du raycast est détecté
        if (DetectionController.GetInstance().IsHandDetected(raycastHand))
        {
            handController = DetectionController.GetInstance().GetHand(raycastHand);

            //Si le doigt du raycast est le seul d'ouvert et le Palm UI n'est pas affiché
            if (handController.IsIndexOpened() && !PalmUIController.GetInstance().IsPalmUIOpen())
            {
                //Les controleurs de la main et doigt
                fingerController = handController.GetFinger(raycastFinger);
                Ray ray = fingerController.GetFingerRay();

                //Trace la ligne rouge dans le sens que pointe le doigt de la main 3D
                Debug.DrawRay(
                    fingerController.GetFingertipPosition(),
                    ray.direction,
                    raycastColor,
                    Time.deltaTime, true);

                //Active le point de lumiere (point raycast)
                lightDot.SetActive(activateLightDot);

                //Permet la selection d'objets 3D avec le raycast
                SelectObjectWithRaycast(ray);
            }
            // Si le raycast est désactivé, on reset une fois le highlight des objets
            else
            {
                CheckResetHighlight();
            }
        }
        // Si la main du raycast n'est plus détecté, on reset une fois le highlight des objets
        else
        {
            CheckResetHighlight();
        }
    }
    /*****************************************************
    * RESET UI ELEMENTS
    *
    * INFO:    Si la main gauche et/ou droite n'est pas
    *          détectée, on remet les éléments du UI par
    *          defaut selon la main.
    *
    *****************************************************/
    private void ResetUIElements()
    {
        bool leftHandDetected  = DetectionController.GetInstance().IsHandDetected(HandsE.gauche);
        bool rightHandDetected = DetectionController.GetInstance().IsHandDetected(HandsE.droite);

        // Reset les objets UI si la main gauche n'es pas détectée
        if (!leftHandDetected)
        {
            ResetSlider(clapLeftHand);
            ResetSlider(leftFistSlider);
            leftPinchSlider.value       = -100;
            leftPinchSlider.image.color = Color.gray;
            for (int i = 0; i < leftHandSwipeSliders.Length; i++)
            {
                ResetSlider(leftHandSwipeSliders[i]);
            }
            for (int i = 0; i < leftHandImages.Length; i++)
            {
                leftHandImages[i].enabled = false;
            }
        }

        // Reset les objets UI si la main droite n'es pas détectée
        if (!rightHandDetected)
        {
            ResetSlider(clapRightHand);
            ResetSlider(rightFistSlider);
            rightPinchSlider.value       = -100;
            rightPinchSlider.image.color = Color.gray;
            for (int i = 0; i < rightHandSwipeSliders.Length; i++)
            {
                ResetSlider(rightHandSwipeSliders[i]);
            }
            for (int i = 0; i < rightHandImages.Length; i++)
            {
                rightHandImages[i].enabled = false;
            }
        }
    }
    /*****************************************************
    * GET FINGER POSITION
    *
    * INFO:    Supporte la rotation effectuée avec l'index
    *          et/ou le pouce.
    *
    *          Retourne la position du bout du doigt. On
    *          met la priorité sur l'index. Sinon ce sera
    *          avec la position du bout du pouce pour indiquer
    *          quel sens la rotation doit prendre.
    *
    *****************************************************/
    private Vector3 GetFingerPosition()
    {
        //La main utilisée pour effectuer le geste Pouce ou Index.
        HandsE hand = ThumbOrIndexGesture.GetInstance().GetHand();

        //Si la main initialisée pour effecuer la rotation est détectée
        if (DetectionController.GetInstance().IsHandDetected(hand))
        {
            Vector3 fingertip = Vector3.zero;
            detectedHand = DetectionController.GetInstance().GetHand(hand);

            if (isIndexOpen)
            {
                fingertip += detectedHand.GetFinger(FingersE.index).GetFingertipPosition();
            }
            else if (isThumbOpen)
            {
                fingertip += detectedHand.GetFinger(FingersE.pouce).GetFingertipPosition();
            }
            return(fingertip);
        }
        return(Vector3.zero);
    }