// check thumb finger up/down
        protected bool isThumbDirection(Hand hand, Vector3 dir)
        {
            List <Finger> listOfFingers = hand.Fingers;

            for (int f = 0; f < listOfFingers.Count; f++)
            {
                Finger finger = listOfFingers [f];

                if (finger.Type == Finger.FingerType.TYPE_THUMB)
                {
                    float angleThumbFinger = angle2LeapVectors(finger.Direction,
                                                               UnityVectorExtension.ToVector(dir));
                    float angleThumbFinger2 = angle2LeapVectors(
                        finger.TipPosition - hand.PalmPosition, UnityVectorExtension.ToVector(dir));
                    //Debug.Log (angleThumbFinger + " " + angleThumbFinger2);
                    if (angleThumbFinger < deltaAngleThumb ||
                        angleThumbFinger2 < deltaAngleThumb)
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
            }
            return(false);
        }
Beispiel #2
0
        void updateBall()
        {
            bool isUpdating = false;

            if (_isHoldingBall)
            {
                Hand hand = GetCurrent1Hand();
                if (hand != null)
                {
                    if (isGrabHand(hand))
                    {
                        if (CurrentHoldingObj != null)
                        {
                            CurrentHoldingObj.transform.position = UnityVectorExtension.ToVector3(hand.PalmPosition + hand.PalmNormal.Normalized * 0.03f);
                            isUpdating = true;
                        }
                    }
                }

                if (!isUpdating)
                {
                    releaseBall();
                }
            }
        }
    //to be override as detecting if the gesture is still in process
    public override bool checkInProcess()
    {
        Hand hand = new Hand();

        if ((leftHand == null) == (rightHand == null))
        {
            //Debug.Log("(Hovering)Start hand number problem ");
            return(false);
        }
        else
        {
            if (leftHand != null)
            {
                hand = leftHand;
            }
            else
            {
                hand = rightHand;
            }
        }
        foreach (Finger finger in hand.Fingers)
        {
            if (finger.Type == Finger.FingerType.TYPE_INDEX)
            {
                _tipMovement = UnityVectorExtension.ToVector3(finger.TipPosition) - _lastTipPos;
                _lastTipPos  = UnityVectorExtension.ToVector3(finger.TipPosition);
            }
        }
        _lastPalmPos = UnityVectorExtension.ToVector3(hand.PalmPosition);

        Debug.Log("(Hovering)Gesture InProcess");
        return(true);
    }
Beispiel #4
0
        //Jason <PillarOfEden>
        public bool isFingerDirection(Hand hand, Finger.FingerType finterType, Vector3 dir, float deltaAngle)
        {
            List <Finger> listOfFingers = hand.Fingers;

            for (int f = 0; f < listOfFingers.Count; f++)
            {
                Finger finger = listOfFingers[f];

                if (finger.Type == finterType)
                {
                    float angleFinger = angle2LeapVectors(finger.Direction,
                                                          UnityVectorExtension.ToVector(dir));
                    float angleFinger2 = angle2LeapVectors(
                        finger.StabilizedTipPosition - hand.PalmPosition, UnityVectorExtension.ToVector(dir));
                    //Debug.Log (angleThumbFinger + " " + angleThumbFinger2);
                    if (angleFinger < deltaAngle ||
                        angleFinger2 < deltaAngle)
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
            }
            return(false);
        }
Beispiel #5
0
    //to be override as detecting if the gesture is still in process
    public override bool checkInProcess()
    {
        Hand hand = new Hand();

        if ((leftHand == null) == (rightHand == null))
        {
            //Debug.Log("(Grab)Start hand number problem ");
            return(false);
        }
        else
        {
            if (leftHand != null)
            {
                hand = leftHand;
            }
            else
            {
                hand = rightHand;
            }
        }
        _palmMovement = UnityVectorExtension.ToVector3(hand.PalmPosition) - _lastPalmPos;
        _lastPalmPos  = UnityVectorExtension.ToVector3(hand.PalmPosition);
        Debug.Log("(Grabbing) Gesture InProcess");
        return(true);
    }
 protected Vector3 getHandVelocity(Hand hand)
 {
     if (player == null)
     {
         player = transform.root;
     }
     return(player.InverseTransformDirection(UnityVectorExtension.ToVector3(hand.PalmVelocity)));
 }
Beispiel #7
0
    // Update is called once per frame
    void Update()
    {
        Frame       frame = controller.Frame();
        List <Hand> hands = frame.Hands;

        int f_cnt        = hands.Count * 5;
        int f_hidden_cnt = 2 * 5 - f_cnt;
        int h_cnt        = 2;
        int ff_cnt       = 0;

        for (int idxFinger = 0; idxFinger < f_hidden_cnt; ++idxFinger)
        {
            var fingerObj = FingerObjects[ff_cnt++];
            fingerObj.SetActive(false);
        }

        for (int i = 0; i < h_cnt; i++)
        {
            List <Finger> fingers = hands[i].Fingers;
            for (int idxFinger = 0; idxFinger < fingers.Count; ++idxFinger)
            {
                Finger finger     = fingers[idxFinger];
                Vector fingerPos  = finger.TipPosition;
                Color  set_collor = new Color(0, 0, 0);

                if (finger.Type == Finger.FingerType.TYPE_THUMB)
                {
                    set_collor = new Color(255, 0, 0);
                }
                else if (finger.Type == Finger.FingerType.TYPE_INDEX)
                {
                    set_collor = new Color(0, 255, 0);
                }
                else if (finger.Type == Finger.FingerType.TYPE_MIDDLE)
                {
                    set_collor = new Color(0, 0, 255);
                }
                else if (finger.Type == Finger.FingerType.TYPE_RING)
                {
                    set_collor = new Color(255, 255, 0);
                }
                else if (finger.Type == Finger.FingerType.TYPE_PINKY)
                {
                    set_collor = new Color(0, 255, 255);
                }
                else
                {
                    set_collor = new Color(255, 255, 255);
                }

                var fingerObj = FingerObjects[ff_cnt++];
                fingerObj.transform.position = UnityVectorExtension.ToVector3(fingerPos) / 10;
                fingerObj.GetComponent <Renderer>().material.color = set_collor;
                fingerObj.SetActive(true);
            }
        }
    }
Beispiel #8
0
    //to be override as detecting the start signal of a gusture
    public override bool checkStart()
    {
        //1. Only one hand input
        //2. Thumb far from Index
        Hand hand = new Hand();

        if ((leftHand == null) == (rightHand == null))
        {
            Debug.Log("(Pinch)Start hand number problem ");
            return(false);
        }
        else
        {
            if (leftHand != null)
            {
                hand = leftHand;
            }
            else
            {
                hand = rightHand;
            }
        }
        try
        {
            Vector3 thumbTip = new Vector3();
            Vector3 indexTip = new Vector3();
            foreach (Finger finger in hand.Fingers)
            {
                if (finger.Type == Finger.FingerType.TYPE_THUMB)
                {
                    thumbTip = finger.TipPosition.ToVector3();
                }
                else if (finger.Type == Finger.FingerType.TYPE_INDEX)
                {
                    indexTip    = finger.TipPosition.ToVector3();
                    _lastTipPos = UnityVectorExtension.ToVector3(finger.TipPosition);
                }
            }
            float lastTipGap = Vector3.Distance(thumbTip, indexTip);
            if (lastTipGap > 0.8 * hand.PalmWidth)
            {
                Debug.Log("(Pinch)Gesture Start");
                return(true);
            }
            else
            {
                Debug.Log("(Pinch)Gesture Start fingers distance problem");
                return(false);
            }
        }
        catch (Exception e)
        {
            Debug.Log(e.ToString());
            return(false);
        }
    }
    //to be override as detecting the start signal of a gusture
    public override bool checkStart()
    {
        //1. Only one hand input
        //2. The fingers have moved around hand
        Hand hand = new Hand();

        if ((leftHand == null) == (rightHand == null))
        {
            //Debug.Log("(Grab)Start hand number problem ");
            return(false);
        }
        else
        {
            if (leftHand != null)
            {
                hand = leftHand;
            }
            else
            {
                hand = rightHand;
            }
        }
        try
        {
            Vector3 thumbTip = new Vector3();
            Vector3 indexTip = new Vector3();
            foreach (Finger finger in hand.Fingers)
            {
                if (finger.Type == Finger.FingerType.TYPE_THUMB)
                {
                    thumbTip = finger.TipPosition.ToVector3();
                }
                else if (finger.Type == Finger.FingerType.TYPE_INDEX)
                {
                    indexTip    = finger.TipPosition.ToVector3();
                    _lastTipPos = UnityVectorExtension.ToVector3(finger.TipPosition);
                }
            }
            _lastPalmPos = UnityVectorExtension.ToVector3(hand.PalmPosition);
            if (Vector3.Distance(thumbTip, indexTip) < 0.3 * hand.PalmWidth)
            {
                Debug.Log("(Pinching)Gesture start");
                return(true);
            }
            else
            {
                Debug.Log("(Pinching)Gesture start problem");
                return(false);
            }
        }
        catch (Exception e)
        {
            Debug.Log(e.ToString());
            return(false);
        }
    }
Beispiel #10
0
    //to be override as detecting if the gesture is still in process
    public override bool checkInProcess()
    {
        //1. Only one hand input
        //2. The fingers are moving closer
        //3. Time is in limit
        Hand hand = new Hand();

        if ((leftHand == null) == (rightHand == null))
        {
            return(false);
        }
        else
        {
            if (leftHand != null)
            {
                hand = leftHand;
            }
            else
            {
                hand = rightHand;
            }
        }
        try
        {
            Vector3 thumbTip = new Vector3();
            Vector3 indexTip = new Vector3();
            foreach (Finger finger in hand.Fingers)
            {
                if (finger.Type == Finger.FingerType.TYPE_THUMB)
                {
                    thumbTip = finger.TipPosition.ToVector3();
                }
                else if (finger.Type == Finger.FingerType.TYPE_INDEX)
                {
                    indexTip    = finger.TipPosition.ToVector3();
                    _lastTipPos = UnityVectorExtension.ToVector3(finger.TipPosition);
                }
            }
            if (lastTipGap >= Vector3.Distance(thumbTip, indexTip))
            {
                lastTipGap = Vector3.Distance(thumbTip, indexTip);
                Debug.Log("(Pinch)Gesture InProcess");
                return(true);
            }
            else
            {
                lastTipGap = Vector3.Distance(thumbTip, indexTip);
                return(false);
            }
        }
        catch (Exception e)
        {
            Debug.Log(e.ToString());
            return(false);
        }
    }
    //to be override as detecting if the gesture is finished
    public override bool checkEnd()
    {
        //1. Only one hand input
        //2. The direction of fingers (no thumb) are close to the palm direction
        Hand hand = new Hand();

        if ((leftHand == null) == (rightHand == null))
        {
            return(false);
        }
        else
        {
            if (leftHand != null)
            {
                hand = leftHand;
            }
            else
            {
                hand = rightHand;
            }
        }
        try
        {
            Vector3 thumbTip = new Vector3();
            Vector3 indexTip = new Vector3();
            foreach (Finger finger in hand.Fingers)
            {
                if (finger.Type == Finger.FingerType.TYPE_THUMB)
                {
                    thumbTip = finger.TipPosition.ToVector3();
                }
                else if (finger.Type == Finger.FingerType.TYPE_INDEX)
                {
                    _tipMovement = UnityVectorExtension.ToVector3(finger.TipPosition) - _lastTipPos;
                    indexTip     = finger.TipPosition.ToVector3();
                }
            }
            _lastPalmPos = UnityVectorExtension.ToVector3(hand.PalmPosition);
            if (Vector3.Distance(thumbTip, indexTip) > 0.3 * hand.PalmWidth)
            {
                Debug.Log("(Pinching)Gesture end");
                return(true);
            }
            else
            {
                //Debug.Log("(Pinching)Gesture end problem");
                return(false);
            }
        }
        catch (Exception e)
        {
            Debug.Log(e.ToString());
            return(false);
        }
    }
Beispiel #12
0
    //to be override as detecting if the gesture is finished
    public override bool checkEnd()
    {
        //1. Only one hand input
        //2. The fingers have moved together
        Hand hand = new Hand();

        if ((leftHand == null) == (rightHand == null))
        {
            return(false);
        }
        else
        {
            if (leftHand != null)
            {
                hand = leftHand;
            }
            else
            {
                hand = rightHand;
            }
        }
        try
        {
            Vector3 thumbTip = new Vector3();
            Vector3 indexTip = new Vector3();
            foreach (Finger finger in hand.Fingers)
            {
                if (finger.Type == Finger.FingerType.TYPE_THUMB)
                {
                    thumbTip = finger.TipPosition.ToVector3();
                }
                else if (finger.Type == Finger.FingerType.TYPE_INDEX)
                {
                    indexTip    = finger.TipPosition.ToVector3();
                    _lastTipPos = UnityVectorExtension.ToVector3(finger.TipPosition);
                }
            }
            lastTipGap = Vector3.Distance(thumbTip, indexTip);
            if (lastTipGap < 0.3 * hand.PalmWidth)
            {
                return(true);
            }
            else
            {
                Debug.Log("Pinch End Problem");
                return(false);
            }
        }
        catch (Exception e)
        {
            Debug.Log(e.ToString());
            return(false);
        }
    }
Beispiel #13
0
        void throwBall()
        {
            Hand hand = GetCurrent1Hand();

            if (hand != null)
            {
                GameObject go = GameObject.Instantiate(prefabBall);
                go.transform.position = UnityVectorExtension.ToVector3(hand.PalmPosition);
                setupGravity(go);
                addForce(go, UnityVectorExtension.ToVector3(hand.PalmVelocity * forceToAdd));
            }
        }
Beispiel #14
0
    //to be override as detecting the start signal of a gusture
    public override bool checkStart()
    {
        //1. Only one hand input
        //2. The direction of fingers (no thumb) are close to the palm direction
        Hand hand = new Hand();

        if ((leftHand == null) == (rightHand == null))
        {
            //Debug.Log("(Grab)Start hand number problem ");
            return(false);
        }
        else
        {
            if (leftHand != null)
            {
                hand = leftHand;
            }
            else
            {
                hand = rightHand;
            }
        }
        try
        {
            currentGrabAngle = hand.GrabAngle;
            _lastPalmPos     = UnityVectorExtension.ToVector3(hand.PalmPosition);
            return(currentGrabAngle < 2);

            /*
             * currentFingerAngle.Clear();
             * foreach (Finger finger in hand.Fingers)
             * {
             *  if (finger.Type != Finger.FingerType.TYPE_THUMB && finger.Type != Finger.FingerType.TYPE_PINKY)
             *  {
             *      float angle = Vector3.Angle(hand.Direction.ToVector3(), finger.Direction.ToVector3());
             *      currentFingerAngle.Add(finger.Type, angle);
             *      if ( angle > 90.0f)
             *      {
             *          Debug.Log("(Grab)Start finger direction problem ");
             *          return false;
             *      }
             *  }
             * }
             * Debug.Log("(Grab)Gesture start");
             * _lastPalmPos = UnityVectorExtension.ToVector3(hand.PalmPosition);
             * return true;*/
        }
        catch (Exception e)
        {
            Debug.Log(e.ToString());
            return(false);
        }
    }
Beispiel #15
0
 void updateDebug()
 {
     if (listHands.Count > 0 && listHands.Count <= 2)
     {
         foreach (Hand hand in listHands)
         {
             Debug.DrawRay(UnityVectorExtension.ToVector3(hand.PalmPosition), UnityVectorExtension.ToVector3(hand.PalmNormal) * 10, Color.green);
             if (!isStationary(hand))
             {
                 Debug.DrawRay(UnityVectorExtension.ToVector3(hand.PalmPosition), UnityVectorExtension.ToVector3(hand.PalmVelocity) * 10, Color.blue);
             }
         }
     }
 }
Beispiel #16
0
        protected override bool checkConditionGesture()
        {
            Hand hand = GetCurrent1Hand();

            if (hand != null)
            {
                if (isPalmNormalSameDirectionWith(hand, UnityVectorExtension.ToVector3(hand.PalmVelocity)) &&
                    !isStationary(hand))
                {
                    return(true);
                }
            }
            return(false);
        }
Beispiel #17
0
        protected override bool checkConditionGesture()
        {
            Hand hand = GetCurrent1Hand();

            if (hand != null)
            {
                if (_gestureManager.isPalmNormalSameDirectionWith(hand, UnityVectorExtension.ToVector3(hand.PalmVelocity), handForwardDegree) &&
                    !_gestureManager.isStationary(hand, smallestVelocity))
                {
                    return(true);
                }
            }
            return(false);
        }
Beispiel #18
0
 void updateDebug()
 {
     if (_listHands != null && _listHands.Count > 0 && _listHands.Count <= 2)
     {
         foreach (Hand hand in _listHands)
         {
             Debug.DrawRay(UnityVectorExtension.ToVector3(hand.PalmPosition), UnityVectorExtension.ToVector3(hand.PalmNormal) * 10, Color.green);
             if (!_gestureManager.isStationary(hand, smallestVelocity))
             {
                 Debug.DrawRay(UnityVectorExtension.ToVector3(hand.PalmPosition), UnityVectorExtension.ToVector3(hand.PalmVelocity) * 10, Color.blue);
             }
         }
     }
 }
Beispiel #19
0
    //to be override as detecting the start signal of a gusture
    public override bool checkStart()
    {
        //1. Only one hand input
        //2. The fingers have moved around hand
        Hand hand = new Hand();

        if ((leftHand == null) == (rightHand == null))
        {
            //Debug.Log("(Grab)Start hand number problem ");
            return(false);
        }
        else
        {
            if (leftHand != null)
            {
                hand = leftHand;
            }
            else
            {
                hand = rightHand;
            }
        }
        try
        {
            _lastPalmPos  = UnityVectorExtension.ToVector3(hand.PalmPosition);
            _palmMovement = new Vector3();
            return(hand.GrabAngle > 3); /*
                                         * foreach (Finger finger in hand.Fingers)
                                         * {
                                         * if (finger.Type != Finger.FingerType.TYPE_THUMB && finger.Type != Finger.FingerType.TYPE_PINKY)
                                         * {
                                         * float angle = Vector3.Angle(hand.Direction.ToVector3(), finger.Direction.ToVector3());
                                         * if ( angle < 120.0f)
                                         * {
                                         * Debug.Log("(Grabbing)Start finger direction problem ");
                                         * return false;
                                         * }
                                         * }
                                         * }
                                         * Debug.Log("(Grabbing)Gesture start");
                                         * _lastPalmPos = UnityVectorExtension.ToVector3(hand.PalmPosition);
                                         * return true;*/
        }
        catch (Exception e)
        {
            Debug.Log(e.ToString());
            return(false);
        }
    }
    protected void setText(Hand hand, GameObject handInfo)
    {
        if (handInfo == null)
        {
            return;
        }
        string handInfo_str = "";

        /*
         * foreach (Finger finger in hand.Fingers)
         * {
         *  //handInfo_str += (finger.Type + ":" + Vector3.Angle(finger.Direction.ToVector3(), hand.Direction.ToVector3()) + "\n");
         *  handInfo_str += (finger.Type + ":" + finger.TipPosition.ToVector3() + "\n");
         * }
         */
        Vector3 thumbTip = new Vector3();
        Vector3 indexTip = new Vector3();

        foreach (Finger finger in hand.Fingers)
        {
            //handInfo_str += ("\n" + finger.Type + ":" + finger.IsExtended);
            if (finger.Type == Finger.FingerType.TYPE_THUMB)
            {
                thumbTip = UnityVectorExtension.ToVector3(finger.TipPosition);
            }
            else if (finger.Type == Finger.FingerType.TYPE_INDEX)
            {
                indexTip = UnityVectorExtension.ToVector3(finger.TipPosition);
            }
        }
        //handInfo_str += ("PalmarAxis = " + hand.PalmarAxis());
        handInfo_str += ("\nPalmWidh = " + hand.PalmWidth);
        handInfo_str += ("\nGrabAngle = " + hand.GrabAngle);
        //handInfo_str += ("\nGrabStrength = " + hand.GrabStrength);
        //handInfo_str += ("\nPalmPosition = " + UnityVectorExtension.ToVector3(hand.PalmPosition));
        //handInfo_str += ("\nPalmVelocity = " + hand.PalmVelocity.ToVector3());
        handInfo_str += ("\nTipGap = " + Vector3.Distance(thumbTip, indexTip));
        handInfo_str += ("\nRate = " + Vector3.Distance(thumbTip, indexTip) / hand.PalmWidth);

        try
        {
            handInfo.GetComponent <Text>().text = handInfo_str;
        }
        catch
        {
            handInfo.GetComponent <TextMesh>().text = handInfo_str;
        }
    }
    //to be override as detecting the start signal of a gusture
    public override bool checkStart()
    {
        //1. Only one hand input
        //2. The fingers have moved around hand
        Hand hand = new Hand();

        if ((leftHand == null) == (rightHand == null))
        {
            //Debug.Log("(Hovering)Start hand number problem ");
            return(false);
        }
        else
        {
            if (leftHand != null)
            {
                hand = leftHand;
            }
            else
            {
                hand = rightHand;
            }
        }
        try
        {
            Vector3 indexTip = new Vector3();
            foreach (Finger finger in hand.Fingers)
            {
                if (finger.Type == Finger.FingerType.TYPE_INDEX)
                {
                    indexTip    = finger.TipPosition.ToVector3();
                    _lastTipPos = UnityVectorExtension.ToVector3(finger.TipPosition);
                }
                if (!finger.IsExtended)
                {
                    return(false);
                }
            }
            _lastPalmPos = UnityVectorExtension.ToVector3(hand.PalmPosition);
            return(true);
        }
        catch (Exception e)
        {
            Debug.Log(e.ToString());
            return(false);
        }
    }
Beispiel #22
0
    void Update()
    {
        controller = new Controller();
        Frame       frame = controller.Frame();
        List <Hand> hands = frame.Hands;


        if (frame.Hands.Count > 0)
        {
            firstHand = hands[0];
            thumbL    = firstHand.Fingers[0];
            pinkyL    = firstHand.Fingers[4];


            if (thumbL.IsExtended && pinkyL.IsExtended && Time.time > nextFire)
            {
                nextFire = Time.time + fireRate;     // Prevents spamming shots
                Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
                GetComponent <AudioSource>().Play(); // Adds audio when firing
            }

            Vector3 palmNormal = UnityVectorExtension.ToVector3(firstHand.PalmNormal); //using palm rotation
            Vector3 movement   = new Vector3(-palmNormal[0], 0.0f, palmNormal[2]);

            //Vector3 palmPos = UnityVectorExtension.ToVector3(firstHand.PalmPosition); //using hand position
            //Vector3 movement = new Vector3(palmPos[0] * 0.01f , 0.0f, -palmPos[2] * 0.01f);

            GetComponent <Rigidbody>().velocity = movement * speed;
        }


        GetComponent <Rigidbody>().position = new Vector3
                                              (
            Mathf.Clamp(GetComponent <Rigidbody>().position.x, boundary.xMin, boundary.xMax),
            0.0f,
            Mathf.Clamp(GetComponent <Rigidbody>().position.z, boundary.zMin, boundary.zMax)
                                              );

        GetComponent <Rigidbody>().rotation = Quaternion.Euler(0.0f, 0.0f, GetComponent <Rigidbody>().velocity.x * -tilt);
    }
 protected float angle2LeapVectors(Leap.Vector a, Leap.Vector b)
 {
     return(Vector3.Angle(UnityVectorExtension.ToVector3(a), UnityVectorExtension.ToVector3(b)));
 }
Beispiel #24
0
    private void generateFeatureSet()
    {
        Controller controller = new Controller();

        if (controller.IsConnected)
        {
            Frame frame = controller.Frame();
            numberOfFingers = 0;
            List <Hand> hands = frame.Hands;
            for (int h = 0; h < frame.Hands.Count; h++)
            {
                Hand leapHand = frame.Hands[h];

                Vector handXBasis    = leapHand.PalmNormal.Cross(leapHand.Direction).Normalized;
                Vector handYBasis    = -leapHand.PalmNormal;
                Vector handZBasis    = -leapHand.Direction;
                Vector handOrigin    = leapHand.PalmPosition;
                Matrix handTransform = new Matrix(handXBasis, handYBasis, handZBasis, handOrigin);
                handTransform = handTransform.RigidInverse();

                numberOfFingers += hands[h].Fingers.Count;

                if (leapHand.IsLeft)
                {
                    currentHand = "100";
                }
                if (leapHand.IsRight)
                {
                    currentHand = "101";
                }

                fingerPositionString += currentHand + ",";

                if (leapHand.Fingers.Count > 0)
                {
                    writeToFile = true;
                    for (int f = 0; f < leapHand.Fingers.Count; f++)
                    {
                        Finger leapFinger           = leapHand.Fingers[f];
                        Vector transformedPosition  = handTransform.TransformPoint(leapFinger.TipPosition);
                        Vector transformedDirection = handTransform.TransformDirection(leapFinger.Direction);
                        float  fingerLength         = leapFinger.Length;

                        Finger nextLeapFinger     = null;
                        Vector nextFingerPosition = new Vector();

                        if (f == 0)
                        {
                            nextLeapFinger     = leapHand.Fingers[1];
                            nextFingerPosition = handTransform.TransformPoint(nextLeapFinger.TipPosition);
                        }
                        else if (f == 1)
                        {
                            nextLeapFinger     = leapHand.Fingers[2];
                            nextFingerPosition = handTransform.TransformPoint(nextLeapFinger.TipPosition);
                        }
                        else if (f == 2)
                        {
                            nextLeapFinger     = leapHand.Fingers[3];
                            nextFingerPosition = handTransform.TransformPoint(nextLeapFinger.TipPosition);
                        }
                        else if (f == 3)
                        {
                            nextLeapFinger     = leapHand.Fingers[4];
                            nextFingerPosition = handTransform.TransformPoint(nextLeapFinger.TipPosition);
                        }
                        else if (f == 4)
                        {
                            nextLeapFinger     = leapHand.Fingers[0];
                            nextFingerPosition = handTransform.TransformPoint(nextLeapFinger.TipPosition);
                        }

                        float Dist = DistanceBetweenTwoPoints(UnityVectorExtension.ToVector3(transformedPosition), UnityVectorExtension.ToVector3(nextFingerPosition));

                        fingerPositionString += transformedPosition.x + "," + transformedPosition.y + "," + transformedPosition.z + ",";

                        fingerDistanceString += (int)Dist + ",";
                    }
                }
                else
                {
                    Debug.Log("No Fingers Found");
                    writeToFile = false;
                }
            }
            if (frame.Hands.Count > 0)
            {
                fingerPositionString += fingerDistanceString;
                fingerDistanceString  = "";
                featureText           = numberOfFingers + "," + fingerPositionString;
                Debug.Log(featureText + currentGestureName);
                AddFestureSetToFile();
                fingerPositionString = "";
            }
        }


        if (!controller.IsConnected)
        {
            Debug.Log("Connect Leap Motion Controller");
        }
    }
Beispiel #25
0
    private void GestureListener()
    { //not editable when building
        if (this.Lock)
        {
            return;
        }
        else
        {
            controller = new Controller();
            Frame       frame          = _leapProvider.CurrentFrame;
            List <Hand> hands          = frame.Hands;
            Hand        leftHand       = new Hand();
            bool        leftHandExist  = false;
            Hand        rightHand      = new Hand();
            bool        rightHandExist = false;
            foreach (Hand hand in hands)
            {
                if (hand.IsLeft)
                {
                    leftHand      = hand;
                    leftHandExist = true;
                }
                else
                {
                    rightHand      = hand;
                    rightHandExist = true;
                }
            }
            //One-Hand Gestures for Left Hand
            if (leftHandExist)
            {
                //LeapGestureModel.State stateGrabLH = gestureGrabLH.Check(leftHand, null, Time.deltaTime);
                //LeapGestureModel.State stateGrabbingLH = gestureGrabbingLH.Check(leftHand, null, Time.deltaTime);
                LeapGestureModel.State statePinchLH = gesturePinchLH.Check(leftHand, null, Time.deltaTime);
                //LeapGestureModel.State statePinchingLH = gesturePinchingLH.Check(leftHand, null, Time.deltaTime);
                //LeapGestureModel.State stateTappingLH = gestureTappingLH.Check(leftHand, null, Time.deltaTime);
                LeapGestureModel.State stateHoveringLH = gestureHoveringLH.Check(leftHand, null, Time.deltaTime);

                /*
                 * if (stateGrabLH == LeapGestureModel.State.End)
                 * {
                 *  OneHandGrab(0);
                 * }
                 * if (stateGrabbingLH == LeapGestureModel.State.InProcess)
                 * {
                 *  OneHandGrabbing(0);
                 * }
                 * if (stateGrabbingLH == LeapGestureModel.State.End)
                 * {
                 *  OneHandEndGrabbing(0);
                 * }*/
                if (statePinchLH == LeapGestureModel.State.End)
                {
                    OneHandPinch(0);
                }/*
                  * if (statePinchingLH == LeapGestureModel.State.InProcess)
                  * {
                  * //OneHandPinching(0);
                  * }
                  * if (statePinchingLH== LeapGestureModel.State.End)
                  * {
                  * //OneHandEndPinching(0);
                  * }
                  * if (stateTappingLH == LeapGestureModel.State.InProcess)
                  * {
                  * //OneHandTapping(0);
                  * }
                  * if (stateTappingLH == LeapGestureModel.State.End)
                  * {
                  * // OneHandEndTapping(0);
                  * }*/
                if (stateHoveringLH == LeapGestureModel.State.InProcess)
                {
                    OneHandHovering(0);
                }
            }
            //One-Hand Gestures for Right Hand
            if (rightHandExist)
            {
                //LeapGestureModel.State stateGrabRH = gestureGrabRH.Check(null, rightHand, Time.deltaTime);
                //LeapGestureModel.State stateGrabbingRH = gestureGrabbingRH.Check(null, rightHand, Time.deltaTime);
                LeapGestureModel.State statePinchRH = gesturePinchRH.Check(null, rightHand, Time.deltaTime);
                //LeapGestureModel.State statePinchingRH = gesturePinchingRH.Check(null, rightHand, Time.deltaTime);
                //LeapGestureModel.State stateTappingRH = gestureTappingRH.Check(null, rightHand, Time.deltaTime);
                LeapGestureModel.State stateHoveringRH = gestureHoveringRH.Check(null, rightHand, Time.deltaTime);

                /*if (stateGrabRH == LeapGestureModel.State.End)
                 * {
                 *  OneHandGrab(1);
                 * }
                 * if (stateGrabbingRH == LeapGestureModel.State.InProcess)
                 * {
                 *  OneHandGrabbing(1);
                 * }
                 * if (stateGrabbingRH == LeapGestureModel.State.End)
                 * {
                 *  OneHandEndGrabbing(1);
                 * }*/
                if (statePinchRH == LeapGestureModel.State.End)
                {
                    OneHandPinch(1);
                }

                /*if (statePinchingRH == LeapGestureModel.State.InProcess)
                 * {
                 *  //OneHandPinching(1);
                 * }
                 * if (statePinchingRH == LeapGestureModel.State.End)
                 * {
                 *  //OneHandEndPinching(1);
                 * }
                 * if (stateTappingRH == LeapGestureModel.State.InProcess)
                 * {
                 *  //OneHandTapping(1);
                 * }
                 * if (stateTappingRH == LeapGestureModel.State.End)
                 * {
                 *  //OneHandEndTapping(1);
                 * }*/
                if (stateHoveringRH == LeapGestureModel.State.InProcess)
                {
                    OneHandHovering(1);
                }
            }
            if (leftHandExist && rightHandExist)
            {
                LeapGestureModel.State stateSplit = gestureSplit.Check(leftHand, rightHand, Time.deltaTime);
                if (stateSplit == LeapGestureModel.State.End)
                {
                    handle.moveObjectTo(UnityVectorExtension.ToVector3(leftHand.PalmPosition));
                    if (!oldVersion)
                    {
                        bin.moveObjectTo(UnityVectorExtension.ToVector3(rightHand.PalmPosition));
                    }
                }
            }
            if (!leftHandExist && !rightHandExist)
            {
                OneHandHovering(2);
            }
        }
    }
    void PredictGesture(Controller c, int h)
    {
        if (DataUnderObservation == null && TwoDataUnderObservation == null)
        {
            return;
        }

        if (svm == null && twoSvm == null)
        {
            return;
        }

        //Try Catch Block For Prediction of gesture
        try
        {
            for (int i = 0; i < DataUnderObservation.Rows; i++)
            {
                Matrix <float> row     = DataUnderObservation.GetRow(i);
                float          predict = 0;
                if (h == 1)
                {
                    predict = svm.Predict(row);
                }
                else if (h == 2)
                {
                    predict = twoSvm.Predict(row);
                }

                switch (predict)
                {
                case 0:
                    recognizedGesture = "LeftHandSlide";
                    break;

                case 1:
                    recognizedGesture = "LeftHandClose";
                    break;

                case 2:
                    recognizedGesture = "RightHandSlide";
                    break;

                case 3:
                    recognizedGesture = "RightHandClose";
                    break;

                case 4:
                    recognizedGesture = "RightHandGrip";
                    break;

                case 5:
                    recognizedGesture = "LeftHandGrip";
                    break;

                case 6:
                    recognizedGesture = "TwoHandsSlide";
                    break;

                case 7:
                    recognizedGesture = "TwoHandsGrip";
                    break;

                case 8:
                    recognizedGesture = "LeftCloseRightGrip";
                    break;

                case 9:
                    recognizedGesture = "RightCloseLeftGrip";
                    break;

                default:
                    recognizedGesture = "No Gesture Found";
                    break;
                }
                Debug.Log("Predicted Label: " + recognizedGesture);
            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
            recognizedGesture = "No Gesture Found";
        }

        if (recognizedGesture.Equals("LeftHandSlide") || recognizedGesture.Equals("RightHandSlide"))
        {
            Frame  frame   = c.Frame();
            Hand   hand    = frame.Hands[0];
            Vector palmPos = hand.PalmPosition;

            if (previousFrameHandPosition.x == 0)
            {
                previousFrameHandPosition = palmPos;
                return;
            }
            else
            {
                float diffX = (palmPos.x - previousFrameHandPosition.x) * speed;
                float diffY = (palmPos.y - previousFrameHandPosition.y) * speed;
                float diffZ = (palmPos.z - previousFrameHandPosition.z) * speed;

                model3D.transform.position = new Vector3((xx + diffX), (yy + diffY), (zz + diffZ));
            }
        }

        if (recognizedGesture.Equals("TwoHandsSlide"))
        {
            Frame frame = c.Frame();

            for (int i = 0; i < frame.Hands.Count; i++)
            {
                Hand hand = frame.Hands[i];

                float x = hand.PalmVelocity.x;

                if (x < 0)
                {
                    x = (-1) * x;
                }

                if (x > 40)
                {
                    Vector palmPos = hand.PalmPosition;

                    if (previousFrameHandPosition == null)
                    {
                        previousFrameHandPosition = palmPos;
                        return;
                    }
                    else
                    {
                        float diffX = (palmPos.x - previousFrameHandPosition.x) * speed;
                        float diffY = (palmPos.y - previousFrameHandPosition.y) * speed;
                        float diffZ = (palmPos.z - previousFrameHandPosition.z) * speed;

                        model3D.transform.position = new Vector3((xx + diffX), (yy + diffY), (zz + diffZ));
                    }
                }
            }
        }

        if (recognizedGesture.Equals("LeftHandGrip") || recognizedGesture.Equals("RightHandGrip"))
        {
            previousFrameHandPosition = new Vector(0, 0, 0);
            Frame frame = c.Frame();
            Hand  hand  = frame.Hands[0];

            float hPitch = hand.Direction.Pitch * 30;
            float hYaw   = hand.Direction.Yaw * 30;
            float hRoll  = hand.Direction.Roll * 30;

            //model3D.transform.rotation = Quaternion.Euler((hPitch + x), (hYaw + y), (hRoll + z));
            //x += model3D.transform.rotation.x;
            //y += model3D.transform.rotation.y;
            //z += model3D.transform.rotation.z;
        }

        if (recognizedGesture.Equals("TwoHandsGrip"))
        {
            previousFrameHandPosition = new Vector(0, 0, 0);
            Frame  frame = c.Frame();
            Hand   hand  = frame.Hands[0];
            Hand   hand2 = frame.Hands[1];
            Vector palm  = hand.PalmPosition;
            Vector palm2 = hand2.PalmPosition;
            float  dist  = DistanceBetweenTwoPoints(UnityVectorExtension.ToVector3(palm), UnityVectorExtension.ToVector3(palm2));
            currentDist = dist * 0.001f;
            if (prevDist == 0.0f)
            {
                prevDist = currentDist;
            }
            else
            {
                float   n   = (currentDist - prevDist) * 3f;
                Vector3 pos = model3D.transform.localScale;
                pos.x += n;
                pos.y += n;
                pos.z += n;
                model3D.transform.localScale = new Vector3(pos.x, pos.y, pos.z);
                prevDist = currentDist;
            }
        }

        if (recognizedGesture.Equals("LeftHandClose") || recognizedGesture.Equals("RightHandClose"))
        {
            previousFrameHandPosition = new Vector(0, 0, 0);
        }

        if (recognizedGesture.Equals("LeftCloseRightGrip "))
        {
            previousFrameHandPosition = new Vector(0, 0, 0);
        }

        if (recognizedGesture.Equals("RightCloseLeftGrip"))
        {
            previousFrameHandPosition = new Vector(0, 0, 0);
        }
    }
    private void generateDataForGesture(Controller controller)
    {
        string fingerPositionString = "";
        string fingerDistanceString = "";
        int    numberOfFingers;
        string currentHand = "";

        Frame frame = controller.Frame();

        numberOfFingers = 0;
        List <Hand> hands = frame.Hands;

        for (int h = 0; h < frame.Hands.Count; h++)
        {
            Hand leapHand = frame.Hands[h];

            Vector handXBasis    = leapHand.PalmNormal.Cross(leapHand.Direction).Normalized;
            Vector handYBasis    = -leapHand.PalmNormal;
            Vector handZBasis    = -leapHand.Direction;
            Vector handOrigin    = leapHand.PalmPosition;
            Matrix handTransform = new Matrix(handXBasis, handYBasis, handZBasis, handOrigin);
            handTransform = handTransform.RigidInverse();

            numberOfFingers += hands[h].Fingers.Count;

            if (leapHand.IsLeft)
            {
                currentHand = "100";
            }
            if (leapHand.IsRight)
            {
                currentHand = "101";
            }

            fingerPositionString += currentHand + ",";

            if (leapHand.Fingers.Count > 0)
            {
                for (int f = 0; f < leapHand.Fingers.Count; f++)
                {
                    Finger leapFinger           = leapHand.Fingers[f];
                    Vector transformedPosition  = handTransform.TransformPoint(leapFinger.TipPosition);
                    Vector transformedDirection = handTransform.TransformDirection(leapFinger.Direction);
                    float  fingerLength         = leapFinger.Length;

                    Finger nextLeapFinger     = null;
                    Vector nextFingerPosition = new Vector();

                    if (f == 0)
                    {
                        nextLeapFinger     = leapHand.Fingers[1];
                        nextFingerPosition = handTransform.TransformPoint(nextLeapFinger.TipPosition);
                    }
                    else if (f == 1)
                    {
                        nextLeapFinger     = leapHand.Fingers[2];
                        nextFingerPosition = handTransform.TransformPoint(nextLeapFinger.TipPosition);
                    }
                    else if (f == 2)
                    {
                        nextLeapFinger     = leapHand.Fingers[3];
                        nextFingerPosition = handTransform.TransformPoint(nextLeapFinger.TipPosition);
                    }
                    else if (f == 3)
                    {
                        nextLeapFinger     = leapHand.Fingers[4];
                        nextFingerPosition = handTransform.TransformPoint(nextLeapFinger.TipPosition);
                    }
                    else if (f == 4)
                    {
                        nextLeapFinger     = leapHand.Fingers[0];
                        nextFingerPosition = handTransform.TransformPoint(nextLeapFinger.TipPosition);
                    }

                    float Dist = DistanceBetweenTwoPoints(UnityVectorExtension.ToVector3(transformedPosition), UnityVectorExtension.ToVector3(nextFingerPosition));

                    fingerPositionString += transformedPosition.x + "," + transformedPosition.y + "," + transformedPosition.z + ",";

                    fingerDistanceString += (int)Dist + ",";
                }
            }
        }
        fingerPositionString += fingerDistanceString;
        fingerDistanceString  = "";
        gestureData           = (numberOfFingers + "," + fingerPositionString).TrimEnd(',');
        fingerPositionString  = "";
    }
        protected bool checkPalmNormalInXZPlane(Hand hand)
        {
            float anglePalmNormal = angle2LeapVectors(hand.PalmNormal, UnityVectorExtension.ToVector(Vector3.up));

            return(anglePalmNormal > 70 && anglePalmNormal < 110);
        }
 protected bool isPalmNormalSameDirectionWith(Hand hand, Vector3 dir)
 {
     return(isSameDirection(hand.PalmNormal, UnityVectorExtension.ToVector(dir)));
 }
Beispiel #30
0
    void Update()
    {
        Transform  camera = Camera.main.transform;
        Ray        ray    = new Ray(camera.position, Vector3.Normalize(camera.rotation * Vector3.forward));
        RaycastHit hit;

        mount_panel.text = setMountPanel();

        if (cubeCanvas != null && geometryTargetObj != null)
        {
            cubeCanvas.transform.rotation = Quaternion.identity;
            cubeCanvas.transform.position = geometryTargetObj.transform.position;
            cubeCanvas.transform.Translate(0, 0, -0.05f);
        }

        if (left_hand.isActiveAndEnabled && right_hand.isActiveAndEnabled)
        {
            if (left_hand.GetLeapHand().GrabStrength > 0.99 && right_hand.GetLeapHand().GrabStrength > 0.99)
            {
                grabMode = GrabMode.Both;
            }
            else if (left_hand.GetLeapHand().GrabStrength > 0.99)
            {
                grabMode = GrabMode.LeftOnly;
            }
            else if (right_hand.GetLeapHand().GrabStrength > 0.99)
            {
                grabMode = GrabMode.RightOnly;
            }
            else
            {
                grabMode = GrabMode.Empty;
            }
        }

        switch (grabMode)
        {
        case GrabMode.Empty:
            if (Physics.Raycast(ray, out hit))            // Hit
            {
                if (hitObject == hit.collider.gameObject) // 같은 블럭
                {
                    if (grabMode == GrabMode.Empty)
                    {
                        hitObject.transform.localScale = new Vector3(1f, 1f, 1f);
                    }

                    if (!cubeAlphaObj.activeSelf)
                    {
                        countdown = timeToSelect;
                        cubeAlphaObj.SetActive(true);
                    }
                    else
                    {
                        countdown -= Time.deltaTime;
                        if (countdown < 0.0f)
                        {
                            cubeCanvas.SetActive(true);
                            countdown = timeToSelect;
                        }
                    }
                }
                else if (hitObject != null)     // 다른 블럭
                {
                    if (blockToggle.isOn)
                    {
                        //nothing
                    }
                    else
                    {
                        cubeAlphaObj.SetActive(false);
                        cubeCanvas.SetActive(false);
                        cubeAlphaObj = null;
                        cubeCanvas   = null;
                        blockToggle  = null;
                        hitObject    = hit.collider.gameObject;
                        cubeAlphaObj = hitObject.transform.GetChild(6).gameObject;
                        cubeCanvas   = hitObject.transform.GetChild(7).gameObject;
                        blockToggle  = cubeCanvas.transform.GetChild(0).GetChild(0).GetComponent <Toggle>();
                    }
                }
                else     // null 블럭
                {
                    hitObject    = hit.collider.gameObject;
                    cubeAlphaObj = hitObject.transform.GetChild(6).gameObject;
                    cubeCanvas   = hitObject.transform.GetChild(7).gameObject;
                    blockToggle  = cubeCanvas.transform.GetChild(0).GetChild(0).GetComponent <Toggle>();
                }
            }
            else     // no Hit
            {
                hitObject.transform.localScale = new Vector3(1f, 1f, 1f);
                if (hitObject != null)     // previous hit block exist
                {
                    if (blockToggle.isOn)
                    {
                        //nothing
                    }
                    else
                    {
                        //hitObject = null, effect = false&null
                        hitObject = null;
                        cubeAlphaObj.SetActive(false);
                        cubeCanvas.SetActive(false);
                        cubeAlphaObj = null;
                        cubeCanvas   = null;
                    }
                }
                else
                {
                }
            }
            break;

        case GrabMode.LeftOnly:
            Debug.Log("left");
            if (Vector3.Distance(hitObject.gameObject.transform.position, UnityVectorExtension.ToVector3(left_hand.GetLeapHand().Fingers[0].TipPosition)) < 0.15f && !blockToggle.isOn)
            {
                hitObject.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f);
                Vector3 newPosition = UnityVectorExtension.ToVector3(left_hand.GetLeapHand().Fingers[0].TipPosition);

                hitObject.transform.position = new Vector3(truncate(newPosition.x), truncate(newPosition.y), truncate(newPosition.z));
            }
            break;

        case GrabMode.RightOnly:
            Debug.Log("right");
            if (Vector3.Distance(hitObject.gameObject.transform.position, UnityVectorExtension.ToVector3(right_hand.GetLeapHand().Fingers[0].TipPosition)) < 0.15f && !blockToggle.isOn)
            {
                hitObject.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f);
                Vector3 newPosition = UnityVectorExtension.ToVector3(right_hand.GetLeapHand().Fingers[0].TipPosition);

                hitObject.transform.position = new Vector3(truncate(newPosition.x), truncate(newPosition.y), truncate(newPosition.z));
            }
            break;

        case GrabMode.Both:
            if (Vector3.Dot(UnityVectorExtension.ToVector3(left_hand.GetLeapHand().PalmNormal), Vector3.up) > 0 && Vector3.Dot(UnityVectorExtension.ToVector3(right_hand.GetLeapHand().PalmNormal), Vector3.up) > 0)
            {
                block_panel.SetActive(true);
            }
            //float palm_distance = Vector3.Distance(UnityVectorExtension.ToVector3(left_hand.GetLeapHand().PalmPosition), UnityVectorExtension.ToVector3(right_hand.GetLeapHand().PalmPosition));
            //hitObject.transform.localScale = new Vector3(truncate(palm_distance), truncate(palm_distance), truncate(palm_distance));
            break;
        }
    }