void newFrameHandler(Leap.Frame frame)
        {
            HandList hands = frame.Hands;


            this.handCountValue.Content = hands.Count;
            //get the front most hand
            if (hands.Count > 0 && hands[0] != null)
            {
                Hand firstHand = hands[0];

                Leap.Vector direction  = firstHand.Direction;
                Leap.Vector PalmNormal = firstHand.PalmNormal;
                Leap.Vector center     = firstHand.PalmPosition;
                Leap.Vector moveRate   = firstHand.PalmVelocity;


                this.directionValue.Content    = direction;
                this.palmPositionValue.Content = center;
                this.normalValue.Content       = PalmNormal;

                FingerList fingers = firstHand.Fingers;
                this.fingerCountValue.Content = fingers.Count();
            }

            if (hands.Count > 1 && hands[1] != null)
            {
                Hand secondHand = hands[1];

                Leap.Vector direction  = secondHand.Direction;
                Leap.Vector PalmNormal = secondHand.PalmNormal;
                Leap.Vector center     = secondHand.PalmPosition;
                Leap.Vector moveRate   = secondHand.PalmVelocity;


                this.secondDirectionValue.Content    = direction;
                this.secondPalmPositionValue.Content = center;
                this.secondNormalValue.Content       = PalmNormal;

                //pass finger number in front hand to label( it is always five, with the new Leap Motion Hand model)
                FingerList fingers = secondHand.Fingers;
                this.secondFingerCountValue.Content = fingers.Count();
            }


            this.idValue.Content        = frame.Id.ToString();
            this.frameRateValue.Content = frame.CurrentFramesPerSecond.ToString();
            this.isValidValue.Content   = frame.IsValid.ToString();
        }
        List <Matrix <float> > transform_points(FingerList leap_points, Leap.Hand hand)
        {
            int pointsnum = leap_points.Count();
            List <Matrix <float> > new_leap = new List <Matrix <float> >();

            for (int i = 0; i < pointsnum; i++)
            {
                Matrix <float> leap_point = new Matrix <float>(3, 1);
                //leap_point.Data[0, 0] = leap_points[i].StabilizedTipPosition.x/1000;
                //leap_point.Data[1, 0] = leap_points[i].StabilizedTipPosition.y/1000;
                //leap_point.Data[2, 0] = leap_points[i].StabilizedTipPosition.z/1000;
                leap_point.Data[0, 0] = leap_points[i].TipPosition.x / 1000;
                leap_point.Data[1, 0] = leap_points[i].TipPosition.y / 1000;
                leap_point.Data[2, 0] = leap_points[i].TipPosition.z / 1000;
                Matrix <float> trans_points = new Matrix <float>(3, 1);
                trans_points = R * leap_point + T;
                new_leap.Add(trans_points);//5 points
            }

            Matrix <float> leap_palm = new Matrix <float>(3, 1);

            leap_palm.Data[0, 0] = hand.PalmPosition.x / 1000;
            leap_palm.Data[1, 0] = hand.PalmPosition.z / 1000;
            leap_palm.Data[2, 0] = hand.PalmPosition.y / 1000;

            Matrix <float> trans_palm = new Matrix <float>(3, 1);

            trans_palm = R * leap_palm + T;
            new_leap.Add(trans_palm);// 1 points

            for (int i = 0; i < pointsnum; i++)
            {
                Bone bone;
                foreach (Bone.BoneType boneType in (Bone.BoneType[])Enum.GetValues(typeof(Bone.BoneType)))
                {
                    Matrix <float> leap_point = new Matrix <float>(3, 1);
                    bone = hand.Fingers[i].Bone(boneType);
                    leap_point.Data[0, 0] = bone.PrevJoint.x / 1000;
                    leap_point.Data[1, 0] = bone.PrevJoint.y / 1000;
                    leap_point.Data[2, 0] = bone.PrevJoint.z / 1000;
                    Matrix <float> trans_points = new Matrix <float>(3, 1);
                    trans_points = R * leap_point + T;
                    new_leap.Add(trans_points);// 4 * 5 = 20 points
                }
            }
            return(new_leap);
        }
        public void CountNumber(Leap.Frame frame)
        {
            //create handlist
            HandList hands = frame.Hands;

            //get the front most hand
            Hand frontmost = hands.Frontmost;

            //pass the front most hand type to label
            if (frontmost.IsLeft)
            {
                frontmostType.Content = "Left";
            }
            else
            {
                frontmostType.Content = "Right";
            }

            //pass the hand's basic information to its labels
            foreach (Hand hand in hands)
            {
                int         handCount  = hands.Count();
                Leap.Vector direction  = hand.Direction;
                Leap.Vector PalmNormal = hand.PalmNormal;
                Leap.Vector center     = hand.PalmPosition;
                Leap.Vector moveRate   = hand.PalmVelocity;

                HandCount.Content    = handCount;
                Direction.Content    = direction;
                PalmPosition.Content = center;
                normalVector.Content = PalmNormal;

                //pass finger number in front hand to label( it is always five, with the new Leap Motion Hand model)
                FingerList fingers = hand.Fingers;
                FingerCount.Content = fingers.Count();
            }
        }
        /// <summary>
        /// Allows the game component to update itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        public override void Update(GameTime gameTime)
        {
            // TODO: Add your update code here
            if (controller.IsConnected)
            {
                //clear fingers
                fingerPoints.Clear();
                var frame = controller.Frame();

                debugLine = "";

                SafeWriteLine("Frame id: " + frame.Id
                        + ", timestamp: " + frame.Timestamp
                        + ", hands: " + frame.Hands.Count
                        + ", fingers: " + frame.Fingers.Count
                        + ", tools: " + frame.Tools.Count
                        + ", gestures: " + frame.Gestures().Count);

                if (!(frame.Hands.Count() == 0 ))
                {
                    // Get the first hand
                    hand = frame.Hands[0];

                    firstHandLoc = new Vector2(NormalizeWidth(hand.SphereCenter.x), NormalizeHeight( hand.SphereCenter.y));
                    // Check if the hand has any fingers
                    fingers = hand.Fingers;
                    if (!(fingers.Count() == 0))
                    {
                        // Calculate the hand's average finger tip position
                        Vector avgPos = Vector.Zero;
                        foreach (Finger finger in fingers)
                        {
                            fingerPoints.Add(new Vector2(
                                NormalizeWidth(finger.TipPosition.x),
                                NormalizeHeight(finger.TipPosition.y)
                                )
                            );
                            avgPos += finger.TipPosition;
                        }
                        avgPos /= fingers.Count;

                        SafeWriteLine("Hand has " + fingers.Count
                                    + " fingers, average finger tip position: " + avgPos);

                    }

                    // Get the hand's sphere radius and palm position

                    SafeWriteLine("Hand sphere radius: " + hand.SphereRadius.ToString("n2")
                                + " mm, palm position: " + hand.PalmPosition);

                    // Get the hand's normal vector and direction
                    Vector normal = hand.PalmNormal;
                    Vector direction = hand.Direction;

                    // Calculate the hand's pitch, roll, and yaw angles

                    SafeWriteLine("Hand pitch: " + direction.Pitch * 180.0f / (float)Math.PI + " degrees, "
                                + "roll: " + normal.Roll * 180.0f / (float)Math.PI + " degrees, "
                                + "yaw: " + direction.Yaw * 180.0f / (float)Math.PI + " degrees");

                }

                // Get gestures
                gestures = frame.Gestures();
                Gesture gesture;
                for (int i = 0; i < gestures.Count; i++)
                {
                    gesture = gestures[i];

                    switch (gesture.Type)
                    {
                        case Gesture.GestureType.TYPECIRCLE:
                            CircleGesture circle = new CircleGesture(gesture);

                            // Calculate clock direction using the angle between circle normal and pointable
                            String clockwiseness;
                            if (circle.Pointable.Direction.AngleTo(circle.Normal) <= Math.PI / 4)
                            {
                                //Clockwise if angle is less than 90 degrees
                                clockwiseness = "clockwise";
                            }
                            else
                            {
                                clockwiseness = "counterclockwise";
                            }

                            float sweptAngle = 0;

                            // Calculate angle swept since last frame
                            if (circle.State != Gesture.GestureState.STATESTART)
                            {
                                CircleGesture previousUpdate = new CircleGesture(controller.Frame(1).Gesture(circle.Id));
                                sweptAngle = (circle.Progress - previousUpdate.Progress) * 360;
                            }

                            SafeWriteLine("Circle id: " + circle.Id
                                           + ", " + circle.State
                                           + ", progress: " + circle.Progress
                                           + ", radius: " + circle.Radius
                                           + ", angle: " + sweptAngle
                                           + ", " + clockwiseness);

                            break;
                        case Gesture.GestureType.TYPESWIPE:
                            SwipeGesture swipe = new SwipeGesture(gesture);

                            SafeWriteLine("Swipe id: " + swipe.Id
                                           + ", " + swipe.State
                                           + ", position: " + swipe.Position
                                           + ", direction: " + swipe.Direction
                                           + ", speed: " + swipe.Speed);

                            break;
                        case Gesture.GestureType.TYPEKEYTAP:
                            KeyTapGesture keytap = new KeyTapGesture(gesture);

                            SafeWriteLine("Tap id: " + keytap.Id
                                           + ", " + keytap.State
                                           + ", position: " + keytap.Position
                                           + ", direction: " + keytap.Direction);

                            break;
                        case Gesture.GestureType.TYPESCREENTAP:
                            ScreenTapGesture screentap = new ScreenTapGesture(gesture);

                            SafeWriteLine("Tap id: " + screentap.Id
                                           + ", " + screentap.State
                                           + ", position: " + screentap.Position
                                           + ", direction: " + screentap.Direction);

                            break;
                        default:
                            SafeWriteLine("Unknown gesture type.");
                            break;
                    }
                }

                if (!(frame.Hands.Count() == 0) || !(frame.Gestures().Count ==0))
                {
                    //SafeWriteLine("");
                }
            }
            base.Update(gameTime);
        }
Example #5
0
        public override void OnFrame(Controller controller)
        {
            //get screens
            screens = controller.CalibratedScreens;

            //calculate fps
            double fps = 1.0 * Stopwatch.Frequency / (stopWatch.ElapsedTicks - lasttime);

            lasttime = stopWatch.ElapsedTicks;

            timeaccum += 1.0 / fps;
            framesaccum++;
            if (timeaccum >= 0.5)
            {
                UpdateText(form.fps_label, "fps: " + Convert.ToString((int)(1.0 * framesaccum / timeaccum)));
                timeaccum  -= 0.5;
                framesaccum = 0;
            }

            bool  wasd = false;
            float scale, yoffset, ws, ad;
            bool  intersect;

            lock (thisLock) //get access to input data
            {
                scale     = (float)form.sens;
                yoffset   = (float)form.yoffset;
                ws        = (float)form.wsval;
                ad        = (float)form.adval;
                intersect = form.intersect;
                wasd      = form.wasd_check.Checked;
            }

            //move phase for keyboard simulation
            phase += par / fps * freq;
            if (phase > 1)
            {
                par   = -1;
                phase = 1;
            }
            if (phase < 0)
            {
                par   = 1;
                phase = 0;
            }

            Pointable point1    = null;
            bool      point1_ok = false;

            // Get the most recent frame
            Frame frame = controller.Frame();

            if (!frame.Tools.Empty)
            {
                //get the nearest tool
                int      nearest    = 0;
                double   nearestval = double.MaxValue;
                ToolList tools      = frame.Tools;
                for (int i = 0; i < tools.Count(); i++)
                {
                    if (tools[i].TipPosition.z < nearestval)
                    {
                        nearest    = i;
                        nearestval = tools[i].TipPosition.z;
                    }
                }
                point1    = tools[nearest];
                point1_ok = true;
            }
            else if (!frame.Hands.Empty)
            {
                // Get the first hand
                Hand hand = frame.Hands[0];

                // Check if the hand has any fingers
                FingerList fingers = hand.Fingers;
                if (!fingers.Empty)
                {
                    //get the finger closest to the screen (smallest z)
                    int    nearest    = 0;
                    double nearestval = double.MaxValue;
                    for (int i = 0; i < fingers.Count(); i++)
                    {
                        if (fingers[i].TipPosition.z < nearestval)
                        {
                            nearest    = i;
                            nearestval = fingers[i].TipPosition.z;
                        }
                    }
                    point1    = fingers[nearest];
                    point1_ok = true;
                }
            }

            if (point1_ok) //there is finger or tool
            {
                PointConverter pc = new PointConverter();
                Point          pt = new Point();

                //wasd not checked
                if (!wasd)
                {
                    //interset/project on screen
                    Vector intersection;
                    if (intersect)
                    {
                        intersection = screens[0].Intersect(point1, true, 4.0f / scale);
                    }
                    else
                    {
                        intersection = screens[0].Project(point1.TipPosition, true, 4.0f / scale);
                    }

                    //scale and offset screen position
                    double scx = (intersection.x - 0.5) * scale + 0.5;
                    double scy = (1 - intersection.y - 0.5) * scale + 0.5 + yoffset;
                    pt.X = (int)(scx * screens[0].WidthPixels);
                    pt.Y = (int)(scy * screens[0].HeightPixels);

                    Cursor.Position = pt;
                }
                //if wasd is checked
                else
                {
                    string str = "";

                    float x = point1.TipPosition.x;
                    float y = point1.TipPosition.y;
                    float z = point1.TipPosition.z;

                    var  hWnd = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;
                    Hand hand = frame.Hands[0];

                    double xph = -hand.PalmNormal.Roll * ad * 8;                                    //steering using roll
                    double zph = (Math.Abs(hand.PalmPosition.z - 100) - ws * 200.0) / (200.0 * ws); //acceleration using z

                    //stroke or release given keys

                    if (xph > 0 && Math.Abs(xph) > phase)
                    {
                        str += "D";
                        if (!pD || Math.Abs(xph) > 1)
                        {
                            Stroke(0x20);
                        }
                        pD = true;
                    }
                    else
                    {
                        if (pD)
                        {
                            Release(0x20);
                        }
                        pD = false;
                    }
                    if (xph < 0 && Math.Abs(xph) > phase)
                    {
                        str += "A";
                        if (!pA || Math.Abs(xph) > 1)
                        {
                            Stroke(0x1E);
                        }
                        pA = true;
                    }
                    else
                    {
                        if (pA)
                        {
                            Release(0x1E);
                        }
                        pA = false;
                    }

                    if (z > 0 && zph > phase)
                    {
                        str += "S";
                        if (!pS || zph > 1)
                        {
                            Stroke(0x1F);
                        }
                        pS = true;
                    }
                    else
                    {
                        if (pS)
                        {
                            Release(0x1F);
                        }
                        pS = false;
                    }
                    if (z < 0 && zph > phase)
                    {
                        str += "W";
                        if (!pW || zph > 1)
                        {
                            Stroke(0x11);
                        }
                        pW = true;
                    }
                    else
                    {
                        if (pW)
                        {
                            Release(0x11);
                        }
                        pW = false;
                    }

                    UpdateText(form.debug_label, Convert.ToString(str));
                }
            }
            else
            {
                if (pW)
                {
                    Release(0x11);
                }
                if (pA)
                {
                    Release(0x1E);
                }
                if (pS)
                {
                    Release(0x1F);
                }
                if (pD)
                {
                    Release(0x20);
                }
                pW = false;
                pA = false;
                pS = false;
                pD = false;
            }
        }