private void KinectManager_FrameArrived(object sender, KinectFrameArrivedEventArgs e)
 {
     UpdateBodies(_KinectManager.KinectSensor, e.Bodies, e.FrameNumber);
 }
        private void KinectManager_FrameArrived(object sender, KinectFrameArrivedEventArgs e)
        {
            //Find body closest to centre of FoV
            double ClosestBodyDistance     = 3 * 3;
            ulong  ClosestBodyKey          = ulong.MaxValue;
            bool   EngagedBodyStillPresent = false;
            int    i = 0;

            foreach (var body in _BodyManager)
            {
                if (body.Value.IsOnScreen)
                {
                    // Ideal position is at X=0, Z=1.5
                    BodyDistance = body.Value.Joints[JointType.SpineShoulder].Position.X * body.Value.Joints[JointType.SpineShoulder].Position.X
                                   + (body.Value.Joints[JointType.SpineShoulder].Position.Z - 1.5) * (body.Value.Joints[JointType.SpineShoulder].Position.Z - 1.5);

                    if (BodyDistance < ClosestBodyDistance)
                    {
                        ClosestBodyDistance = BodyDistance;
                        ClosestBodyKey      = body.Value.TrackingId;
                    }
                }

                // This IF must always be tested!!
                if (body.Key == EngagedBodyKey) // Identifies the currently engaged body - to allow for it to be disengaged
                {
                    EngagedBodyStillPresent = true;
                }
                i++;
            }
            if (!EngagedBodyStillPresent)
            {
                EngagedBodyKey = ulong.MaxValue;
            }
            if (ClosestBodyKey == ulong.MaxValue || ClosestBodyKey == EngagedBodyKey)
            {
                //If no bodies fall within the max range
                // OR
                //If the closest body is the previously engaged body
                FramesEngaged = 0;
            }
            else
            {
                //If the closest body is NOT the previously engaged body
                //Then check if closest body is engaged (hand over spinemid) and if previously engaged body is a certain distance further than closest body

                Joint handLeft  = _BodyManager[ClosestBodyKey].Joints[JointType.HandLeft];
                Joint handRight = _BodyManager[ClosestBodyKey].Joints[JointType.HandRight];
                Joint spineMid  = _BodyManager[ClosestBodyKey].Joints[JointType.SpineMid];
                //Joint shoulderLeft = _BodyManager[ClosestBodyKey].Joints[JointType.ShoulderLeft];
                //Joint shoulderRight = _BodyManager[ClosestBodyKey].Joints[JointType.ShoulderRight];


                if (handLeft.IsTracked() && handRight.IsTracked() && spineMid.IsTracked())// && shoulderLeft.IsTracked() && shoulderRight.IsTracked())
                {
                    // If hand above hip and body facing sensor
                    if ((handLeft.Position.Y > spineMid.Position.Y || handRight.Position.Y > spineMid.Position.Y) && _BodyManager[ClosestBodyKey].IsFacingScreen)
                    {
                        // If there is a currently engaged body, then compare distances.
                        if (EngagedBodyKey < ulong.MaxValue)
                        {
                            if (_BodyManager[EngagedBodyKey].IsOnScreen)
                            {
                                BodyDistance = Math.Sqrt(_BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.X * _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.X +
                                                         _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.Z * _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.Z);

                                EngagedBodyDistance = Math.Sqrt(_BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.X * _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.X +
                                                                _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.Z * _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.Z);

                                if (EngagedBodyDistance - BodyDistance > MinPositionDifference)
                                {
                                    FramesEngaged++;
                                }
                                else
                                {
                                    FramesEngaged = 0;
                                }
                            }
                            else
                            {
                                FramesEngaged++;
                            }
                        }
                        else
                        {
                            FramesEngaged++;
                        }

                        if (FramesEngaged > MinFramesEngaged)
                        {
                            if (EngagedBodyKey < ulong.MaxValue)
                            {
                                RaiseDisengagedEventHandler(_BodyManager[EngagedBodyKey].TrackingId);
                            }
                            RaiseEngagedEventHandler(_BodyManager[ClosestBodyKey].TrackingId);
                            EngagedBodyKey = _BodyManager[ClosestBodyKey].TrackingId;
                            FramesEngaged  = 0;
                        }
                    }
                }
            }
        }
 private void KinectManager_FrameArrived(object sender, KinectFrameArrivedEventArgs e)
 {
 }