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); }
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)); } } }