private void TrackGesture(Person person, ref ScissorGestureTracker gestureTracker) { if (person.leftHand == null || person.rightHand == null) { gestureTracker.reset(); return; } Hand leftHand = person.leftHand; Hand rightHand = person.rightHand; Vector2 leftHandVelocity = leftHand.getHeading(); Vector2 rightHandVelocity = rightHand.getHeading(); Vector2 relativeHeading = Vector2.Subtract(leftHandVelocity, rightHandVelocity); Vector2.Normalize(relativeHeading); DotNET.Point leftHandPosition = leftHand.getLocation(); DotNET.Point rightHandPosition = rightHand.getLocation(); DotNET.Vector tempVec = DotNET.Point.Subtract(rightHandPosition, leftHandPosition); Vector2 leftToRight = new Vector2((float) tempVec.X, (float) tempVec.Y); double dotProduct = Vector2.Dot(relativeHeading, leftToRight); if (dotProduct > 0) { gestureTracker.currState = ScissorGestureState.Converging; } else { gestureTracker.currState = ScissorGestureState.Diverging; } // If the user's hands are converging... if (gestureTracker.currState == ScissorGestureState.Converging) { double leftHandRadius = leftHand.getAgentRadius(); double rightHandRadius = rightHand.getAgentRadius(); double minContactRadius = (leftHandRadius + rightHandRadius) * CONTACT_SCALE; // Check if they're proximal if (minContactRadius <= leftToRight.Length()) { gestureTracker.currState = ScissorGestureState.Proximal; } } if (gestureTracker.currState == ScissorGestureState.Proximal) { // send message GestureDetected(this, new ScissorGestureEventArgs(person, false, CONTACT_SCALE)); } else if (gestureTracker.currState == ScissorGestureState.Diverging) { GestureDetected(this, new ScissorGestureEventArgs(person, true, CONTACT_SCALE)); } }
private ScissorGestureTracker getTrackerForPerson(Person p) { bool extractionSuccessful; ScissorGestureTracker output; if (scissorGestureTrackers.ContainsKey(p) != true) { ScissorGestureTracker newSGT = new ScissorGestureTracker(); scissorGestureTrackers.Add(p, newSGT); } extractionSuccessful = scissorGestureTrackers.TryGetValue(p, out output); return output; }