private void OnSkeletonUpdated(object sender, SkeletonFrameReadyEventArgs e) { // The live feed returns updates from the camera: var skeletonFrame = e.OpenSkeletonFrame(); if (skeletonFrame == null) { return; } // Add smoothing to prevent glitching in the skeletons' movements: var raw = new Skeleton[6]; skeletonFrame.CopySkeletonDataTo(raw); for (var i = 0; i < raw.Length; i++) { if (raw[i] == null) { continue; } if (Skeletons.Count <= i || Skeletons[i] == null) { // If this skeleton was just added then set it: var newSkeleton = new CustomSkeleton(); newSkeleton.Set(raw[i]); Skeletons.Add(newSkeleton); continue; } if (Smoothing > 0f) { // Set the state of the skeleton: Skeletons[i].State = raw[i].TrackingState; // Add smoothing interpolation to each point: foreach (Joint joint in raw[i].Joints) { var pos = new Vector3(); pos.X = Interpolate(Skeletons[i].Joints[joint.JointType].X, joint.Position.X, Smoothing); pos.Y = Interpolate(Skeletons[i].Joints[joint.JointType].Y, -joint.Position.Y, Smoothing); pos.Z = Interpolate(Skeletons[i].Joints[joint.JointType].Z, joint.Position.Z, Smoothing); Skeletons[i].Joints[joint.JointType] = pos; } } else { // Store the raw data for the skeleton: Skeletons[i].Set(raw[i]); } } skeletonFrame.Dispose(); if (raw != null && raw.Any(o => o.TrackingState == SkeletonTrackingState.Tracked)) { SkeletonActive = true; Debug_Skeleton = "Skeleton Found"; } else { SkeletonActive = false; Debug_Skeleton = "No Skeleton Found"; } }