public override bool IsFingerBent(Hand handId, Finger fingerId)
        {
#if VRTK_DEFINE_SDK_LEAP_MOTION
            Leap.Hand currentHand = GetLeapHand(handId);
            if (currentHand == null)
            {
                return(false);
            }

            Leap.Finger.FingerType leapFingerType = VirtuosoFingerToLeapFinger(fingerId);

            foreach (Leap.Finger finger in currentHand.Fingers)
            {
                if (finger.Type == leapFingerType)
                {
                    return(!finger.IsExtended);
                }
            }

            // finger not found; therefor no
            return(false);
#else
            throw new System.NotImplementedException();
#endif
        }
Ejemplo n.º 2
0
        //public bool isExtended; bRoke for now

        public fingerData(RiggedFinger riggedFinger /*, Finger finger*/)
        {
            this.type           = riggedFinger.fingerType;
            this.pointRay       = riggedFinger.GetRay();
            this.tipPosition    = pointRay.origin;
            this.pointDirection = pointRay.direction;
            //this.isExtended = finger.IsExtended;
        }
Ejemplo n.º 3
0
        public double FingerFlexoExtensionIF(Leap.Finger.FingerType finger)
        {
            Frame frame = LeapService.GetFrame();

            if (frame.Hands.Count != 0)
            {
                Vector start  = frame.Hands[0].Fingers[(int)finger].Bone(Bone.BoneType.TYPE_PROXIMAL).PrevJoint;
                Vector middle = frame.Hands[0].Fingers[(int)finger].Bone(Bone.BoneType.TYPE_PROXIMAL).NextJoint;
                Vector end    = frame.Hands[0].Fingers[(int)finger].Bone(Bone.BoneType.TYPE_INTERMEDIATE).NextJoint;

                return(180 - LeapUtils.getAngleJoints(start, middle, end));
            }
            else
            {
                return(0);
            }
        }
Ejemplo n.º 4
0
        public Transform GetMetaCarpal(Leap.Finger.FingerType type)
        {
            switch (type)
            {
            case Finger.FingerType.TYPE_THUMB:
                return(thumbMetaCarpal);

            case Finger.FingerType.TYPE_INDEX:
                return(indexMetaCarpal);

            case Finger.FingerType.TYPE_MIDDLE:
                return(middleMetaCarpal);

            case Finger.FingerType.TYPE_RING:
                return(ringMetaCarpal);

            case Finger.FingerType.TYPE_PINKY:
                return(pinkyMetaCarpal);

            default:
                return(null);
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Converts a FingerFilter enum type to a Leap.Finger.FingerType enum.
        ///
        /// There is only one possible failure state: being fed an enum as an integer that is out of range.
        ///
        /// Upon failure, the method will throw a System.NotSupported exception with details about the failure.
        /// </summary>
        /// <param name="fingerType">FingerType to convert.</param>
        /// <returns></returns>
        public static FingerFilter FingerFilterFromFingerType(Leap.Finger.FingerType fingerType)
        {
            switch (fingerType)
            {
            case Finger.FingerType.TYPE_INDEX:
                return(FingerFilter.index);

            case Finger.FingerType.TYPE_MIDDLE:
                return(FingerFilter.middle);

            case Finger.FingerType.TYPE_PINKY:
                return(FingerFilter.pinky);

            case Finger.FingerType.TYPE_RING:
                return(FingerFilter.ring);

            case Finger.FingerType.TYPE_THUMB:
                return(FingerFilter.thumb);

            default:
                throw new System.NotSupportedException("Error in HandProperties.cs: An out of bounds enum value " + ((int)fingerType).ToString() + " was supplied.");
                return(FingerFilter.thumb);
            }
        }
Ejemplo n.º 6
0
        void SetHandData(Hand hand, int frameID)
        {
            for (int fingerIndex = 0; fingerIndex < hand.Fingers.Count; fingerIndex++)
            {
                Leap.Finger.FingerType fingerType = (Leap.Finger.FingerType)fingerIndex;
                float _fingerWidth = fingerWidth * MM_TO_M;

                Transform metaCarpalTransform = null;

                switch (fingerType)
                {
                case Finger.FingerType.TYPE_THUMB:
                    metaCarpalTransform = thumbMetaCarpal;
                    break;

                case Finger.FingerType.TYPE_INDEX:
                    metaCarpalTransform = indexMetaCarpal;
                    break;

                case Finger.FingerType.TYPE_MIDDLE:
                    metaCarpalTransform = middleMetaCarpal;
                    break;

                case Finger.FingerType.TYPE_RING:
                    metaCarpalTransform = ringMetaCarpal;
                    break;

                case Finger.FingerType.TYPE_PINKY:
                    metaCarpalTransform = pinkyMetaCarpal;
                    break;

                default:
                    Debug.LogError("Invalid finger type for finger index: " + fingerIndex);
                    break;
                }

                // NOTE: if our type is thumb, our 'meta carpal transform' is actually our proximal,
                // and we'll need to generate a zero-length metacarpal for it
                Transform proximalTransform     = (fingerType == Finger.FingerType.TYPE_THUMB) ? metaCarpalTransform : metaCarpalTransform.GetChild(0);
                Transform intermediateTransform = proximalTransform.GetChild(0);
                Transform distalTransform       = intermediateTransform.GetChild(0);
                Transform tip = distalTransform.GetChild(0);

                Finger finger = hand.Fingers[fingerIndex];
                SetBone(ref finger.bones[(int)Bone.BoneType.TYPE_METACARPAL], metaCarpalTransform, proximalTransform, Bone.BoneType.TYPE_METACARPAL, _fingerWidth);
                SetBone(ref finger.bones[(int)Bone.BoneType.TYPE_PROXIMAL], proximalTransform, intermediateTransform, Bone.BoneType.TYPE_PROXIMAL, _fingerWidth);
                SetBone(ref finger.bones[(int)Bone.BoneType.TYPE_INTERMEDIATE], intermediateTransform, distalTransform, Bone.BoneType.TYPE_INTERMEDIATE, _fingerWidth);
                SetBone(ref finger.bones[(int)Bone.BoneType.TYPE_DISTAL], distalTransform, tip, Bone.BoneType.TYPE_DISTAL, _fingerWidth);

                // update the rest of the finger values.
                Vector tipPosition = tip.transform.position.ToVector();
                Vector direction   = new Vector(0, 0, 0);

                float fingerLength =
                    Vector3.Distance(proximalTransform.position, intermediateTransform.position) +
                    Vector3.Distance(intermediateTransform.position, distalTransform.position) +
                    Vector3.Distance(distalTransform.position, tip.position);                     // add up joint lengths for this

                hand.Fingers[fingerIndex].Id          = (int)fingerType;
                hand.Fingers[fingerIndex].HandId      = handID;
                hand.Fingers[fingerIndex].TipPosition = tipPosition;
                hand.Fingers[fingerIndex].Direction   = direction;
                hand.Fingers[fingerIndex].Length      = fingerLength;
            }

            // fill out rest of hand
            // forearm length is 0.27
            // forearm width is 0.09

            Vector forearmStart, forearmEnd;

            forearmStart = GetForearmStart().ToVector();
            forearmEnd   = GetForearmEnd().ToVector();

            Quaternion forearmRotation = GetForearmRotation();

            // might be possible to create this as a bone? Not sure what magic the constructor does.

            /*Arm arm = new Arm(forearmStart, forearmEnd, (forearmStart + forearmEnd) * 0.5f,
             *      (forearmEnd - forearmStart).Normalized, forearmLength, 0.09f,
             *      forearmRotation.ToLeapQuaternion());*/

            hand.Arm.PrevJoint = forearmStart;
            hand.Arm.NextJoint = forearmEnd;
            hand.Arm.Center    = (forearmStart + forearmEnd) * 0.5f;
            hand.Arm.Direction = (forearmEnd - forearmStart).Normalized;
            hand.Arm.Length    = forearmLength;
            hand.Arm.Width     = 0.09f;
            hand.Arm.Rotation  = forearmRotation.ToLeapQuaternion();

            Vector palmPosition = GetPalmPosition().ToVector();
            Vector palmNormal   = GetPalmNormal().ToVector();
            Vector palmVelocity = new Vector(0, 0, 0);

            //palmWidth = 85f * MM_TO_M;

            LeapQuaternion rotation = GetHandRotation().ToLeapQuaternion();

            hand.FrameId                = frameID;
            hand.PalmPosition           = palmPosition;
            hand.PalmVelocity           = palmVelocity;
            hand.PalmNormal             = palmNormal;
            hand.Direction              = wrist.TransformDirection(modelPalmFacing).ToVector();
            hand.Rotation               = rotation;
            hand.PalmWidth              = palmWidth;
            hand.StabilizedPalmPosition = palmPosition;
            hand.WristPosition          = wrist.position.ToVector();
            hand.TimeVisible            = timeVisible;
        }
Ejemplo n.º 7
0
        void SetHandData(Hand hand, int frameID)
        {
            // fill out palm and hand
            // forearm length is 0.27
            // forearm width is 0.09

            Vector forearmStart, forearmEnd;

            forearmStart = GetForearmStart().ToVector();
            forearmEnd   = GetForearmEnd().ToVector();

            Quaternion forearmRotation = GetForearmRotation();

            arm.PrevJoint = forearmStart;
            arm.NextJoint = forearmEnd;
            arm.Center    = (forearmStart + forearmEnd) * 0.5f;
            arm.Direction = (forearmEnd - forearmStart).Normalized;
            arm.Length    = forearmLength;
            arm.Width     = 0.09f;
            arm.Rotation  = forearmRotation.ToLeapQuaternion();

            Vector palmPosition = GetPalmPosition().ToVector();
            Vector palmNormal   = GetPalmNormal().ToVector();
            Vector palmVelocity = (visibleTime != 0 &&
                                   (visibleTime - previousHand.TimeVisible != 0)) ? (previousHand.PalmPosition - palmPosition).Normalized / (visibleTime - previousHand.TimeVisible) :
                                  new Vector(0, 0, 0);
            Vector handDirection = wrist.TransformDirection(modelFingerPointing).ToVector();

            LeapQuaternion rotation = GetHandRotation().ToLeapQuaternion();

            fingers = hand.Fingers;

            // fingers
            for (int fingerIndex = 0; fingerIndex < 5; fingerIndex++)
            {
                Leap.Finger.FingerType fingerType = (Leap.Finger.FingerType)fingerIndex;

                Transform metaCarpalTransform = null;

                // set up our bones
                Bone[] bones = null;

                switch (fingerType)
                {
                case Finger.FingerType.TYPE_THUMB:
                    metaCarpalTransform = thumbMetaCarpal;
                    bones = thumbBones;
                    break;

                case Finger.FingerType.TYPE_INDEX:
                    metaCarpalTransform = indexMetaCarpal;
                    bones = indexBones;
                    break;

                case Finger.FingerType.TYPE_MIDDLE:
                    metaCarpalTransform = middleMetaCarpal;
                    bones = middleBones;
                    break;

                case Finger.FingerType.TYPE_RING:
                    metaCarpalTransform = ringMetaCarpal;
                    bones = ringBones;
                    break;

                case Finger.FingerType.TYPE_PINKY:
                    metaCarpalTransform = pinkyMetaCarpal;
                    bones = pinkyBones;
                    break;

                default:
                    Debug.LogError("Invalid finger type for finger index: " + fingerIndex);
                    break;
                }

                // NOTE: if our type is thumb, our 'meta carpal transform' is actually our proximal,
                // and we'll need to generate a zero-length metacarpal for it
                Transform proximalTransform     = (fingerType == Finger.FingerType.TYPE_THUMB) ? metaCarpalTransform : metaCarpalTransform.GetChild(0);
                Transform intermediateTransform = proximalTransform.GetChild(0);
                Transform distalTransform       = intermediateTransform.GetChild(0);
                Transform tip         = distalTransform.GetChild(0);
                Vector    tipPosition = tip.transform.position.ToVector();
                Vector    direction   = distalTransform.TransformVector(modelFingerPointing).ToVector();

                float fingerLength =
                    Vector3.Distance(proximalTransform.position, intermediateTransform.position) +
                    Vector3.Distance(intermediateTransform.position, distalTransform.position) +
                    Vector3.Distance(distalTransform.position, tip.position);                     // add up joint lengths for this
                float fingerDot = Vector3.Dot(direction.ToVector3(), handDirection.ToVector3());
                fingerDots[fingerIndex] = fingerDot;
                bool isExtended = fingerDot > 0.5f;

                SetBone(bones[(int)Bone.BoneType.TYPE_METACARPAL], metaCarpalTransform, proximalTransform, Bone.BoneType.TYPE_METACARPAL, fingerWidth[fingerIndex]);
                SetBone(bones[(int)Bone.BoneType.TYPE_PROXIMAL], proximalTransform, intermediateTransform, Bone.BoneType.TYPE_PROXIMAL, fingerWidth[fingerIndex]);
                SetBone(bones[(int)Bone.BoneType.TYPE_INTERMEDIATE], intermediateTransform, distalTransform, Bone.BoneType.TYPE_INTERMEDIATE, fingerWidth[fingerIndex]);
                SetBone(bones[(int)Bone.BoneType.TYPE_DISTAL], distalTransform, tip, Bone.BoneType.TYPE_DISTAL, fingerWidth[fingerIndex]);

                fingers[fingerIndex].bones       = bones;
                fingers[fingerIndex].HandId      = handID;
                fingers[fingerIndex].TimeVisible = visibleTime;
                fingers[fingerIndex].TipPosition = tipPosition;
                fingers[fingerIndex].Direction   = direction;
                fingers[fingerIndex].Width       = fingerWidth[fingerIndex];
                fingers[fingerIndex].Length      = fingerLength;
                fingers[fingerIndex].IsExtended  = isExtended;
                fingers[fingerIndex].Type        = (Finger.FingerType)fingerIndex;
                fingers[fingerIndex].Id          = fingerIndex;
                fingers[fingerIndex].HandId      = handID;
            }

            hand.FrameId                = frameID;
            hand.PalmPosition           = palmPosition;
            hand.PalmVelocity           = palmVelocity;
            hand.PalmNormal             = palmNormal;
            hand.Direction              = handDirection;
            hand.Rotation               = rotation;
            hand.PalmWidth              = palmWidth;
            hand.StabilizedPalmPosition = palmPosition;
            hand.WristPosition          = wrist.position.ToVector();
            hand.GrabAngle              = 0;
            hand.GrabStrength           = gripStrength;
            hand.TimeVisible            = visibleTime;
            hand.Confidence             = confidence;
            hand.PinchStrength          = pinchStrength;
            hand.PinchDistance          = (fingers[(int)Finger.FingerType.TYPE_INDEX].TipPosition.ToVector3() -
                                           fingers[(int)Finger.FingerType.TYPE_THUMB].TipPosition.ToVector3()).magnitude;
            hand.Arm     = arm;
            hand.Fingers = fingers;
            hand.IsLeft  = isLeft;
        }