Ejemplo n.º 1
0
        public bool Update(Frame frame)
        {
            _LeftHand.Update(frame);
            _RightHand.Update(frame);
            _PotentialHands[0].Update(frame);
            _PotentialHands[1].Update(frame);

            foreach (var h in frame.Hands)
            {
                // Skip all the currently-tracked hands
                if (h.Id == _LeftHand.Id ||
                    h.Id == _RightHand.Id ||
                    h.Id == _PotentialHands[0].Id ||
                    h.Id == _PotentialHands[1].Id
                    )
                {
                    continue;
                }

                // New potential hand
                foreach (var ph in _PotentialHands)
                {
                    if (ph.IsFinalized)
                    {
                        ph.Initialize(h);
                        break;
                    }
                }
                // else we already have two potentials?  too many hands!
            }

            // Check for a new left hand
            if (_LeftHand.IsFinalized)
            {
                for (var i = 0; i < 2; i++)
                {
                    if (_PotentialHands[i].IsStabilized && (!_RightHand.IsFinalized || _PotentialHands[i].StabilizedHand.PalmPosition.x < 0))
                    {
                        _LeftHand.PromotePotentialHand(_PotentialHands[i]);
                        break;
                    }
                }
            }

            // Check for a new left hand
            if (_RightHand.IsFinalized)
            {
                for (var i = 0; i < 2; i++)
                {
                    if (_PotentialHands[i].IsStabilized && (!_LeftHand.IsFinalized || _PotentialHands[i].StabilizedHand.PalmPosition.x > 0))
                    {
                        _RightHand.PromotePotentialHand(_PotentialHands[i]);
                        break;
                    }
                }
            }

            return(true);
        }
Ejemplo n.º 2
0
        public void OnFrame(Frame frame)
        {
            if (!_ActiveHand.Update(frame))
            {
                _IsGrabbed = false;
                if (!frame.Hands.IsEmpty)
                {
                    _ActiveHand.Initialize(frame.Hands.Leftmost);
                }
            }

            if (!_ActiveHand.IsFinalized)
            {
                _LogAction(_ActiveHand.Dump());
            }

            // Do nothing if the hand is not yet stabilized
            if (!_ActiveHand.IsStabilized)
            {
                return;
            }

            // We have the same Hand as in the past and we're still grabbed.
            if (_IsGrabbed)
            {
                if (_ActiveHand.CurrentHand.Fingers.Count >= 3)
                {
                    _IsGrabbed = false;
                }
                else
                {
                    var startY = _ActiveHand.StabilizedHand.StabilizedPalmPosition.y;
                    var y      = _ActiveHand.CurrentHand.StabilizedPalmPosition.y;
                    //_LogAction(String.Format("Hand {0} now at {1:0.0} was grabbed at {2:0.0}.", _ActiveHand.Id, y, startY));
                    if (y < startY - 15)
                    {
                        for (var i = 0; i < Math.Floor((startY - y) / 20); i++)
                        {
                            Native.ScrollActiveWindow(false);
                        }
                    }
                    else if (y > startY + 15)
                    {
                        for (var i = 0; i < Math.Floor((y - startY) / 20); i++)
                        {
                            Native.ScrollActiveWindow(true);
                        }
                    }
                }
            }
            else if (_ActiveHand.CurrentHand.Fingers.Count < 2)
            {
                _IsGrabbed = true;
            }

            foreach (var g in frame.Gestures().Where(g => g.Type == Gesture.GestureType.TYPECIRCLE))
            {
                var circle = new CircleGesture(g);

                var isClockwise = (circle.Pointable.Direction.AngleTo(circle.Normal) <= Math.PI / 4);

                if (circle.Progress < _Progress || circle.Progress > _Progress + 1)
                {
                    Native.ScrollActiveWindow(!isClockwise);
                    _Progress = Convert.ToInt32(Math.Floor(circle.Progress));
                }
            }
        }