private void TrackClosestSkeleton(Skeleton[] skeletons) { int closestID = 0; if (this.sensor != null && this.sensor.SkeletonStream != null) { if (!this.sensor.SkeletonStream.AppChoosesSkeletons) { this.sensor.SkeletonStream.AppChoosesSkeletons = true; // Ensure AppChoosesSkeletons is set } float closestDistance = 10000f; // Start with a far enough distance Skeleton closestSkeleton = null; foreach (Skeleton skeleton in skeletons.Where(s => s.TrackingState != SkeletonTrackingState.NotTracked)) { if (skeleton.Position.Z < closestDistance) { closestID = skeleton.TrackingId; closestDistance = skeleton.Position.Z; closestSkeleton = skeleton; } } if (closestID > 0) { if (currentSkeleton == null || currentSkeleton.TrackingId != closestSkeleton.TrackingId) { startDelayTimer.Restart(); leftHandChecker.Initialize(closestSkeleton); rightHandChecker.Initialize(closestSkeleton); } this.currentSkeleton = closestSkeleton; this.sensor.SkeletonStream.ChooseSkeletons(closestID); // Track this skeleton } else { this.currentSkeleton = null; if (kinectStrategy != null) { kinectStrategy.CurrentAcceleration = Vector2.Zero; } } } }