Beispiel #1
0
        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);
                        }
                    }
                }
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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;
        }