private void kinectSensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { using (SkeletonFrame frame = e.OpenSkeletonFrame()) { if (frame == null) { return; } frame.GetSkeletons(ref skeletons); if (skeletons.All(s => s.TrackingState == SkeletonTrackingState.NotTracked)) { return; } foreach (var skeleton in skeletons) { if (skeleton.TrackingState != SkeletonTrackingState.Tracked) { continue; } foreach (Joint joint in skeleton.Joints) { if (joint.TrackingState != JointTrackingState.Tracked) { continue; } if (joint.JointType == JointType.HandRight) { MouseControllerAction action = MouseController.Current.SetHandPosition(kinectSensor, joint, skeleton); BroadcastManager.GetBroadcastEngine().ScheduleForBroadcasting(action); } } } } }
public MouseControllerAction SetHandPosition(KinectSensor sensor, Joint joint, Skeleton skeleton) { MouseControllerAction action = new MouseControllerAction(); action.mouseMove = false; Vector2 vector2 = FilterJointPosition(sensor, joint); if (!lastKnownPosition.HasValue) { lastKnownPosition = vector2; previousDepth = joint.Position.Z; return(action); } bool isClicked = false; if (DisableGestureClick) { } else { if (ClickGestureDetector == null) { isClicked = Math.Abs(joint.Position.Z - previousDepth) > 0.05f; } else { isClicked = clickGestureDetected; } } if (impostor != null) { // Still magnetized ? if ((vector2 - lastKnownPosition.Value).Length > 0.1f) { impostor.Progression = 0; isMagnetized = false; previousMagnetizedElement = null; } // Looking for nearest magnetic control float minDistance = float.MaxValue; FrameworkElement nearestElement = null; var impostorPosition = new Vector2((float)(vector2.X * impostorCanvas.ActualWidth), (float)(vector2.Y * impostorCanvas.ActualHeight)); foreach (FrameworkElement element in MagneticsControl) { // Getting the four corners var position = element.TransformToAncestor(rootVisual).Transform(new Point(0, 0)); var p1 = new Vector2((float)position.X, (float)position.Y); var p2 = new Vector2((float)(position.X + element.ActualWidth), (float)position.Y); var p3 = new Vector2((float)(position.X + element.ActualWidth), (float)(position.Y + element.ActualHeight)); var p4 = new Vector2((float)position.X, (float)(position.Y + element.ActualHeight)); // Minimal distance float previousMinDistance = minDistance; minDistance = Math.Min(minDistance, (impostorPosition - p1).Length); minDistance = Math.Min(minDistance, (impostorPosition - p2).Length); minDistance = Math.Min(minDistance, (impostorPosition - p3).Length); minDistance = Math.Min(minDistance, (impostorPosition - p4).Length); if (minDistance != previousMinDistance) { nearestElement = element; } } // If a control is at a sufficient distance if (minDistance < MagneticRange || isMagnetized) { // Magnetic control found var position = nearestElement.TransformToAncestor(rootVisual).Transform(new Point(0, 0)); Canvas.SetLeft(impostor, position.X + nearestElement.ActualWidth / 2 - impostor.ActualWidth / 2); Canvas.SetTop(impostor, position.Y + nearestElement.ActualHeight / 2); lastKnownPosition = vector2; if (!isMagnetized || previousMagnetizedElement != nearestElement) { isMagnetized = true; magnetizationStartDate = DateTime.Now; } else { impostor.Progression = (int)(((DateTime.Now - magnetizationStartDate).TotalMilliseconds * 100) / 2000.0); } } else { Canvas.SetLeft(impostor, impostorPosition.X - impostor.ActualWidth / 2); Canvas.SetTop(impostor, impostorPosition.Y); } if (!isMagnetized) { lastKnownPosition = vector2; } previousMagnetizedElement = nearestElement; } else { action.mouseMove = true; action.dx = (int)((vector2.X - lastKnownPosition.Value.X) * Screen.PrimaryScreen.Bounds.Width * GlobalSmooth); action.dy = (int)((vector2.Y - lastKnownPosition.Value.Y) * Screen.PrimaryScreen.Bounds.Height * GlobalSmooth); MouseInterop.ControlMouse(action.dx, action.dy, permanentClick); lastKnownPosition = vector2; } previousDepth = joint.Position.Z; clickGestureDetected = false; return(action); }
void ProcessFrame(ReplaySkeletonFrame frame) { Dictionary <int, string> stabilities = new Dictionary <int, string>(); foreach (var skeleton in frame.Skeletons) { if (skeleton.TrackingState != SkeletonTrackingState.Tracked) { continue; } //if (eyeTracker == null) // eyeTracker = new EyeTracker(kinectSensor); //eyeTracker.Track(skeleton); contextTracker.Add(skeleton.Position.ToVector3(), skeleton.TrackingId); stabilities.Add(skeleton.TrackingId, contextTracker.IsStableRelativeToCurrentSpeed(skeleton.TrackingId) ? "Stable" : "Non stable"); if (!contextTracker.IsStableRelativeToCurrentSpeed(skeleton.TrackingId)) { continue; } //if (eyeTracker.IsLookingToSensor.HasValue && eyeTracker.IsLookingToSensor == false) // continue; foreach (Joint joint in skeleton.Joints) { if (joint.TrackingState != JointTrackingState.Tracked) { continue; } if (joint.JointType == JointType.HandRight) { if (controlMouse.IsChecked == true) { MouseControllerAction action = MouseController.Current.SetHandPosition(kinectSensor, joint, skeleton); // BroadcastManager.GetBroadcastEngine().ScheduleForBroadcasting(new JSonMouseInfo(action)); } } else if (joint.JointType == JointType.HandLeft) { swipeGestureRecognizer.Add(joint.Position, kinectSensor); circleGestureRecognizer.Add(joint.Position, kinectSensor); } } algorithmicPostureRecognizer.TrackPostures(skeleton); templatePostureDetector.TrackPostures(skeleton); if (recordNextFrameForPosture) { templatePostureDetector.AddTemplate(skeleton); recordNextFrameForPosture = false; } } skeletonDisplayManager.Draw(frame.Skeletons, seatedMode.IsChecked == true); stabilitiesList.ItemsSource = stabilities; }